diff --git a/.changeset/beige-geckos-explode.md b/.changeset/beige-geckos-explode.md
new file mode 100644
index 00000000000..9f06a9c989b
--- /dev/null
+++ b/.changeset/beige-geckos-explode.md
@@ -0,0 +1,5 @@
+---
+"chainlink": minor
+---
+
+#updated Gracefully fail if CL_DATABASE_URL is not set.
diff --git a/.changeset/big-camels-report.md b/.changeset/big-camels-report.md
new file mode 100644
index 00000000000..f81f66b9138
--- /dev/null
+++ b/.changeset/big-camels-report.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+#bugfix fix non-idempotent loopp registry.Register
diff --git a/.changeset/brave-cooks-itch.md b/.changeset/brave-cooks-itch.md
new file mode 100644
index 00000000000..1ed3dd7e117
--- /dev/null
+++ b/.changeset/brave-cooks-itch.md
@@ -0,0 +1,5 @@
+---
+"chainlink": minor
+---
+
+#updated feat(job-distributor): support tron chain type on sync
diff --git a/.changeset/brave-frogs-greet.md b/.changeset/brave-frogs-greet.md
deleted file mode 100644
index 907e8f1ee75..00000000000
--- a/.changeset/brave-frogs-greet.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-update plugin and evm chainwriter to remove evmConfig dependency #updated
diff --git a/.changeset/breezy-suits-float.md b/.changeset/breezy-suits-float.md
deleted file mode 100644
index 60e061223d8..00000000000
--- a/.changeset/breezy-suits-float.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#added address book remove feature
diff --git a/.changeset/cool-feet-happen.md b/.changeset/cool-feet-happen.md
deleted file mode 100644
index 8d4aa22e79c..00000000000
--- a/.changeset/cool-feet-happen.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Ensure RPCClient with enabled polling respects health check flag #internal
diff --git a/.changeset/cool-owls-laugh.md b/.changeset/cool-owls-laugh.md
deleted file mode 100644
index a3667ed20e0..00000000000
--- a/.changeset/cool-owls-laugh.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-Bump to start the next version
diff --git a/.changeset/cyan-hairs-obey.md b/.changeset/cyan-hairs-obey.md
deleted file mode 100644
index 8bff6c8aad0..00000000000
--- a/.changeset/cyan-hairs-obey.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#added support enable and disable feed manager
diff --git a/.changeset/eighty-geckos-switch.md b/.changeset/eighty-geckos-switch.md
new file mode 100644
index 00000000000..b67dfb0ec79
--- /dev/null
+++ b/.changeset/eighty-geckos-switch.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+Reduce PriceMin on Avalanche to 1 gwei #nops
diff --git a/.changeset/famous-ligers-heal.md b/.changeset/famous-ligers-heal.md
deleted file mode 100644
index e469ea85785..00000000000
--- a/.changeset/famous-ligers-heal.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Set `NodePool.EnforceRepeatableRead = true` by default for all chains. This forces Core to stop using RPCs behind on the latest finalized block. #changed #nops
diff --git a/.changeset/few-sloths-explain.md b/.changeset/few-sloths-explain.md
deleted file mode 100644
index 78efd6cc7f3..00000000000
--- a/.changeset/few-sloths-explain.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#updated ignoring tx type 126 on celo
diff --git a/.changeset/five-gifts-end.md b/.changeset/five-gifts-end.md
new file mode 100644
index 00000000000..dd13fda476d
--- /dev/null
+++ b/.changeset/five-gifts-end.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+#added stream job delete capability
diff --git a/.changeset/forty-foxes-watch.md b/.changeset/forty-foxes-watch.md
deleted file mode 100644
index cb118d50021..00000000000
--- a/.changeset/forty-foxes-watch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-Updated Solana TXM's in-memory storage to track statuses across the Solana transaction lifecycle. Added a method to translate Solana transaction statuses into states expected by the ChainWriter interface. Made the duration transactions are retained in storage after finality or error configurable using `TxRetentionTimeout`. #added
diff --git a/.changeset/four-kangaroos-appear.md b/.changeset/four-kangaroos-appear.md
deleted file mode 100644
index b8ef32ff69e..00000000000
--- a/.changeset/four-kangaroos-appear.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Add config validation so it requires ws url when http polling disabled #bugfix
diff --git a/.changeset/fresh-boxes-taste.md b/.changeset/fresh-boxes-taste.md
deleted file mode 100644
index ab68bdb5cfc..00000000000
--- a/.changeset/fresh-boxes-taste.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-Implement secrets interpolation with dummy workflow registry syncer #internal
diff --git a/.changeset/fresh-lobsters-fly.md b/.changeset/fresh-lobsters-fly.md
new file mode 100644
index 00000000000..12b9c317dcb
--- /dev/null
+++ b/.changeset/fresh-lobsters-fly.md
@@ -0,0 +1,5 @@
+---
+"chainlink": minor
+---
+
+#internal Refactored ChainComponents tests to run in parallel
diff --git a/.changeset/friendly-tigers-argue.md b/.changeset/friendly-tigers-argue.md
new file mode 100644
index 00000000000..25aff7e13ae
--- /dev/null
+++ b/.changeset/friendly-tigers-argue.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+#internal change gethwrapper to allow for foundry based gethwrapper generation
diff --git a/.changeset/fuzzy-dodos-travel.md b/.changeset/fuzzy-dodos-travel.md
deleted file mode 100644
index 8c79beb73d4..00000000000
--- a/.changeset/fuzzy-dodos-travel.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#changed UI(chainconfig): make admin address optional
diff --git a/.changeset/giant-cats-run.md b/.changeset/giant-cats-run.md
deleted file mode 100644
index 22a0cde247d..00000000000
--- a/.changeset/giant-cats-run.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#internal Add tokenDestGasOverhead to CalculateMessageMaxGas
diff --git a/.changeset/giant-eels-jump.md b/.changeset/giant-eels-jump.md
new file mode 100644
index 00000000000..5ab8ca875ca
--- /dev/null
+++ b/.changeset/giant-eels-jump.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+Add error handling for Arbitrum RPC server timeouts. #added
diff --git a/.changeset/good-chairs-boil.md b/.changeset/good-chairs-boil.md
deleted file mode 100644
index ead73f68103..00000000000
--- a/.changeset/good-chairs-boil.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#added Enable and Disable Feeds Manager mutations
diff --git a/.changeset/good-roses-smash.md b/.changeset/good-roses-smash.md
deleted file mode 100644
index 3efa2dd439f..00000000000
--- a/.changeset/good-roses-smash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#internal Fix Contract Reader data word index calculation and change ccip contract reader config for more optimal querying.
diff --git a/.changeset/great-spiders-greet.md b/.changeset/great-spiders-greet.md
deleted file mode 100644
index cd8e20a32a6..00000000000
--- a/.changeset/great-spiders-greet.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Fixed outdated headtracker config doc. #internal
diff --git a/.changeset/happy-tips-nail.md b/.changeset/happy-tips-nail.md
deleted file mode 100644
index ad42dc47beb..00000000000
--- a/.changeset/happy-tips-nail.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#updated bump CTF to v1.50.13, more robust ethereum client compatibility pipeline
diff --git a/.changeset/healthy-shirts-remain.md b/.changeset/healthy-shirts-remain.md
deleted file mode 100644
index 0ce310e1ce3..00000000000
--- a/.changeset/healthy-shirts-remain.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#removed Remove unused deprecated key interfaces.
diff --git a/.changeset/hip-clocks-joke.md b/.changeset/hip-clocks-joke.md
deleted file mode 100644
index 21f53718b22..00000000000
--- a/.changeset/hip-clocks-joke.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#internal OracleFactory error handling change
diff --git a/.changeset/honest-bugs-grin.md b/.changeset/honest-bugs-grin.md
deleted file mode 100644
index 7d3ff3c7848..00000000000
--- a/.changeset/honest-bugs-grin.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-"chainlink": minor
----
-
-#updated
-update ethkeys, ethtransactions to handle duplicate chain id in different network
-introduce network arg input to Chain graphql query to allow better lookup based on network and chain id
diff --git a/.changeset/hot-mice-yell.md b/.changeset/hot-mice-yell.md
deleted file mode 100644
index 9d170e1f15c..00000000000
--- a/.changeset/hot-mice-yell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Relocation of the deployment directory into a direct subdir of the root. #internal
diff --git a/.changeset/hot-pants-clean.md b/.changeset/hot-pants-clean.md
deleted file mode 100644
index efd9a85baa3..00000000000
--- a/.changeset/hot-pants-clean.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Minor fixes to the CCIPChainReader enabling proper serialization #internal
diff --git a/.changeset/large-fishes-enjoy.md b/.changeset/large-fishes-enjoy.md
new file mode 100644
index 00000000000..201267e8b64
--- /dev/null
+++ b/.changeset/large-fishes-enjoy.md
@@ -0,0 +1,5 @@
+---
+"chainlink": minor
+---
+
+Fix logic for mapping affected files in CI that affects golangci-lint execution
diff --git a/.changeset/late-windows-clean.md b/.changeset/late-windows-clean.md
deleted file mode 100644
index 261747efa6c..00000000000
--- a/.changeset/late-windows-clean.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-"chainlink": minor
----
-
-#internal Updated the TXM confirmation logic to use the mined transaction count to identify re-org'd or confirmed transactions.
-
-- Confirmer uses the mined transaction count to determine if transactions have been re-org'd or confirmed.
-- Confirmer no longer sets transaction states to `confirmed_missing_receipt`. This state is maintained in queries for backwards compatibility.
-- Finalizer now responsible for fetching and storing receipts for confirmed transactions.
-- Finalizer now responsible for resuming pending task runs.
-- Finalizer now responsible for marking old transactions without receipts broadcasted before the finalized head as fatal.
diff --git a/.changeset/lemon-ads-fix.md b/.changeset/lemon-ads-fix.md
deleted file mode 100644
index f7f3438eb23..00000000000
--- a/.changeset/lemon-ads-fix.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#added Handle Hex String in EA Telemetry
diff --git a/.changeset/lovely-glasses-film.md b/.changeset/lovely-glasses-film.md
deleted file mode 100644
index 2289c2c0a67..00000000000
--- a/.changeset/lovely-glasses-film.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-Use correct OCR2OracleSpecID when setting up RequestedRoundTracker #bugfix
diff --git a/.changeset/many-carrots-share.md b/.changeset/many-carrots-share.md
deleted file mode 100644
index da22ac6ed4f..00000000000
--- a/.changeset/many-carrots-share.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#internal Update ccip contract reader cfg for ccip message sent to use output codec wrapper modifier
diff --git a/.changeset/mean-ravens-stare.md b/.changeset/mean-ravens-stare.md
new file mode 100644
index 00000000000..6b481ae4520
--- /dev/null
+++ b/.changeset/mean-ravens-stare.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+#internal add versioned geth wrappers for keystone prod contracts
diff --git a/.changeset/metal-forks-arrive.md b/.changeset/metal-forks-arrive.md
deleted file mode 100644
index 21b99b3ddb1..00000000000
--- a/.changeset/metal-forks-arrive.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Adds new custom calldata DA oracle #added
diff --git a/.changeset/metal-houses-approve.md b/.changeset/metal-houses-approve.md
new file mode 100644
index 00000000000..6768c50767e
--- /dev/null
+++ b/.changeset/metal-houses-approve.md
@@ -0,0 +1,5 @@
+---
+"chainlink": minor
+---
+
+Added TxExpirationRebroadcast feature and config for Solana TXM. #added
diff --git a/.changeset/neat-singers-notice.md b/.changeset/neat-singers-notice.md
deleted file mode 100644
index 6eff83c0c15..00000000000
--- a/.changeset/neat-singers-notice.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-Added multiple blocks history estimator feature and config for Solana TXM. #added
diff --git a/.changeset/nine-stingrays-march.md b/.changeset/nine-stingrays-march.md
deleted file mode 100644
index c2f88d95663..00000000000
--- a/.changeset/nine-stingrays-march.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-Add don_id to Mercury Enhanced EA telemetry #added
diff --git a/.changeset/perfect-peaches-work.md b/.changeset/perfect-peaches-work.md
deleted file mode 100644
index 9a3b461e1c9..00000000000
--- a/.changeset/perfect-peaches-work.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Fix flaky WS test server #internal
diff --git a/.changeset/purple-seas-help.md b/.changeset/purple-seas-help.md
deleted file mode 100644
index 01f8b0049b6..00000000000
--- a/.changeset/purple-seas-help.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#removed unused key files and move public_key test file.
diff --git a/.changeset/purple-shrimps-invent.md b/.changeset/purple-shrimps-invent.md
deleted file mode 100644
index 3db195434de..00000000000
--- a/.changeset/purple-shrimps-invent.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Upgrade go-ethereum to v1.14.11 #internal
diff --git a/.changeset/rotten-timers-give.md b/.changeset/rotten-timers-give.md
deleted file mode 100644
index ef474a17d56..00000000000
--- a/.changeset/rotten-timers-give.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"chainlink": minor
----
-
-Support multiple chains evm clients for TXM gas estimator to fetch L1 gas oracle
-#added
diff --git a/.changeset/rude-geckos-switch.md b/.changeset/rude-geckos-switch.md
deleted file mode 100644
index 866b1c40c63..00000000000
--- a/.changeset/rude-geckos-switch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#bugfix Update Log.Level and MaxSize configs description in the docs
diff --git a/.changeset/seven-schools-invent.md b/.changeset/seven-schools-invent.md
deleted file mode 100644
index 81b6ce44b99..00000000000
--- a/.changeset/seven-schools-invent.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Integration tests for USDC token transfer #internal
diff --git a/.changeset/shaggy-carpets-deliver.md b/.changeset/shaggy-carpets-deliver.md
new file mode 100644
index 00000000000..676ad2fb861
--- /dev/null
+++ b/.changeset/shaggy-carpets-deliver.md
@@ -0,0 +1,5 @@
+---
+"chainlink": minor
+---
+
+#removed dead transmission tests
diff --git a/.changeset/short-gifts-eat.md b/.changeset/short-gifts-eat.md
deleted file mode 100644
index afc171715d4..00000000000
--- a/.changeset/short-gifts-eat.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-use last mined nonce instead of pending nonce to recover from occasional nonce gap issues within nonce tracker. #internal
diff --git a/.changeset/silent-goats-jog.md b/.changeset/silent-goats-jog.md
deleted file mode 100644
index 3428ee20b17..00000000000
--- a/.changeset/silent-goats-jog.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Fix HeadTracker tests caused by simulated client update #internal
diff --git a/.changeset/six-wombats-shake.md b/.changeset/six-wombats-shake.md
deleted file mode 100644
index 448cf03bd51..00000000000
--- a/.changeset/six-wombats-shake.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-CCIP token transfer integration tests #internal
diff --git a/.changeset/sixty-queens-wait.md b/.changeset/sixty-queens-wait.md
deleted file mode 100644
index cd9fc9ea65c..00000000000
--- a/.changeset/sixty-queens-wait.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#updated chain config: allow chain id and account address to be manually provided when no selections are available
diff --git a/.changeset/small-gifts-play.md b/.changeset/small-gifts-play.md
deleted file mode 100644
index a9486a033ef..00000000000
--- a/.changeset/small-gifts-play.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#updated Operator UI to support StreamSpec job definition
diff --git a/.changeset/sour-hairs-cross.md b/.changeset/sour-hairs-cross.md
new file mode 100644
index 00000000000..fa12a38b5be
--- /dev/null
+++ b/.changeset/sour-hairs-cross.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+#internal depreciate keystone deployment library
diff --git a/.changeset/strange-radios-teach.md b/.changeset/strange-radios-teach.md
deleted file mode 100644
index ea84bfbf359..00000000000
--- a/.changeset/strange-radios-teach.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Merge raw configs correctly #bugfix
diff --git a/.changeset/swift-fireants-compare.md b/.changeset/swift-fireants-compare.md
deleted file mode 100644
index b11c516e7c3..00000000000
--- a/.changeset/swift-fireants-compare.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-Add CSA authentication support to Beholder #added
diff --git a/.changeset/tame-tomatoes-refuse.md b/.changeset/tame-tomatoes-refuse.md
deleted file mode 100644
index 530f9d2b519..00000000000
--- a/.changeset/tame-tomatoes-refuse.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#added feat: support creating solana chain config in job distributor page
diff --git a/.changeset/tasty-years-behave.md b/.changeset/tasty-years-behave.md
deleted file mode 100644
index 08019e3dafa..00000000000
--- a/.changeset/tasty-years-behave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Modify release changelog generation format #internal
diff --git a/.changeset/tender-colts-return.md b/.changeset/tender-colts-return.md
deleted file mode 100644
index 16c0b2da1ff..00000000000
--- a/.changeset/tender-colts-return.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#updated celo alfajores config
diff --git a/.changeset/thick-chefs-deliver.md b/.changeset/thick-chefs-deliver.md
deleted file mode 100644
index 67d68d22792..00000000000
--- a/.changeset/thick-chefs-deliver.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Enable AutoPurge feature on all affected chains #nops
diff --git a/.changeset/three-mayflies-learn.md b/.changeset/three-mayflies-learn.md
deleted file mode 100644
index 1ea4fad3924..00000000000
--- a/.changeset/three-mayflies-learn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": minor
----
-
-#updated Update few incorrect occurences of the password for notreal@fakeemail.ch.
diff --git a/.changeset/tricky-candles-matter.md b/.changeset/tricky-candles-matter.md
deleted file mode 100644
index 0dc7806703a..00000000000
--- a/.changeset/tricky-candles-matter.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#bugfix Memory leak fix on promwrapper
diff --git a/.changeset/two-spies-arrive.md b/.changeset/two-spies-arrive.md
deleted file mode 100644
index cb46c46bce6..00000000000
--- a/.changeset/two-spies-arrive.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-#updated Use labelers from `chainlink-common`
diff --git a/.changeset/weak-weeks-grin.md b/.changeset/weak-weeks-grin.md
deleted file mode 100644
index df03df2303c..00000000000
--- a/.changeset/weak-weeks-grin.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"chainlink": patch
----
-
-Bump Solana to include MultiNode integration. #added
diff --git a/.changeset/wild-cats-think.md b/.changeset/wild-cats-think.md
new file mode 100644
index 00000000000..f56f41b242c
--- /dev/null
+++ b/.changeset/wild-cats-think.md
@@ -0,0 +1,5 @@
+---
+"chainlink": minor
+---
+
+Added the `EVM.Transactions.Enabled` config to enable or disable the transaction manager. #added
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index c2d6208d0e3..9f19d52b7ea 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -13,7 +13,7 @@
# Services
/core/services/directrequest @smartcontractkit/foundations
-/core/services/feeds @smartcontractkit/deployment-automation @eutopian @yevshev @smartcontractkit/core
+/core/services/feeds @smartcontractkit/deployment-automation @eutopian @smartcontractkit/core
/core/services/synchronization/telem @smartcontractkit/realtime @smartcontractkit/core
/core/capabilities/ @smartcontractkit/keystone @smartcontractkit/capabilities-team
/core/capabilities/ccip @smartcontractkit/ccip-offchain
@@ -140,8 +140,8 @@ core/scripts/gateway @smartcontractkit/dev-services
# Deployment tooling
/deployment @smartcontractkit/ccip @smartcontractkit/keystone @smartcontractkit/core @smartcontractkit/deployment-automation
-/deployment/ccip @smartcontractkit/ccip @smartcontractkit/core
-/deployment/keystone @smartcontractkit/keystone @smartcontractkit/core
+/deployment/ccip @smartcontractkit/ccip @smartcontractkit/core @smartcontractkit/deployment-automation
+/deployment/keystone @smartcontractkit/keystone @smartcontractkit/core @smartcontractkit/deployment-automation
# TODO: As more products add their deployment logic here, add the team as an owner
# CI/CD
diff --git a/.github/actions/build-sign-publish-chainlink/action.yml b/.github/actions/build-sign-publish-chainlink/action.yml
index b0e70b742d5..24d9884d7f7 100644
--- a/.github/actions/build-sign-publish-chainlink/action.yml
+++ b/.github/actions/build-sign-publish-chainlink/action.yml
@@ -210,12 +210,12 @@ runs:
IMAGES_NAME_RAW=${{ fromJSON(steps.buildpush-nonroot.outputs.metadata)['image.name'] }}
IMAGE_DIGEST=${{ fromJSON(steps.buildpush-nonroot.outputs.metadata)['containerimage.digest'] }}
IMAGE_NAME=$(echo "$IMAGES_NAME_RAW" | cut -d"," -f1)
- IMAGE_TAG=$(echo "$IMAGES_NAME_RAW" | cut -d":" -f2)
+ IMAGE_TAG=$(echo "$IMAGE_NAME" | cut -d":" -f2)
echo "nonroot_image_name=${IMAGE_NAME}" >> $GITHUB_ENV
echo "nonroot_image_digest=${IMAGE_DIGEST}" >> $GITHUB_ENV
echo '### Docker Image' >> $GITHUB_STEP_SUMMARY
- echo "Image Name: ${IMAGE_NAME}" >> $GITHUB_STEP_SUMMARY
- echo "Image Digest: ${IMAGE_DIGEST}" >> $GITHUB_STEP_SUMMARY
+ echo "Image Name: ${IMAGE_NAME}" >> $GITHUB_STEP_SUMMARY
+ echo "Image Digest: ${IMAGE_DIGEST}" >> $GITHUB_STEP_SUMMARY
echo "image-tag=${IMAGE_TAG}" >> $GITHUB_OUTPUT
echo "image-digest=${IMAGE_DIGEST}" >> $GITHUB_OUTPUT
diff --git a/.github/actions/crib/action.yml b/.github/actions/crib/action.yml
new file mode 100644
index 00000000000..79715cca0d2
--- /dev/null
+++ b/.github/actions/crib/action.yml
@@ -0,0 +1,156 @@
+name: "CRIB Action"
+description: "Spin up a CRIB environment. Optionally run tests and tear it down."
+
+inputs:
+ aws-role-duration-seconds:
+ description: "Duration in seconds for AWS role"
+ required: false
+ default: "3600"
+ aws-role-arn:
+ description: "AWS Role ARN for CRIB"
+ required: true
+ aws-region:
+ description: "AWS Region"
+ required: true
+ aws-account-id:
+ description: "AWS Account ID"
+ required: true
+ api-gw-host-crib:
+ description: "API Gateway Host for CRIB"
+ required: true
+ api-gw-host-k8s:
+ description: "API Gateway Host for K8s"
+ required: true
+ k8s-api-endpoint:
+ description: "Kubernetes API endpoint"
+ required: true
+ k8s-cluster-name:
+ description: "Kubernetes cluster name"
+ required: true
+ aws-token-issuer-role-arn:
+ description: "AWS Role ARN for token issuer"
+ required: true
+ aws-token-issuer-lambda-url:
+ description: "AWS Lambda URL for token issuer"
+ required: true
+ ingress-base-domain:
+ description: "Ingress base domain"
+ required: true
+ k8s-staging-ingress-suffix:
+ description: "K8S staging ingress suffix"
+ required: true
+ gap-url-integration-tests:
+ description: "GAP URL for integration tests"
+ required: true
+ crib-alert-slack-webhook:
+ description: "CRIB alert Slack webhook"
+ required: true
+ crib-chainlink-docker-image-name:
+ description: "Docker image name"
+ required: true
+ crib-chainlink-docker-image-tag:
+ description: "Docker image tag"
+ required: true
+ crib-cleanup-ttl:
+ # See: https://kyverno.io/docs/writing-policies/cleanup/
+ description: "Time to keep environment up for before destroying it. Examples: 15m, 1h, 3d"
+ required: false
+ default: "1h"
+ crib-destroy-environment:
+ description: "Whether to destroy the CRIB environment after testing"
+ required: false
+ default: "true"
+ integration-tests-run:
+ description: "Whether to run integration tests"
+ required: false
+ default: "true"
+
+runs:
+ using: "composite"
+ steps:
+ - uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27
+ with:
+ nix_path: nixpkgs=channel:nixos-unstable
+
+ - name: setup-gap crib
+ uses: smartcontractkit/.github/actions/setup-gap@00b58566e0ee2761e56d9db0ea72b783fdb89b8d # setup-gap@0.4.0
+ with:
+ aws-role-duration-seconds: ${{ inputs.aws-role-duration-seconds }}
+ aws-role-arn: ${{ inputs.aws-role-arn }}
+ api-gateway-host: ${{ inputs.api-gw-host-crib }}
+ aws-region: ${{ inputs.aws-region }}
+ ecr-private-registry: ${{ inputs.aws-account-id }}
+ k8s-cluster-name: ${{ inputs.k8s-cluster-name }}
+ gap-name: crib
+ use-private-ecr-registry: true
+ use-tls: true
+ proxy-port: 8080
+
+ - name: setup-gap k8s
+ uses: smartcontractkit/.github/actions/setup-gap@00b58566e0ee2761e56d9db0ea72b783fdb89b8d # setup-gap@0.4.0
+ with:
+ aws-role-duration-seconds: ${{ inputs.aws-role-duration-seconds }}
+ aws-role-arn: ${{ inputs.aws-role-arn }}
+ api-gateway-host: ${{ inputs.api-gw-host-k8s }}
+ aws-region: ${{ inputs.aws-region }}
+ ecr-private-registry: ${{ inputs.aws-account-id }}
+ k8s-cluster-name: ${{ inputs.k8s-cluster-name }}
+ gap-name: k8s
+ use-private-ecr-registry: true
+ use-k8s: true
+ proxy-port: 8443
+
+ - name: Setup GitHub token using GATI
+ id: token
+ uses: smartcontractkit/.github/actions/setup-github-token@ef78fa97bf3c77de6563db1175422703e9e6674f # setup-github-token@0.2.1
+ with:
+ aws-role-arn: ${{ inputs.aws-token-issuer-role-arn }}
+ aws-lambda-url: ${{ inputs.aws-token-issuer-lambda-url }}
+ aws-region: ${{ inputs.aws-region }}
+ aws-role-duration-seconds: "1800"
+
+ - name: Deploy and validate CRIB Environment for Core
+ uses: smartcontractkit/.github/actions/crib-deploy-environment@815e0d550527897746e889441407926d7e28169c # crib-deploy-environment@7.4.0
+ id: deploy-crib
+ with:
+ github-token: ${{ steps.token.outputs.access-token }}
+ aws-ecr-private-registry: ${{ inputs.aws-account-id }}
+ aws-region: ${{ inputs.aws-region }}
+ aws-role-arn: ${{ inputs.aws-role-arn }}
+ ingress-base-domain: ${{ inputs.ingress-base-domain }}
+ k8s-api-endpoint: ${{ inputs.k8s-api-endpoint }}
+ k8s-cluster-name: ${{ inputs.k8s-cluster-name }}
+ chainlink-team: releng
+ chainlink-product: crib
+ command: "core-dev-simulated-core-ocr1"
+ crib-alert-slack-webhook: ${{ inputs.crib-alert-slack-webhook }}
+ product-image: ${{ inputs.crib-chainlink-docker-image-name }}
+ product-image-tag: ${{ inputs.crib-chainlink-docker-image-tag }}
+ ns-ttl: ${{ inputs.crib-cleanup-ttl }}
+
+ - name: Set up Go
+ uses: ./.github/actions/setup-go
+ with:
+ go-version-file: "go.mod"
+
+ - name: Run CRIB integration test
+ if: inputs.integration-tests-run == 'true'
+ shell: bash
+ working-directory: integration-tests/crib
+ env:
+ K8S_STAGING_INGRESS_SUFFIX: ${{ inputs.k8s-staging-ingress-suffix }}
+ CRIB_NAMESPACE: ${{ steps.deploy-crib.outputs.devspace-namespace }}
+ CRIB_NETWORK: geth
+ CRIB_NODES: 5
+ GAP_URL: ${{ inputs.gap-url-integration-tests }}
+ SETH_LOG_LEVEL: info
+ TEST_PERSISTENCE: true
+ E2E_TEST_CHAINLINK_IMAGE: public.ecr.aws/chainlink/chainlink
+ E2E_TEST_CHAINLINK_VERSION: latest
+ run: go test -v -run TestCRIBChaos
+
+ - name: Destroy CRIB Environment
+ if: inputs.crib-destroy-environment == 'true' && always() && steps.deploy-crib.outputs.devspace-namespace != ''
+ uses: smartcontractkit/.github/actions/crib-purge-environment@142671bc21953c8cc3edbd21848c50b5ec201c2a # crib-purge-environment@0.3.0
+ with:
+ namespace: ${{ steps.deploy-crib.outputs.devspace-namespace }}
diff --git a/.github/actions/golangci-lint/action.yml b/.github/actions/golangci-lint/action.yml
index 20ad2689deb..8fa3e1775d0 100644
--- a/.github/actions/golangci-lint/action.yml
+++ b/.github/actions/golangci-lint/action.yml
@@ -26,12 +26,16 @@ runs:
# Only do a full checkout on merge_groups
if: github.event_name == 'merge_group'
with:
+ persist-credentials: false
fetch-depth: 0
+
- name: Checkout repo
uses: actions/checkout@v4.2.1
if: github.event_name != 'merge_group'
with:
+ persist-credentials: false
fetch-depth: 1
+
- name: Setup Go
uses: ./.github/actions/setup-go
with:
@@ -39,38 +43,66 @@ runs:
cache-version: ${{ inputs.cache-version }}
go-version-file: ${{ inputs.go-version-file }}
go-module-file: ${{ inputs.go-module-file }}
+
- name: Touching core/web/assets/index.html
shell: bash
run: mkdir -p core/web/assets && touch core/web/assets/index.html
- - name: Build binary
- working-directory: ${{ inputs.go-directory }}
- shell: bash
- run: go build ./...
- - name: Set golangci-lint working directory
+
+ - name: Set Golangci-lint working directory
shell: bash
id: set-working-directory
# XXX: Don't use `.` default working directory here due to issues with the golangci-lint-action.
run: |
if [ "${{ inputs.go-directory }}" == "." ]; then
- echo "golangci-lint-working-directory=" | tee -a $GITHUB_OUTPUT
+ echo "golangci-lint-working-directory=" >> $GITHUB_OUTPUT
else
- echo "golangci-lint-working-directory=${{ inputs.go-directory }}" | tee -a $GITHUB_OUTPUT
+ echo "golangci-lint-working-directory=${{ inputs.go-directory }}/" >> $GITHUB_OUTPUT
fi
- - name: golangci-lint
+
+ - name: Golangci-lint
uses: golangci/golangci-lint-action@38e1018663fa5173f3968ea0777460d3de38f256 # v5.3.0
with:
- version: v1.61.0
+ version: v1.62.2
only-new-issues: true
args: --out-format colored-line-number,checkstyle:golangci-lint-report.xml
working-directory: ${{ steps.set-working-directory.outputs.golangci-lint-working-directory }}
- - name: Print lint report artifact
+
+ - name: Print Golangci-lint report results
if: failure()
shell: bash
- run: cat ${{ inputs.go-directory }}/golangci-lint-report.xml
- - name: Store lint report artifact
+ run: cat ./${{ steps.set-working-directory.outputs.golangci-lint-working-directory }}golangci-lint-report.xml
+
+ # Get a valid name for the upload-artifact step.
+ # Avoid error: `The artifact name is not valid: ///` caused by `/`.
+ # Remove trailing `/` from the directory name: `core/scripts/` -> `core/scripts`.
+ # Replace remaining `/` with `-`: `core/scripts` -> `core-scripts`.
+ # Assign `root` if the directory name is empty (ref: step.id: set-working-directory).
+ - name: Get valid suffix for artifact name
+ if: always()
+ id: suffix
+ shell: bash
+ run: |
+ go_directory=${{ steps.set-working-directory.outputs.golangci-lint-working-directory }}
+ echo "Validating if directory name '$go_directory' is empty or has slashes"
+
+ if [[ $go_directory == *\/* ]]; then
+ suffix=$(echo "$go_directory" | sed 's:\/$::' | tr '/' '-')
+ echo "Directory name with slashes '$go_directory' updated to a valid artifact suffix '$suffix'"
+ elif [[ $go_directory == "" ]]; then
+ suffix="root"
+ echo "Root directory (empty string) updated to a valid artifact suffix '$suffix'"
+ else
+ suffix="$go_directory"
+ echo "Directory name is valid for the artifact suffix: '$suffix'"
+ fi
+
+ echo "suffix=${suffix}" >> $GITHUB_OUTPUT
+
+ - name: Store Golangci-lint report artifact
if: always()
uses: actions/upload-artifact@v4.4.3
with:
- name: golangci-lint-report
- path: ${{ inputs.go-directory }}/golangci-lint-report.xml
- retention-days: 7
+ # Use a unique suffix for each lint report artifact to avoid duplication errors
+ name: golangci-lint-report-${{ steps.suffix.outputs.suffix }}
+ # N/B: value may be empty (no slash) OR `///` (with slash tat the end)
+ path: ./${{ steps.set-working-directory.outputs.golangci-lint-working-directory }}golangci-lint-report.xml
diff --git a/.github/actions/goreleaser-build-sign-publish/README.md b/.github/actions/goreleaser-build-sign-publish/README.md
index afea60e1203..9b520c1741a 100644
--- a/.github/actions/goreleaser-build-sign-publish/README.md
+++ b/.github/actions/goreleaser-build-sign-publish/README.md
@@ -24,6 +24,8 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Configure aws credentials
uses: aws-actions/configure-aws-credentials@010d0da01d0b5a38af31e9c3470dbfdabdecca3a # v4.0.1
with:
diff --git a/.github/actions/detect-solidity-foundry-version/action.yml b/.github/actions/install-solidity-foundry/action.yml
similarity index 72%
rename from .github/actions/detect-solidity-foundry-version/action.yml
rename to .github/actions/install-solidity-foundry/action.yml
index b37f1e25094..aabd874826e 100644
--- a/.github/actions/detect-solidity-foundry-version/action.yml
+++ b/.github/actions/install-solidity-foundry/action.yml
@@ -1,5 +1,5 @@
-name: 'Detect Foundry version in GNUmakefile'
-description: 'Detects Foundry version in GNUmakefile'
+name: 'Install Foundry version in GNUmakefile'
+description: 'Install Foundry version in GNUmakefile'
inputs:
working-directory:
description: 'The GNUmakefile directory'
@@ -24,3 +24,8 @@ runs:
fi
echo "Foundry version found: $foundry_version"
echo "foundry-version=$foundry_version" >> $GITHUB_OUTPUT
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@8f1998e9878d786675189ef566a2e4bf24869773 # v1.2.0
+ with:
+ version: ${{ steps.extract-foundry-version.outputs.foundry-version }}
diff --git a/.github/actions/setup-go/action.yml b/.github/actions/setup-go/action.yml
index ddd4e28e461..9d395795764 100644
--- a/.github/actions/setup-go/action.yml
+++ b/.github/actions/setup-go/action.yml
@@ -29,10 +29,22 @@ inputs:
runs:
using: composite
steps:
+ - name: Get Go Version
+ shell: bash
+ id: go-version
+ run: |
+ version=$(sed -ne '/^toolchain /s/^toolchain go//p' ${{ inputs.go-version-file }})
+ if [ -z "$version" ]; then
+ version=$(sed -ne '/^go /s/^go //p' ${{ inputs.go-version-file }})
+ echo "Toolchain version not found in ${{ inputs.go-version-file }}, using go directive instead."
+ fi
+ echo "Go Version: $version"
+ echo "version=$version" >> "$GITHUB_OUTPUT"
+
- name: Set up Go
uses: actions/setup-go@v5.0.2
with:
- go-version-file: ${{ inputs.go-version-file }}
+ go-version: ${{ steps.go-version.outputs.version }}
cache: false
check-latest: true
@@ -57,7 +69,7 @@ runs:
# If multiple jobs call actions/cache, then only one will get priority to create upon a cache miss.
# We will only restore the cache by default (by calling actions/cache/restore) and let the
# `go-mod-cache.yml` workflow handle the creation.
- - uses: actions/cache/restore@v4.1.1
+ - uses: actions/cache/restore@v4
if: ${{ inputs.restore-module-cache-only == 'true' }}
name: Cache Go Modules
with:
@@ -71,7 +83,7 @@ runs:
# If this is called, then it will create the cache entry upon a cache miss.
# The cache is created after a cache miss, and after job completes successfully.
- - uses: actions/cache@v4.1.1
+ - uses: actions/cache@v4
if: ${{ inputs.restore-module-cache-only != 'true' }}
name: Cache Go Modules
with:
@@ -83,7 +95,7 @@ runs:
restore-keys: |
${{ runner.os }}-gomod-${{ inputs.cache-version }}-
- - uses: actions/cache/restore@v4.1.1
+ - uses: actions/cache/restore@v4
name: Cache Go Build Outputs (restore)
# For certain events, we don't necessarily want to create a build cache, but we will benefit from restoring from one.
if: ${{ inputs.only-modules == 'false' && (github.event_name == 'merge_group' || inputs.restore-build-cache-only == 'true') }}
@@ -97,7 +109,7 @@ runs:
${{ runner.os }}-gobuild-${{ inputs.build-cache-version || inputs.cache-version }}-
${{ runner.os }}-gobuild-${{ inputs.cache-version }}-
- - uses: actions/cache@v4.1.1
+ - uses: actions/cache@v4
# don't save cache on merge queue events
if: ${{ inputs.only-modules == 'false' && (github.event_name != 'merge_group' && inputs.restore-build-cache-only == 'false') }}
name: Cache Go Build Outputs
diff --git a/.github/actions/setup-hardhat/action.yaml b/.github/actions/setup-hardhat/action.yaml
index a61e61bb5c7..03b7fef90bb 100644
--- a/.github/actions/setup-hardhat/action.yaml
+++ b/.github/actions/setup-hardhat/action.yaml
@@ -11,13 +11,13 @@ runs:
using: composite
steps:
- name: Cache Compilers
- uses: actions/cache@v4.1.1
+ uses: actions/cache@v4
with:
path: ~/.cache/hardhat-nodejs/
key: contracts-compilers-${{ runner.os }}-${{ inputs.cache-version }}-${{ hashFiles('contracts/pnpm-lock.yaml', 'contracts/hardhat.config.ts') }}
- name: Cache contracts build outputs
- uses: actions/cache@v4.1.1
+ uses: actions/cache@v4
with:
path: |
contracts/cache/
diff --git a/.github/actions/setup-solana/action.yml b/.github/actions/setup-solana/action.yml
index de7c4331abc..e353636f805 100644
--- a/.github/actions/setup-solana/action.yml
+++ b/.github/actions/setup-solana/action.yml
@@ -8,7 +8,7 @@ inputs:
runs:
using: composite
steps:
- - uses: actions/cache@v4.1.1
+ - uses: actions/cache@v4
id: cache
name: Cache solana CLI
with:
diff --git a/.github/actions/setup-wasmd/action.yml b/.github/actions/setup-wasmd/action.yml
index d95e8129260..c1969e82652 100644
--- a/.github/actions/setup-wasmd/action.yml
+++ b/.github/actions/setup-wasmd/action.yml
@@ -8,7 +8,7 @@ inputs:
runs:
using: composite
steps:
- - uses: actions/cache@v4.1.1
+ - uses: actions/cache@v4
id: cache
name: Cache wasmd-build
with:
diff --git a/.github/e2e-tests.yml b/.github/e2e-tests.yml
index fe30e2342c2..142c7733533 100644
--- a/.github/e2e-tests.yml
+++ b/.github/e2e-tests.yml
@@ -10,7 +10,7 @@ runner-test-matrix:
# START: OCR tests
# Example of 1 runner for all tests in integration-tests/smoke/ocr_test.go
- - id: smoke/ocr_test.go:*
+ - id: smoke/ocr_test.go:*
path: integration-tests/smoke/ocr_test.go
test_env_type: docker
runs_on: ubuntu-latest
@@ -27,7 +27,7 @@ runner-test-matrix:
runs_on: ubuntu-latest
test_cmd: cd integration-tests/ && go test soak/ocr_test.go -v -test.run ^TestOCRv1Soak$ -test.parallel=1 -timeout 900h -count=1 -json
test_cmd_opts: 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci -singlepackage -hidepassingtests=false
- test_secrets_required: true
+ test_secrets_required: true
test_env_vars:
TEST_SUITE: soak
@@ -60,7 +60,7 @@ runner-test-matrix:
test_config_override_path: integration-tests/testconfig/ocr2/overrides/base_sepolia_quick_smoke_test.toml
test_secrets_required: true
test_env_vars:
- TEST_SUITE: soak
+ TEST_SUITE: soak
- id: soak/ocr_test.go:TestForwarderOCRv1Soak
path: integration-tests/soak/ocr_test.go
@@ -79,7 +79,7 @@ runner-test-matrix:
test_secrets_required: true
test_env_vars:
TEST_SUITE: soak
-
+
- id: soak/ocr_test.go:TestOCRSoak_GethReorgBelowFinality_FinalityTagDisabled
path: integration-tests/soak/ocr_test.go
test_env_type: k8s-remote-runner
@@ -87,7 +87,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ && go test soak/ocr_test.go -v -test.run TestOCRSoak_GethReorgBelowFinality_FinalityTagDisabled -test.parallel=1 -timeout 900h -count=1 -json
test_secrets_required: true
test_env_vars:
- TEST_SUITE: soak
+ TEST_SUITE: soak
- id: soak/ocr_test.go:TestOCRSoak_GethReorgBelowFinality_FinalityTagEnabled
path: integration-tests/soak/ocr_test.go
@@ -96,7 +96,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ && go test soak/ocr_test.go -v -test.run ^TestOCRSoak_GethReorgBelowFinality_FinalityTagEnabled$ -test.parallel=1 -timeout 900h -count=1 -json
test_secrets_required: true
test_env_vars:
- TEST_SUITE: soak
+ TEST_SUITE: soak
- id: soak/ocr_test.go:TestOCRSoak_GasSpike
path: integration-tests/soak/ocr_test.go
@@ -105,7 +105,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ && go test soak/ocr_test.go -v -test.run ^TestOCRSoak_GasSpike$ -test.parallel=1 -timeout 900h -count=1 -json
test_secrets_required: true
test_env_vars:
- TEST_SUITE: soak
+ TEST_SUITE: soak
- id: soak/ocr_test.go:TestOCRSoak_ChangeBlockGasLimit
path: integration-tests/soak/ocr_test.go
@@ -114,7 +114,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ && go test soak/ocr_test.go -v -test.run ^TestOCRSoak_ChangeBlockGasLimit$ -test.parallel=1 -timeout 900h -count=1 -json
test_secrets_required: true
test_env_vars:
- TEST_SUITE: soak
+ TEST_SUITE: soak
- id: soak/ocr_test.go:TestOCRSoak_RPCDownForAllCLNodes
path: integration-tests/soak/ocr_test.go
@@ -123,7 +123,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ && go test soak/ocr_test.go -v -test.run ^TestOCRSoak_RPCDownForAllCLNodes$ -test.parallel=1 -timeout 900h -count=1 -json
test_secrets_required: true
test_env_vars:
- TEST_SUITE: soak
+ TEST_SUITE: soak
- id: soak/ocr_test.go:TestOCRSoak_RPCDownForHalfCLNodes
path: integration-tests/soak/ocr_test.go
@@ -132,7 +132,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ && go test soak/ocr_test.go -v -test.run ^TestOCRSoak_RPCDownForHalfCLNodes$ -test.parallel=1 -timeout 900h -count=1 -json
test_secrets_required: true
test_env_vars:
- TEST_SUITE: soak
+ TEST_SUITE: soak
- id: smoke/forwarder_ocr_test.go:*
path: integration-tests/smoke/forwarder_ocr_test.go
@@ -168,7 +168,7 @@ runner-test-matrix:
pyroscope_env: ci-smoke-ocr2-evm-simulated
test_env_vars:
E2E_TEST_CHAINLINK_VERSION: '{{ env.DEFAULT_CHAINLINK_PLUGINS_VERSION }}' # This is the chainlink version that has the plugins
-
+
- id: smoke/ocr2_test.go:*-plugins
path: integration-tests/smoke/ocr2_test.go
test_env_type: docker
@@ -193,11 +193,12 @@ runner-test-matrix:
test_cmd: cd integration-tests/chaos && DETACH_RUNNER=false go test -test.run "^TestOCRChaos$" -v -test.parallel=10 -timeout 60m -count=1 -json
test_env_vars:
TEST_SUITE: chaos
+ CHAINLINK_USER_TEAM: Foundations
# END: OCR tests
# START: Automation tests
-
+
- id: smoke/automation_test.go:^TestAutomationBasic/registry_2_0|TestAutomationBasic/registry_2_1_conditional|TestAutomationBasic/registry_2_1_logtrigger$
path: integration-tests/smoke/automation_test.go
test_env_type: docker
@@ -273,7 +274,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run "^TestAutomationBasic/registry_2_3_with_mercury_v03_link|TestAutomationBasic/registry_2_3_with_logtrigger_and_mercury_v02_link$" -test.parallel=2 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestSetUpkeepTriggerConfig$
path: integration-tests/smoke/automation_test.go
@@ -284,7 +285,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestSetUpkeepTriggerConfig$ -test.parallel=2 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestAutomationAddFunds$
path: integration-tests/smoke/automation_test.go
@@ -295,7 +296,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestAutomationAddFunds$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestAutomationPauseUnPause$
path: integration-tests/smoke/automation_test.go
@@ -306,7 +307,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestAutomationPauseUnPause$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestAutomationRegisterUpkeep$
path: integration-tests/smoke/automation_test.go
@@ -317,7 +318,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestAutomationRegisterUpkeep$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestAutomationPauseRegistry$
path: integration-tests/smoke/automation_test.go
@@ -328,7 +329,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestAutomationPauseRegistry$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestAutomationKeeperNodesDown$
path: integration-tests/smoke/automation_test.go
@@ -339,7 +340,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestAutomationKeeperNodesDown$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestAutomationPerformSimulation$
path: integration-tests/smoke/automation_test.go
@@ -350,7 +351,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestAutomationPerformSimulation$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestAutomationCheckPerformGasLimit$
path: integration-tests/smoke/automation_test.go
@@ -361,7 +362,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestAutomationCheckPerformGasLimit$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestUpdateCheckData$
path: integration-tests/smoke/automation_test.go
@@ -372,7 +373,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestUpdateCheckData$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/automation_test.go:^TestSetOffchainConfigWithMaxGasPrice$
path: integration-tests/smoke/automation_test.go
@@ -383,7 +384,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestSetOffchainConfigWithMaxGasPrice$ -test.parallel=2 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-automation-evm-simulated
+ pyroscope_env: ci-smoke-automation-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperBasicSmoke$
path: integration-tests/smoke/keeper_test.go
@@ -393,7 +394,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperBasicSmoke$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperBlockCountPerTurn$
path: integration-tests/smoke/keeper_test.go
@@ -403,7 +404,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperBlockCountPerTurn$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperSimulation$
path: integration-tests/smoke/keeper_test.go
@@ -413,7 +414,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperSimulation$ -test.parallel=2 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperCheckPerformGasLimit$
path: integration-tests/smoke/keeper_test.go
@@ -423,7 +424,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperCheckPerformGasLimit$ -test.parallel=2 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperRegisterUpkeep$
path: integration-tests/smoke/keeper_test.go
@@ -433,7 +434,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperRegisterUpkeep$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperAddFunds$
path: integration-tests/smoke/keeper_test.go
@@ -443,7 +444,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperAddFunds$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperRemove$
path: integration-tests/smoke/keeper_test.go
@@ -453,8 +454,8 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperRemove$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
-
+ pyroscope_env: ci-smoke-keeper-evm-simulated
+
- id: smoke/keeper_test.go:^TestKeeperPauseRegistry$
path: integration-tests/smoke/keeper_test.go
test_env_type: docker
@@ -463,7 +464,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperPauseRegistry$ -test.parallel=2 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperMigrateRegistry$
path: integration-tests/smoke/keeper_test.go
@@ -473,7 +474,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperMigrateRegistry$ -test.parallel=1 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperNodeDown$
path: integration-tests/smoke/keeper_test.go
@@ -483,7 +484,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperNodeDown$ -test.parallel=3 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperPauseUnPauseUpkeep$
path: integration-tests/smoke/keeper_test.go
@@ -493,7 +494,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperPauseUnPauseUpkeep$ -test.parallel=1 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperUpdateCheckData$
path: integration-tests/smoke/keeper_test.go
@@ -503,7 +504,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperUpdateCheckData$ -test.parallel=1 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: smoke/keeper_test.go:^TestKeeperJobReplacement$
path: integration-tests/smoke/keeper_test.go
@@ -513,7 +514,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestKeeperJobReplacement$ -test.parallel=1 -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-keeper-evm-simulated
+ pyroscope_env: ci-smoke-keeper-evm-simulated
- id: load/automationv2_1/automationv2_1_test.go:TestLogTrigger
path: integration-tests/load/automationv2_1/automationv2_1_test.go
@@ -546,7 +547,7 @@ runner-test-matrix:
test_env_type: docker
runs_on: ubuntu22.04-8cores-32GB
triggers:
- - Automation Nightly Tests
+ - Automation Nightly Tests
test_cmd: cd integration-tests/smoke && go test -test.run ^TestAutomationNodeUpgrade/registry_2_1 -test.parallel=5 -timeout 60m -count=1 -json
test_env_vars:
E2E_TEST_CHAINLINK_IMAGE: public.ecr.aws/chainlink/chainlink
@@ -624,6 +625,7 @@ runner-test-matrix:
pyroscope_env: ci-automation-on-demand-chaos
test_env_vars:
TEST_SUITE: chaos
+ CHAINLINK_USER_TEAM: Automation
- id: benchmark/automation_test.go:TestAutomationBenchmark
path: integration-tests/benchmark/automation_test.go
@@ -676,7 +678,7 @@ runner-test-matrix:
test_env_vars:
TEST_TYPE: Smoke
triggers:
- - On Demand VRFV2 Plus Performance Test
+ - On Demand VRFV2 Plus Performance Test
- id: load/vrfv2plus/vrfv2plus_test.go:^TestVRFV2PlusBHSPerformance$Smoke
path: integration-tests/load/vrfv2plus/vrfv2plus_test.go
@@ -688,7 +690,7 @@ runner-test-matrix:
test_env_vars:
TEST_TYPE: Smoke
triggers:
- - On Demand VRFV2 Plus Performance Test
+ - On Demand VRFV2 Plus Performance Test
- id: load/vrfv2/vrfv2_test.go:^TestVRFV2Performance$Smoke
path: integration-tests/load/vrfv2/vrfv2_test.go
@@ -698,9 +700,9 @@ runner-test-matrix:
test_config_override_required: true
test_secrets_required: true
test_env_vars:
- TEST_TYPE: Smoke
+ TEST_TYPE: Smoke
triggers:
- - On Demand VRFV2 Performance Test
+ - On Demand VRFV2 Performance Test
- id: load/vrfv2/vrfv2_test.go:^TestVRFV2PlusBHSPerformance$Smoke
path: integration-tests/load/vrfv2/vrfv2_test.go
@@ -892,7 +894,7 @@ runner-test-matrix:
- Merge Queue E2E Core Tests
- Nightly E2E Tests
test_cmd: cd integration-tests/ && go test smoke/flux_test.go -timeout 30m -count=1 -json
- pyroscope_env: ci-smoke-flux-evm-simulated
+ pyroscope_env: ci-smoke-flux-evm-simulated
- id: smoke/reorg_above_finality_test.go:*
path: integration-tests/smoke/reorg_above_finality_test.go
@@ -904,7 +906,7 @@ runner-test-matrix:
- Nightly E2E Tests
test_cmd: cd integration-tests/ && go test smoke/reorg_above_finality_test.go -timeout 30m -count=1 -json
pyroscope_env: ci-smoke-reorg-above-finality-evm-simulated
-
+
- id: migration/upgrade_version_test.go:*
path: integration-tests/migration/upgrade_version_test.go
test_env_type: docker
@@ -966,7 +968,7 @@ runner-test-matrix:
- id: smoke/ccip/ccip_rmn_test.go:^TestRMN_TwoMessagesOnTwoLanesIncludingBatching$
path: integration-tests/smoke/ccip/ccip_rmn_test.go
test_env_type: docker
- runs_on: ubuntu-latest
+ runs_on: ubuntu20.04-8cores-32GB
triggers:
- PR E2E Core Tests
- Nightly E2E Tests
@@ -975,14 +977,14 @@ runner-test-matrix:
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
E2E_JD_VERSION: 0.6.0
- E2E_RMN_RAGEPROXY_VERSION: master-f461a9e
- E2E_RMN_AFN2PROXY_VERSION: master-f461a9e
+ E2E_RMN_RAGEPROXY_VERSION: 678509b
+ E2E_RMN_AFN2PROXY_VERSION: 678509b
CCIP_V16_TEST_ENV: docker
- id: smoke/ccip/ccip_rmn_test.go:^TestRMN_MultipleMessagesOnOneLaneNoWaitForExec$
path: integration-tests/smoke/ccip/ccip_rmn_test.go
test_env_type: docker
- runs_on: ubuntu-latest
+ runs_on: ubuntu20.04-8cores-32GB
triggers:
- PR E2E Core Tests
- Nightly E2E Tests
@@ -991,14 +993,14 @@ runner-test-matrix:
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
E2E_JD_VERSION: 0.6.0
- E2E_RMN_RAGEPROXY_VERSION: master-f461a9e
- E2E_RMN_AFN2PROXY_VERSION: master-f461a9e
+ E2E_RMN_RAGEPROXY_VERSION: 678509b
+ E2E_RMN_AFN2PROXY_VERSION: 678509b
CCIP_V16_TEST_ENV: docker
- id: smoke/ccip/ccip_rmn_test.go:^TestRMN_NotEnoughObservers$
path: integration-tests/smoke/ccip/ccip_rmn_test.go
test_env_type: docker
- runs_on: ubuntu-latest
+ runs_on: ubuntu20.04-8cores-32GB
triggers:
- PR E2E Core Tests
- Nightly E2E Tests
@@ -1007,14 +1009,14 @@ runner-test-matrix:
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
E2E_JD_VERSION: 0.6.0
- E2E_RMN_RAGEPROXY_VERSION: master-f461a9e
- E2E_RMN_AFN2PROXY_VERSION: master-f461a9e
+ E2E_RMN_RAGEPROXY_VERSION: 678509b
+ E2E_RMN_AFN2PROXY_VERSION: 678509b
CCIP_V16_TEST_ENV: docker
- id: smoke/ccip/ccip_rmn_test.go:^TestRMN_DifferentSigners$
path: integration-tests/smoke/ccip/ccip_rmn_test.go
test_env_type: docker
- runs_on: ubuntu-latest
+ runs_on: ubuntu20.04-8cores-32GB
triggers:
- PR E2E Core Tests
- Nightly E2E Tests
@@ -1023,14 +1025,14 @@ runner-test-matrix:
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
E2E_JD_VERSION: 0.6.0
- E2E_RMN_RAGEPROXY_VERSION: master-f461a9e
- E2E_RMN_AFN2PROXY_VERSION: master-f461a9e
+ E2E_RMN_RAGEPROXY_VERSION: 678509b
+ E2E_RMN_AFN2PROXY_VERSION: 678509b
CCIP_V16_TEST_ENV: docker
- id: smoke/ccip/ccip_rmn_test.go:^TestRMN_NotEnoughSigners$
path: integration-tests/smoke/ccip/ccip_rmn_test.go
test_env_type: docker
- runs_on: ubuntu-latest
+ runs_on: ubuntu20.04-8cores-32GB
triggers:
- PR E2E Core Tests
- Nightly E2E Tests
@@ -1039,14 +1041,14 @@ runner-test-matrix:
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
E2E_JD_VERSION: 0.6.0
- E2E_RMN_RAGEPROXY_VERSION: master-f461a9e
- E2E_RMN_AFN2PROXY_VERSION: master-f461a9e
+ E2E_RMN_RAGEPROXY_VERSION: 678509b
+ E2E_RMN_AFN2PROXY_VERSION: 678509b
CCIP_V16_TEST_ENV: docker
- id: smoke/ccip/ccip_rmn_test.go:^TestRMN_DifferentRmnNodesForDifferentChains$
path: integration-tests/smoke/ccip/ccip_rmn_test.go
test_env_type: docker
- runs_on: ubuntu-latest
+ runs_on: ubuntu20.04-8cores-32GB
triggers:
- PR E2E Core Tests
- Nightly E2E Tests
@@ -1055,14 +1057,14 @@ runner-test-matrix:
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
E2E_JD_VERSION: 0.6.0
- E2E_RMN_RAGEPROXY_VERSION: master-f461a9e
- E2E_RMN_AFN2PROXY_VERSION: master-f461a9e
+ E2E_RMN_RAGEPROXY_VERSION: 678509b
+ E2E_RMN_AFN2PROXY_VERSION: 678509b
CCIP_V16_TEST_ENV: docker
- id: smoke/ccip/ccip_rmn_test.go:^TestRMN_TwoMessagesOneSourceChainCursed$
path: integration-tests/smoke/ccip/ccip_rmn_test.go
test_env_type: docker
- runs_on: ubuntu-latest
+ runs_on: ubuntu20.04-8cores-32GB
triggers:
- PR E2E Core Tests
- Nightly E2E Tests
@@ -1071,14 +1073,14 @@ runner-test-matrix:
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
E2E_JD_VERSION: 0.6.0
- E2E_RMN_RAGEPROXY_VERSION: master-f461a9e
- E2E_RMN_AFN2PROXY_VERSION: master-f461a9e
+ E2E_RMN_RAGEPROXY_VERSION: 678509b
+ E2E_RMN_AFN2PROXY_VERSION: 678509b
CCIP_V16_TEST_ENV: docker
- id: smoke/ccip/ccip_rmn_test.go:^TestRMN_GlobalCurseTwoMessagesOnTwoLanes$
path: integration-tests/smoke/ccip/ccip_rmn_test.go
test_env_type: docker
- runs_on: ubuntu-latest
+ runs_on: ubuntu20.04-8cores-32GB
triggers:
- PR E2E Core Tests
- Nightly E2E Tests
@@ -1087,8 +1089,8 @@ runner-test-matrix:
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
E2E_JD_VERSION: 0.6.0
- E2E_RMN_RAGEPROXY_VERSION: master-f461a9e
- E2E_RMN_AFN2PROXY_VERSION: master-f461a9e
+ E2E_RMN_RAGEPROXY_VERSION: 678509b
+ E2E_RMN_AFN2PROXY_VERSION: 678509b
CCIP_V16_TEST_ENV: docker
# END: CCIPv1.6 tests
@@ -1106,7 +1108,8 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPForBidirectionalLane$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
-
+ CHAINLINK_USER_TEAM: CCIP
+
- id: ccip-smoke-usdc
path: integration-tests/ccip-tests/smoke/ccip_test.go
test_env_type: docker
@@ -1118,6 +1121,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPForBidirectionalLane$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
test_config_override_path: integration-tests/ccip-tests/testconfig/tomls/usdc_mock_deployment.toml
- id: ccip-smoke-db-compatibility
@@ -1131,6 +1135,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPForBidirectionalLane$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
test_config_override_path: integration-tests/ccip-tests/testconfig/tomls/db-compatibility.toml
- id: ccip-smoke-leader-lane
@@ -1157,6 +1162,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPTokenPoolRateLimits$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
- id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPMulticall$
path: integration-tests/ccip-tests/smoke/ccip_test.go
@@ -1169,6 +1175,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPMulticall$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
- id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPManuallyExecuteAfterExecutionFailingDueToInsufficientGas$
path: integration-tests/ccip-tests/smoke/ccip_test.go
@@ -1181,6 +1188,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPManuallyExecuteAfterExecutionFailingDueToInsufficientGas$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
- id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPOnRampLimits$
path: integration-tests/ccip-tests/smoke/ccip_test.go
@@ -1193,6 +1201,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPOnRampLimits$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
- id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPOffRampCapacityLimit$
path: integration-tests/ccip-tests/smoke/ccip_test.go
@@ -1202,7 +1211,8 @@ runner-test-matrix:
- Nightly E2E Tests
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPOffRampCapacityLimit$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
- E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
- id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPOffRampAggRateLimit$
path: integration-tests/ccip-tests/smoke/ccip_test.go
@@ -1213,6 +1223,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPOffRampAggRateLimit$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
- id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPReorgBelowFinality$
path: integration-tests/ccip-tests/smoke/ccip_test.go
@@ -1225,6 +1236,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPReorgBelowFinality$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
test_config_override_path: integration-tests/ccip-tests/testconfig/tomls/ccip-reorg.toml
- id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPReorgAboveFinalityAtDestination$
@@ -1238,6 +1250,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPReorgAboveFinalityAtDestination$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
test_config_override_path: integration-tests/ccip-tests/testconfig/tomls/ccip-reorg.toml
- id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPReorgAboveFinalityAtSource$
@@ -1251,6 +1264,7 @@ runner-test-matrix:
test_cmd: cd integration-tests/ccip-tests/smoke && go test ccip_test.go -test.run ^TestSmokeCCIPReorgAboveFinalityAtSource$ -timeout 30m -count=1 -test.parallel=1 -json
test_env_vars:
E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2
+ CHAINLINK_USER_TEAM: CCIP
test_config_override_path: integration-tests/ccip-tests/testconfig/tomls/ccip-reorg.toml
- id: integration-tests/ccip-tests/load/ccip_test.go:TestLoadCCIPStableRPS
@@ -1262,8 +1276,8 @@ runner-test-matrix:
TEST_SUITE: ccip-load
E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
triggers:
- - E2E CCIP Load Tests
- test_artifacts_on_failure:
+ - E2E CCIP Load Tests
+ test_artifacts_on_failure:
- ./integration-tests/load/logs/payload_ccip.json
# Enable when CCIP-2277 is resolved
@@ -1277,8 +1291,8 @@ runner-test-matrix:
# test_env_vars:
# E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests"
# triggers:
- # - E2E CCIP Load Tests
- # test_artifacts_on_failure:
+ # - E2E CCIP Load Tests
+ # test_artifacts_on_failure:
# - ./integration-tests/load/logs/payload_ccip.json
- id: ccip-tests/chaos/ccip_test.go
@@ -1306,5 +1320,5 @@ runner-test-matrix:
TEST_TRIGGERED_BY: ccip-cron-chaos-eth
TEST_LOG_LEVEL: debug
E2E_TEST_GRAFANA_DASHBOARD_URL: /d/6vjVx-1V8/ccip-long-running-tests
-
+
# END: CCIP tests
diff --git a/.github/scripts/map-affected-files-to-modules.sh b/.github/scripts/map-affected-files-to-modules.sh
new file mode 100755
index 00000000000..34f058529cf
--- /dev/null
+++ b/.github/scripts/map-affected-files-to-modules.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+set -e
+
+# This script:
+# 1. Finds all modules.
+# 2. Maps changed files (passed as a param) to found modules.
+# 3. Prints out the affected modules.
+# 4. Output the result (as JSON) to a GitHub Actions environment variable.
+
+# Get the list of changed files as parameter (from JSON array)
+changed_files=$(echo "$1" | jq -r '.[]')
+echo "Changed files: $changed_files"
+
+# 1. Find all modules in the repository,
+# - Strip the leading './' from the path
+# (necessary for comparison, affected files do not have leading './')
+modules=$(find . -name 'go.mod' -exec dirname {} \; | sed 's|^./||' | uniq)
+echo "Found modules: $modules"
+
+# Use a Bash associative array to track unique modules
+declare -A unique_modules
+
+for path_to_file in $changed_files; do
+ echo "Resolving a module affected by a file: '$path_to_file'"
+ # the flag that indicates if the path matches any module
+ is_path_in_modules=false
+ for module in $modules; do
+ echo "Validating against module: '$module'"
+ # if a module's name matches with a file path
+ # add it, to the affected modules array, skipping the root (`.`)
+ if [[ $module != "." && $path_to_file =~ ^$module* ]]; then
+ echo -e "File '$path_to_file' mapped to the module '$module'\n"
+ unique_modules["$module"]="$module"
+ is_path_in_modules=true
+ break
+ fi
+ done
+ # if no matched module default to root module
+ if [[ $is_path_in_modules == false ]]; then
+ echo "File '$path_to_file' did not match any module, defaulting to root '.'"
+ unique_modules["."]="."
+ is_path_in_modules=false
+ fi
+ is_path_in_modules=false
+done
+
+# if the path is empty (for any reason), it will not get to the loop,
+# so if the unique_modules array is empty, default to the root module
+if [[ ${#unique_modules[@]} -eq 0 ]]; then
+ echo "No files were changed, defaulting to the root module '.'"
+ unique_modules["."]="."
+fi
+
+# Convert keys (module names) of the associative array to an indexed array
+affected_modules=("${!unique_modules[@]}")
+echo "Affected modules: ${affected_modules[@]}"
+
+# Convert bash array to a JSON array for GitHub Actions
+json_array=$(printf '%s\n' "${affected_modules[@]}" | jq -R . | jq -s . | jq -c)
+echo "module_names=$json_array" >> "$GITHUB_OUTPUT"
diff --git a/.github/workflows/automation-ondemand-tests.yml b/.github/workflows/automation-ondemand-tests.yml
index eef02dcddb2..ee917da0e56 100644
--- a/.github/workflows/automation-ondemand-tests.yml
+++ b/.github/workflows/automation-ondemand-tests.yml
@@ -52,45 +52,56 @@ jobs:
outputs:
test_list: ${{ steps.set-tests.outputs.test_list }}
require_chainlink_image_versions_in_qa_ecr: ${{ steps.determine-chainlink-image-check.outputs.require_chainlink_image_versions_in_qa_ecr }}
+ env:
+ GH_INPUTS_CHAINLINK_IMAGE: ${{ inputs.chainlinkImage }}
+ GH_INPUTS_CHAINLINK_IMAGE_UPDATE: ${{ inputs.chainlinkImageUpdate }}
+ GH_INPUTS_CHAINLINK_VERSION: ${{ inputs.chainlinkVersion }}
+ GH_INPUTS_CHAINLINK_VERSION_UPDATE: ${{ inputs.chainlinkVersionUpdate }}
steps:
- name: Determine build to use
id: determine-build
shell: bash
run: |
- if [[ "${{ inputs.chainlinkImage }}" == "QA_ECR" ]]; then
+ if [[ "$GH_INPUTS_CHAINLINK_IMAGE" == "QA_ECR" ]]; then
echo "image='{{ env.QA_CHAINLINK_IMAGE }}'" >> $GITHUB_ENV
else
- echo "image=${{ inputs.chainlinkImage }}" >> $GITHUB_ENV
+ echo "image=$GH_INPUTS_CHAINLINK_IMAGE" >> $GITHUB_ENV
fi
- if [[ "${{ inputs.chainlinkImageUpdate }}" == "QA_ECR" ]]; then
+ if [[ "$GH_INPUTS_CHAINLINK_IMAGE_UPDATE" == "QA_ECR" ]]; then
echo "upgrade_image='{{ env.QA_CHAINLINK_IMAGE }}'" >> $GITHUB_ENV
else
- echo "upgrade_image=${{ inputs.chainlinkImageUpdate }}" >> $GITHUB_ENV
+ echo "upgrade_image=$GH_INPUTS_CHAINLINK_IMAGE_UPDATE" >> $GITHUB_ENV
fi
- if [[ -z "${{ inputs.chainlinkVersion }}" ]] && [[ "${{ inputs.chainlinkImage }}" == "QA_ECR" ]]; then
+ if [[ -z "$GH_INPUTS_CHAINLINK_VERSION" ]] && [[ "$CHAINLINK_IMAGE" == "QA_ECR" ]]; then
echo "version=${{ github.sha }}" >> $GITHUB_ENV
else
- echo "version=${{ inputs.chainlinkVersion }}" >> $GITHUB_ENV
+ echo "version=$GH_INPUTS_CHAINLINK_VERSION" >> $GITHUB_ENV
fi
- if [[ -z "${{ inputs.chainlinkVersionUpdate }}" ]] && [[ "${{ inputs.chainlinkImageUpdate }}" == "QA_ECR" ]]; then
+ if [[ -z "$GH_INPUTS_CHAINLINK_VERSION_UPDATE" ]] && [[ "$GH_INPUTS_CHAINLINK_IMAGE_UPDATE" == "QA_ECR" ]]; then
echo "upgrade_version=${{ github.sha }}" >> $GITHUB_ENV
else
- echo "upgrade_version=${{ inputs.chainlinkVersionUpdate }}" >> $GITHUB_ENV
+ echo "upgrade_version=$GH_INPUTS_CHAINLINK_VERSION_UPDATE" >> $GITHUB_ENV
fi
- name: Check if chainlink image check required
id: determine-chainlink-image-check
shell: bash
+ env:
+ CHAINLKINK_IMAGE: ${{ github.event.inputs.chainlinkImage }}
+ CHAINLINK_IMAGE_UPDATE: ${{ github.event.inputs.chainlinkImageUpdate }}
run: |
chainlink_image_versions=""
- if [ "${{ github.event.inputs.chainlinkImage }}" = "QA_ECR" ]; then
+ if [ "$CHAINLKINK_IMAGE" = "QA_ECR" ]; then
chainlink_image_versions+="${{ env.version }},"
fi
- if [ "${{ github.event.inputs.chainlinkImageUpdate }}" = "QA_ECR" ]; then
+ if [ "$CHAINLINK_IMAGE_UPDATE" = "QA_ECR" ]; then
chainlink_image_versions+="${{ env.upgrade_version }}"
fi
echo "require_chainlink_image_versions_in_qa_ecr=$chainlink_image_versions" >> $GITHUB_OUTPUT
- name: Set tests to run
id: set-tests
+ env:
+ GH_EVENT_INPUTS_ENABLE_REORG: ${{ github.event.inputs.enableReorg }}
+ GH_EVENT_INPUTS_ENABLE_CHAOS: ${{ github.event.inputs.enableChaos }}
run: |
# Always run upgrade tests
@@ -118,7 +129,7 @@ jobs:
EOF
# Run reorg tests if enabled
- if [[ "${{ github.event.inputs.enableReorg }}" == 'true' ]]; then
+ if [[ "$GH_EVENT_INPUTS_ENABLE_REORG" == 'true' ]]; then
cat >> test_list.yaml <> test_list.yaml <-
+ ${{
+ steps.match-some.outputs.core-ci == 'true' ||
+ steps.match-every.outputs.non-ignored == 'true' ||
+ github.event_name == 'schedule' ||
+ github.event_name == 'workflow_dispatch'
+ }}
+ should-run-golangci: >-
+ ${{
+ steps.match-some.outputs.golang-ci == 'true' ||
+ steps.match-every.outputs.non-ignored == 'true'
+ }}
+ should-run-scripts-test: >-
+ ${{
+ steps.match-some.outputs.scripts == 'true' ||
+ github.event_name == 'schedule' ||
+ github.event_name == 'workflow_dispatch'
+ }}
runs-on: ubuntu-latest
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: match-some
with:
# "if any changed file matches one or more of the conditions" (https://github.com/dorny/paths-filter/issues/225)
predicate-quantifier: some
- # deployment - any changes to files in `deployments/`
+ # deployment - any changes to files in the `deployments/`
+ # scripts - any changes to files in the `core/scripts/`
# core-ci - any changes that could affect this workflow definition
# golang-ci - any changes that could affect the linting result
filters: |
@@ -60,6 +69,8 @@ jobs:
- '.golangci.yml'
- '.github/workflows/ci-core.yml'
- '.github/actions/**'
+ scripts:
+ - 'core/scripts/**'
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: match-every
with:
@@ -67,14 +78,18 @@ jobs:
predicate-quantifier: every
# non-integration-tests - only changes made outside of the `integration-tests` directory
# non-ignored - only changes except for the negated ones
+ # all - changes in any directory
# - This is opt-in on purpose. To be safe, new files are assumed to have an affect on CI Core unless listed here specifically.
+ # Enable listing of files matching each filter.
+ # Paths to files will be available in `${FILTER_NAME}_files` output variable.
+ # Paths will be formatted as JSON array
+ list-files: json
filters: |
non-integration-tests:
- '**'
- '!integration-tests/**'
non-ignored:
- '**'
- - '!docs/**'
- '!integration-tests/**'
- '!tools/secrets/**'
- '!tools/goreleaser-config/**'
@@ -91,24 +106,41 @@ jobs:
- '!nix-darwin-shell-hook.sh'
- '!LICENSE'
- '!.github/**'
-
+ all:
+ - '**'
+
+ - name: Resolve affected files to affected modules
+ id: resolved-modules
+ shell: bash
+ run: |
+ # Ensure the step uses `with.list-files: json` to get the list of files in JSON format
+ bash ./.github/scripts/map-affected-files-to-modules.sh '${{ steps.match-every.outputs.all_files }}'
+
golangci:
- # We don't directly merge dependabot PRs, so let's not waste the resources
+ name: GolangCI Lint
+ needs: [filter, run-frequency]
+ # We don't directly merge dependabot PRs to not waste the resources.
if: ${{ (github.event_name == 'pull_request' || github.event_name == 'schedule') && github.actor != 'dependabot[bot]' }}
- name: lint
permissions:
- # For golangci-lint-actions to annotate code in the PR.
+ # To annotate code in the PR.
checks: write
contents: read
# For golangci-lint-action's `only-new-issues` option.
pull-requests: read
runs-on: ubuntu-24.04-8cores-32GB-ARM
- needs: [filter, run-frequency]
+ strategy:
+ fail-fast: false
+ matrix:
+ modules: ${{ fromJson(needs.filter.outputs.affected-modules) }}
steps:
- - uses: actions/checkout@v4.2.1
- - name: Golang Lint
+ - name: Checkout
+ uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
+ - name: Golang Lint (${{ matrix.modules }})
uses: ./.github/actions/golangci-lint
- if: ${{ needs.filter.outputs.should-run-golangci == 'true' }}
+ with:
+ go-directory: ${{ matrix.modules }}
- name: Notify Slack
if: ${{ failure() && needs.run-frequency.outputs.one-per-day-frequency == 'true' }}
uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0
@@ -117,6 +149,20 @@ jobs:
with:
channel-id: "#team-core"
slack-message: "golangci-lint failed: \n${{ format('https://github.com/{0}/actions/runs/{1}', github.repository, github.run_id) }}"
+
+ # Fails if any golangci-lint matrix jobs fails and silently succeeds otherwise
+ # Consolidates golangci-lint matrix job results under one required `lint` check
+ # Inclusive check: all (new) modules are analyzed, but no need to enable "required" checks for each one
+ golangci-matrix-results-validation:
+ name: lint
+ needs: [golangci]
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check Golangci-lint Matrix Results
+ if: ${{ needs.golangci.result != 'success' }}
+ run: |
+ echo "At least one 'GolangCI Lint' matrix job failed. Check the failed lint jobs."
+ exit 1
core:
env:
@@ -136,11 +182,11 @@ jobs:
- cmd: go_core_ccip_deployment_tests
os: ubuntu22.04-32cores-128GB
printResults: true
+ - cmd: go_core_fuzz
+ os: ubuntu22.04-8cores-32GB
- cmd: go_core_race_tests
# use 64cores for certain scheduled runs only
os: ${{ needs.run-frequency.outputs.two-per-day-frequency == 'true' && 'ubuntu-latest-64cores-256GB' || 'ubuntu-latest-32cores-128GB' }}
- - cmd: go_core_fuzz
- os: ubuntu22.04-8cores-32GB
name: Core Tests (${{ matrix.type.cmd }})
# We don't directly merge dependabot PRs, so let's not waste the resources
if: ${{ github.actor != 'dependabot[bot]' }}
@@ -152,6 +198,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Change Modtime of Files (cache optimization)
shell: bash
@@ -164,6 +212,9 @@ jobs:
with:
prod: "true"
+ - name: Install Foundry
+ uses: ./.github/actions/install-solidity-foundry
+
- name: Setup Go
if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }}
uses: ./.github/actions/setup-go
@@ -172,11 +223,6 @@ jobs:
restore-build-cache-only: ${{ matrix.type.cmd == 'go_core_fuzz' }}
build-cache-version: ${{ matrix.type.cmd }}
- - name: Replace chainlink-evm deps
- if: ${{ needs.filter.outputs.should-run-ci-core == 'true' && inputs.evm-ref != ''}}
- shell: bash
- run: go get github.com/smartcontractkit/chainlink-integrations/evm/relayer@${{ inputs.evm-ref }}
-
- name: Setup Solana
if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }}
uses: ./.github/actions/setup-solana
@@ -285,136 +331,103 @@ jobs:
channel-id: "#topic-data-races"
slack-message: "Race tests failed: \n${{ format('https://github.com/{0}/actions/runs/{1}', github.repository, github.run_id) }}"
- detect-flakey-tests:
- needs: [filter, core]
- name: Flakey Test Detection
+ core-scripts-tests:
+ name: test-scripts
+ needs: [filter]
runs-on: ubuntu-latest
- if: always() && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
- env:
- CL_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable
- permissions:
- id-token: write
- contents: read
+ if: ${{ needs.filter.outputs.should-run-scripts-test == 'true' }}
steps:
- - name: Checkout the repo
+ - name: Checkout
uses: actions/checkout@v4.2.1
- - name: Setup node
- uses: actions/setup-node@v4.0.4
-
- - name: Setup NodeJS
- uses: ./.github/actions/setup-nodejs
- with:
- prod: "true"
-
- name: Setup Go
uses: ./.github/actions/setup-go
-
- - name: Setup Postgres
- uses: ./.github/actions/setup-postgres
-
- - name: Touching core/web/assets/index.html
- run: mkdir -p core/web/assets && touch core/web/assets/index.html
-
- - name: Download Go vendor packages
- run: go mod download
-
- - name: Replace chainlink-evm deps
- if: ${{ github.event_name == 'workflow_dispatch' && inputs.evm-ref != ''}}
- shell: bash
- run: go get github.com/smartcontractkit/chainlink-integrations/evm/relayer@${{ inputs.evm-ref }}
-
- - name: Build binary
- run: go build -o chainlink.test .
-
- - name: Setup DB
- run: ./chainlink.test local db preparetest
-
- - name: Load test outputs
- uses: actions/download-artifact@v4.1.8
with:
- name: go_core_tests_logs
- path: ./artifacts
-
- - name: Delete go_core_tests_logs/coverage.txt
- shell: bash
- run: |
- # Need to delete coverage.txt so the disk doesn't fill up
- rm -f ./artifacts/go_core_tests_logs/coverage.txt
-
- - name: Build flakey test runner
- run: go build ./tools/flakeytests/cmd/runner
-
- - name: Re-run tests
+ go-version-file: core/scripts/go.mod
+ go-module-file: core/scripts/go.sum
+
+ - name: Run Tests
env:
- GRAFANA_INTERNAL_BASIC_AUTH: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
- GRAFANA_INTERNAL_HOST: ${{ secrets.GRAFANA_INTERNAL_HOST }}
- GITHUB_EVENT_PATH: ${{ github.event_path }}
- GITHUB_EVENT_NAME: ${{ github.event_name }}
- GITHUB_REPO: ${{ github.repository }}
- GITHUB_RUN_ID: ${{ github.run_id }}
- run: |
- ./runner \
- -grafana_auth=$GRAFANA_INTERNAL_BASIC_AUTH \
- -grafana_host=$GRAFANA_INTERNAL_HOST \
- -gh_sha=$GITHUB_SHA \
- -gh_event_path=$GITHUB_EVENT_PATH \
- -gh_event_name=$GITHUB_EVENT_NAME \
- -gh_run_id=$GITHUB_RUN_ID \
- -gh_repo=$GITHUB_REPO \
- -command=./tools/bin/go_core_tests \
- `ls -R ./artifacts/output.txt`
- - name: Store logs artifacts
+ OUTPUT_FILE: ./output.txt
+ run: ./tools/bin/go_core_scripts_tests ./...
+
+ - name: Store test report artifacts
if: ${{ always() }}
uses: actions/upload-artifact@v4.4.3
with:
- name: flakey_test_runner_logs
+ name: go_core_scripts_tests_logs
path: |
./output.txt
- retention-days: 7
+ ./coverage.txt
+ retention-days: 7
scan:
name: SonarQube Scan
- needs: [core, run-frequency]
- if: ${{ always() && needs.run-frequency.outputs.four-per-day-frequency == 'true' && github.actor != 'dependabot[bot]' }}
+ needs: [golangci, core, core-scripts-tests]
+ if: ${{ always() && github.actor != 'dependabot[bot]' }}
runs-on: ubuntu-latest
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
fetch-depth: 0 # fetches all history for all tags and branches to provide more metadata for sonar reports
- - name: Download all workflow run artifacts
+ - name: Download all workflow artifacts
uses: actions/download-artifact@v4.1.8
- name: Check and Set SonarQube Report Paths
shell: bash
run: |
# Check and assign paths for coverage/test reports in go_core_tests_logs
- if [ -d "go_core_tests_logs" ]; then
- sonarqube_coverage_report_paths=$(find go_core_tests_logs -name coverage.txt | paste -sd "," -)
- sonarqube_tests_report_paths=$(find go_core_tests_logs -name output.txt | paste -sd "," -)
+ core_artifact="go_core_tests_logs"
+ if [ -d "$core_artifact" ]; then
+ echo "Found $core_artifact"
+ sonarqube_coverage_report_paths=$(find "$core_artifact" -name coverage.txt | paste -sd "," -)
+ sonarqube_tests_report_paths=$(find "$core_artifact" -name output.txt | paste -sd "," -)
+ echo "Coverage report paths: $sonarqube_coverage_report_paths"
+ echo "Tests report paths: $sonarqube_tests_report_paths"
else
+ echo "Did not find $core_artifact"
sonarqube_coverage_report_paths=""
sonarqube_tests_report_paths=""
fi
# Check and assign paths for coverage/test reports in go_core_tests_integration_logs
- if [ -d "go_core_tests_integration_logs" ]; then
- integration_coverage_paths=$(find go_core_tests_integration_logs -name coverage.txt | paste -sd "," -)
- integration_tests_paths=$(find go_core_tests_integration_logs -name output.txt | paste -sd "," -)
+ integration_tests_artifact="go_core_tests_integration_logs"
+ if [ -d "$integration_tests_artifact" ]; then
+ echo "Found $integration_tests_artifact"
+ integration_coverage_paths=$(find "$integration_tests_artifact" -name coverage.txt | paste -sd "," -)
+ integration_tests_paths=$(find "$integration_tests_artifact" -name output.txt | paste -sd "," -)
+
# Append to existing paths if they are set, otherwise assign directly
sonarqube_coverage_report_paths="${sonarqube_coverage_report_paths:+$sonarqube_coverage_report_paths,}$integration_coverage_paths"
sonarqube_tests_report_paths="${sonarqube_tests_report_paths:+$sonarqube_tests_report_paths,}$integration_tests_paths"
fi
- # Check and assign paths for lint reports
- if [ -d "golangci-lint-report" ]; then
- sonarqube_lint_report_paths=$(find golangci-lint-report -name golangci-lint-report.xml | paste -sd "," -)
- else
- sonarqube_lint_report_paths=""
+ # Check and assign paths for coverage/test reports in go_core_scripts_tests_logs
+ scripts_tests_artifact="go_core_scripts_tests_logs"
+ if [ -d "$scripts_tests_artifact" ]; then
+ echo "Found $scripts_tests_artifact"
+ scripts_coverage_paths=$(find "$scripts_tests_artifact" -name coverage.txt | paste -sd "," -)
+ scripts_tests_paths=$(find "$scripts_tests_artifact" -name output.txt | paste -sd "," -)
+
+ # Append to existing paths if they are set, otherwise assign directly
+ sonarqube_coverage_report_paths="${sonarqube_coverage_report_paths:+$sonarqube_coverage_report_paths,}$scripts_coverage_paths"
+ sonarqube_tests_report_paths="${sonarqube_tests_report_paths:+$sonarqube_tests_report_paths,}$scripts_tests_paths"
fi
+ # Check and assign paths for lint reports
+ # To find reports in the folders named differently (because of the matrix strategy),
+ # We need to loop through the artifacts. It allows usage of RegExp folders (skipped if not found).
+ for golang_lint_artifact in golangci-lint-report*
+ do
+ echo "Found golangci-lint-report artifacts"
+ sonarqube_lint_report_paths=$(find -type f -name 'golangci-lint-report.xml' -printf "%p,")
+ echo "Lint report paths: $sonarqube_lint_report_paths"
+ break
+ done
+
ARGS=""
if [[ -z "$sonarqube_tests_report_paths" ]]; then
echo "::warning::No test report paths found, will not pass to sonarqube"
@@ -450,58 +463,17 @@ jobs:
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
SONAR_SCANNER_OPTS: "-Xms6g -Xmx8g"
- trigger-flaky-test-detection-for-root-project:
- name: Flakeguard Root Project
- uses: ./.github/workflows/flakeguard.yml
- if: ${{ github.event_name == 'pull_request' }}
- with:
- repoUrl: 'https://github.com/smartcontractkit/chainlink'
- projectPath: '.'
- baseRef: ${{ github.base_ref }}
- headRef: ${{ github.head_ref }}
- maxPassRatio: '1.0'
- findByTestFilesDiff: true
- findByAffectedPackages: false
- slackNotificationAfterTestsChannelId: 'C07TRF65CNS' #flaky-test-detector-notifications
- extraArgs: '{ "skipped_tests": "TestChainComponents", "run_with_race": "true", "print_failed_tests": "true", "test_repeat_count": "3", "min_pass_ratio": "0.01" }'
- secrets:
- SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
- trigger-flaky-test-detection-for-deployment-project:
- name: Flakeguard Deployment Project
- uses: ./.github/workflows/flakeguard.yml
- needs: [filter]
- if: ${{ github.event_name == 'pull_request' && needs.filter.outputs.deployment-changes == 'true'}}
- with:
- repoUrl: 'https://github.com/smartcontractkit/chainlink'
- projectPath: 'deployment'
- baseRef: ${{ github.base_ref }}
- headRef: ${{ github.head_ref }}
- maxPassRatio: '1.0'
- findByTestFilesDiff: true
- findByAffectedPackages: false
- slackNotificationAfterTestsChannelId: 'C07TRF65CNS' #flaky-test-detector-notifications
- extraArgs: '{ "skipped_tests": "TestAddLane", "run_with_race": "true", "print_failed_tests": "true", "test_repeat_count": "3", "min_pass_ratio": "0.01" }'
- secrets:
- SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
clean:
name: Clean Go Tidy & Generate
- if: ${{ !contains(join(github.event.pull_request.labels.*.name, ' '), 'skip-smoke-tests') && github.actor != 'dependabot[bot]' }}
+ if: ${{ github.actor != 'dependabot[bot]' }}
runs-on: ubuntu22.04-8cores-32GB
defaults:
run:
shell: bash
steps:
- - name: Check for Skip Tests Label
- if: contains(join(github.event.pull_request.labels.*.name, ' '), 'skip-smoke-tests')
- run: |
- echo "## \`skip-smoke-tests\` label is active, skipping E2E smoke tests" >>$GITHUB_STEP_SUMMARY
- exit 0
- uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
fetch-depth: 0
- name: Setup Go
uses: ./.github/actions/setup-go
@@ -511,6 +483,8 @@ jobs:
run: curl https://github.com/smartcontractkit/wsrpc/raw/main/cmd/protoc-gen-go-wsrpc/protoc-gen-go-wsrpc --output $HOME/go/bin/protoc-gen-go-wsrpc && chmod +x $HOME/go/bin/protoc-gen-go-wsrpc
- name: Setup NodeJS
uses: ./.github/actions/setup-nodejs
+ - name: Install Foundry
+ uses: ./.github/actions/install-solidity-foundry
- name: make generate
run: |
make rm-mocked
diff --git a/.github/workflows/ci-flakeguard.yml b/.github/workflows/ci-flakeguard.yml
new file mode 100644
index 00000000000..caf6a62a3fb
--- /dev/null
+++ b/.github/workflows/ci-flakeguard.yml
@@ -0,0 +1,70 @@
+name: Flakeguard CI Core
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+# Run on key branches to make sure integration is good, otherwise run on all PR's
+on:
+ pull_request:
+
+jobs:
+
+ detect-changes:
+ name: Detect Changes
+ permissions:
+ pull-requests: read
+ outputs:
+ deployment-changes: ${{ steps.some.outputs.deployment == 'true' }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the repo
+ uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
+ - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
+ id: some
+ with:
+ filters: |
+ deployment:
+ - 'deployment/**'
+
+ trigger-flaky-test-detection-for-root-project:
+ name: Flakeguard Root Project
+ uses: ./.github/workflows/flakeguard.yml
+ with:
+ repoUrl: 'https://github.com/smartcontractkit/chainlink'
+ projectPath: '.'
+ baseRef: ${{ github.base_ref }}
+ headRef: ${{ github.head_ref }}
+ maxPassRatio: '1.0'
+ findByTestFilesDiff: true
+ findByAffectedPackages: false
+ slackNotificationAfterTestsChannelId: 'C07TRF65CNS' #flaky-test-detector-notifications
+ extraArgs: '{ "skipped_tests": "TestChainComponents", "run_with_race": "true", "print_failed_tests": "true", "test_repeat_count": "3", "omit_test_outputs_on_success": "true" }'
+ secrets:
+ SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ FLAKEGUARD_SPLUNK_ENDPOINT: ${{ secrets.FLAKEGUARD_SPLUNK_ENDPOINT }}
+ FLAKEGUARD_SPLUNK_HEC: ${{ secrets.FLAKEGUARD_SPLUNK_HEC }}
+
+ trigger-flaky-test-detection-for-deployment-project:
+ name: Flakeguard Deployment Project
+ uses: ./.github/workflows/flakeguard.yml
+ needs: [detect-changes]
+ if: ${{ needs.detect-changes.outputs.deployment-changes == 'true'}}
+ with:
+ repoUrl: 'https://github.com/smartcontractkit/chainlink'
+ projectPath: 'deployment'
+ baseRef: ${{ github.base_ref }}
+ headRef: ${{ github.head_ref }}
+ maxPassRatio: '1.0'
+ findByTestFilesDiff: true
+ findByAffectedPackages: false
+ slackNotificationAfterTestsChannelId: 'C07TRF65CNS' #flaky-test-detector-notifications
+ extraArgs: '{ "skipped_tests": "TestAddLane", "run_with_race": "true", "print_failed_tests": "true", "test_repeat_count": "3", "omit_test_outputs_on_success": "true" }'
+ secrets:
+ SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ FLAKEGUARD_SPLUNK_ENDPOINT: ${{ secrets.FLAKEGUARD_SPLUNK_ENDPOINT }}
+ FLAKEGUARD_SPLUNK_HEC: ${{ secrets.FLAKEGUARD_SPLUNK_HEC }}
diff --git a/.github/workflows/ci-protobuf.yml b/.github/workflows/ci-protobuf.yml
index 3931ed8d302..1ea44a0ea78 100644
--- a/.github/workflows/ci-protobuf.yml
+++ b/.github/workflows/ci-protobuf.yml
@@ -9,6 +9,8 @@ jobs:
steps:
- name: Checkout repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup buf
uses: bufbuild/buf-setup-action@35c243d7f2a909b1d4e40399b348a7fdab27d78d # v1.34.0
diff --git a/.github/workflows/ci-scripts.yml b/.github/workflows/ci-scripts.yml
deleted file mode 100644
index 5683641f26b..00000000000
--- a/.github/workflows/ci-scripts.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: CI Scripts
-
-on:
- merge_group:
- pull_request:
-
-jobs:
- lint-scripts:
- # We don't directly merge dependabot PRs, so let's not waste the resources
- if: ${{ (github.event_name == 'pull_request' || github.event_name == 'schedule') && github.actor != 'dependabot[bot]' }}
- runs-on: ubuntu-latest
- permissions:
- # For golangci-lint-actions to annotate code in the PR.
- checks: write
- contents: read
- # For golangci-lint-action's `only-new-issues` option.
- pull-requests: read
- steps:
- - uses: actions/checkout@v4.2.1
- - name: Golang Lint
- uses: ./.github/actions/golangci-lint
- with:
- id: scripts
- name: lint-scripts
- go-directory: core/scripts
- go-version-file: core/scripts/go.mod
- go-module-file: core/scripts/go.sum
-
- test-scripts:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4.2.1
- - name: Setup Go
- uses: ./.github/actions/setup-go
- with:
- go-version-file: core/scripts/go.mod
- go-module-file: core/scripts/go.sum
- - name: Run Tests
- shell: bash
- working-directory: core/scripts
- run: go test ./...
diff --git a/.github/workflows/client-compatibility-tests.yml b/.github/workflows/client-compatibility-tests.yml
index 03c5b893cca..aae8a87f2aa 100644
--- a/.github/workflows/client-compatibility-tests.yml
+++ b/.github/workflows/client-compatibility-tests.yml
@@ -50,27 +50,30 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
fetch-depth: 0
- name: Check for go.mod changes
id: changes
+ env:
+ GH_BASE_REF: ${{ github.base_ref }}
run: |
- if [ -z "${{ github.base_ref }}" ]; then
+ if [ -z "$GH_BASE_REF" ]; then
echo "No base branch found, this should not happen in a PR or MQ. Please reach out to the Test Tooling team."
echo "Github even that triggered the workflow: $GITHUB_EVENT_NAME"
echo "Github ref that triggered the workflow: $GITHUB_REF"
exit 1
fi
- git fetch origin ${{ github.base_ref }}
+ git fetch origin $GH_BASE_REF
# if no match is found then grep exits with code 1, but if there is a match it exits with code 0
# this will return a match if there are any changes on that corresponding line, for example if spacing was changed
- DEPENDENCY_CHANGED=$(git diff -U0 origin/${{ github.base_ref }}...HEAD -- go.mod | grep -q 'github.com/ethereum/go-ethereum'; echo $?)
+ DEPENDENCY_CHANGED=$(git diff -U0 origin/$GH_BASE_REF...HEAD -- go.mod | grep -q 'github.com/ethereum/go-ethereum'; echo $?)
PR_VERSION=$(grep 'github.com/ethereum/go-ethereum' go.mod | awk '{print $2}')
# here 0 means a match was found, 1 means no match was found
if [ "$DEPENDENCY_CHANGED" -eq 0 ]; then
# Dependency was changed in the PR, now compare with the base branch
- git fetch origin ${{ github.base_ref }}
- BASE_VERSION=$(git show origin/${{ github.base_ref }}:go.mod | grep 'github.com/ethereum/go-ethereum' | awk '{print $2}')
+ git fetch origin $GH_BASE_REF
+ BASE_VERSION=$(git show origin/$GH_BASE_REF:go.mod | grep 'github.com/ethereum/go-ethereum' | awk '{print $2}')
echo "Base branch version: $BASE_VERSION"
echo "PR branch version: $PR_VERSION"
@@ -142,6 +145,9 @@ jobs:
go install github.com/smartcontractkit/chainlink-testing-framework/tools/ghlatestreleasechecker@v1.0.0
- name: Select EVM implementations to test
id: select-implementations
+ env:
+ GH_EVENT_INPUTS_BASE64_TEST_LIST: ${{ github.event.inputs.base64TestList }}
+ GH_EVENT_INPUTS_EVM_IMPLEMENTATIONS: ${{ github.event.inputs.evmImplementations }}
run: |
PATH=$PATH:$(go env GOPATH)/bin
export PATH
@@ -184,11 +190,11 @@ jobs:
fi
echo "evm_implementations=$eth_implementations" >> $GITHUB_OUTPUT
elif [ "$GITHUB_EVENT_NAME" = "workflow_dispatch" ]; then
- if [ -n "${{ github.event.inputs.base64TestList }}" ]; then
+ if [ -n "$GH_EVENT_INPUTS_BASE64_TEST_LIST" ]; then
echo "Base64-ed Test Input provided, ignoring EVM implementations"
else
- echo "Will test following EVM implementations: ${{ github.event.inputs.evmImplementations }}"
- echo "evm_implementations=${{ github.event.inputs.evmImplementations }}" >> $GITHUB_OUTPUT
+ echo "Will test following EVM implementations: $GH_EVENT_INPUTS_EVM_IMPLEMENTATIONS"
+ echo "evm_implementations=$GH_EVENT_INPUTS_EVM_IMPLEMENTATIONS" >> $GITHUB_OUTPUT
fi
else
echo "Will test all EVM implementations"
@@ -196,6 +202,12 @@ jobs:
fi
- name: Select Chainlink version
id: select-chainlink-version
+ env:
+ GH_EVENT_INPUTS_CHAINLINK_VERSION: ${{ github.event.inputs.chainlinkVersion }}
+ GH_EVENT_PULL_REQUEST_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
+ GH_EVENT_MERGE_GROUP_HEAD_SHA: ${{ github.event.merge_group.head_sha }}
+ GH_REF_NAME: ${{ github.ref_name }}
+ GH_SHA: ${{ github.sha }}
run: |
PATH=$PATH:$(go env GOPATH)/bin
export PATH
@@ -209,9 +221,9 @@ jobs:
cl_ref_path="releases"
elif [ "$GITHUB_EVENT_NAME" = "workflow_dispatch" ]; then
echo "Fetching Chainlink version from input"
- if [ -n "${{ github.event.inputs.chainlinkVersion }}" ]; then
+ if [ -n "$GH_EVENT_INPUTS_CHAINLINK_VERSION" ]; then
echo "Chainlink version provided in input"
- chainlink_version="${{ github.event.inputs.chainlinkVersion }}"
+ chainlink_version="$GH_EVENT_INPUTS_CHAINLINK_VERSION"
if [[ "$chainlink_version" =~ ^[0-9a-f]{40}$ ]]; then
cl_ref_path="commit"
chainlink_image_version=$chainlink_version
@@ -222,23 +234,23 @@ jobs:
fi
else
echo "Chainlink version not provided in input. Using latest commit SHA."
- chainlink_version=${{ github.sha }}
+ chainlink_version=$GH_SHA
chainlink_image_version=$chainlink_version
cl_ref_path="commit"
fi
elif [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then
echo "Fetching Chainlink version from PR's head commit"
- chainlink_version="${{ github.event.pull_request.head.sha }}"
+ chainlink_version="$GH_EVENT_PULL_REQUEST_HEAD_SHA"
chainlink_image_version=$chainlink_version
cl_ref_path="commit"
elif [ "$GITHUB_EVENT_NAME" = "merge_queue" ]; then
echo "Fetching Chainlink version from merge queue's head commit"
- chainlink_version="${{ github.event.merge_group.head_sha }}"
+ chainlink_version="$GH_EVENT_MERGE_GROUP_HEAD_SHA"
chainlink_image_version=$chainlink_version
cl_ref_path="commit"
elif [ "$GITHUB_REF_TYPE" = "tag" ]; then
echo "Fetching Chainlink version from tag"
- chainlink_version="${{ github.ref_name }}"
+ chainlink_version="$GH_REF_NAME"
# strip the 'v' from the version, because we tag our Docker images without it
chainlink_image_version="${chainlink_version#v}"
cl_ref_path="releases"
@@ -253,13 +265,16 @@ jobs:
echo "cl_ref_path=$cl_ref_path" >> $GITHUB_OUTPUT
- name: Get image count
id: get-image-count
+ env:
+ GH_EVENT_INPUTS_BASE64_TEST_LIST: ${{ github.event.inputs.base64TestList }}
+ GH_EVENT_INPUTS_LATEST_VERSIONS_NUMBER: ${{ github.event.inputs.latestVersionsNumber }}
run: |
if [ "$GITHUB_EVENT_NAME" = "workflow_dispatch" ]; then
echo "Fetching latest image count from input"
- if [ -n "${{ github.event.inputs.base64TestList }}" ]; then
+ if [ -n "$GH_EVENT_INPUTS_BASE64_TEST_LIST" ]; then
echo "Base64-ed Test Input provided, ignoring latest image count"
else
- image_count="${{ github.event.inputs.latestVersionsNumber }}"
+ image_count="$GH_EVENT_INPUTS_LATEST_VERSIONS_NUMBER"
echo "image_count=$image_count" >> $GITHUB_OUTPUT
fi
else
@@ -326,6 +341,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ needs.select-versions.outputs.chainlink_version }}
- name: Build Chainlink Image
uses: ./.github/actions/build-chainlink-image
@@ -595,6 +611,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ needs.select-versions.outputs.chainlink_version }}
- name: Setup GAP for Grafana
@@ -668,9 +685,6 @@ jobs:
E2E_TEST_PYROSCOPE_KEY: ${{ secrets.QA_PYROSCOPE_KEY }}
E2E_TEST_PYROSCOPE_ENVIRONMENT: ci-client-compatability-${{ matrix.eth_client }}-testnet
E2E_TEST_PYROSCOPE_ENABLED: "true"
- E2E_TEST_LOGGING_RUN_ID: ${{ github.run_id }}
- E2E_TEST_LOG_COLLECT: ${{ vars.TEST_LOG_COLLECT }}
- E2E_TEST_LOG_STREAM_LOG_TARGETS: ${{ vars.LOGSTREAM_LOG_TARGETS }}
E2E_TEST_PRIVATE_ETHEREUM_EXECUTION_LAYER: ${{ matrix.evm_node.eth_implementation || 'geth' }}
E2E_TEST_PRIVATE_ETHEREUM_ETHEREUM_VERSION: auto_fill # Auto fill the version based on the docker image
E2E_TEST_PRIVATE_ETHEREUM_CUSTOM_DOCKER_IMAGE: ${{ matrix.evm_node.docker_image }}
@@ -854,6 +868,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ needs.select-versions.outputs.chainlink_version }}
- name: Get test results for ${{ matrix.product }}
id: get-product-results
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index d90139e5292..c0294645465 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -23,6 +23,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
@@ -55,6 +56,8 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Set up Go
if: ${{ matrix.type.language == 'go' && matrix.type.should-run == 'true' }}
diff --git a/.github/workflows/crib-integration-test.yml b/.github/workflows/crib-integration-test.yml
index 5dd24167ab0..df29b2e1b6a 100644
--- a/.github/workflows/crib-integration-test.yml
+++ b/.github/workflows/crib-integration-test.yml
@@ -6,9 +6,11 @@ on:
schedule:
- cron: "0 1 * * *"
workflow_call:
+
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
+
jobs:
test:
runs-on: ubuntu-latest
@@ -20,99 +22,24 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.1
-
- - uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27
with:
- nix_path: nixpkgs=channel:nixos-unstable
+ persist-credentials: false
- - name: setup-gap crib
- uses: smartcontractkit/.github/actions/setup-gap@00b58566e0ee2761e56d9db0ea72b783fdb89b8d # setup-gap@0.4.0
+ - name: Run CRIB Integration Tests
+ uses: ./.github/actions/crib
with:
- aws-role-duration-seconds: 3600 # 1 hour
aws-role-arn: ${{ secrets.AWS_OIDC_CRIB_ROLE_ARN_STAGE }}
- api-gateway-host: ${{ secrets.AWS_API_GW_HOST_CRIB_STAGE }}
aws-region: ${{ secrets.AWS_REGION }}
- ecr-private-registry: ${{ secrets.AWS_ACCOUNT_ID_PROD }}
+ aws-account-id: ${{ secrets.AWS_ACCOUNT_ID_PROD }}
+ api-gw-host-crib: ${{ secrets.AWS_API_GW_HOST_CRIB_STAGE }}
+ api-gw-host-k8s: ${{ secrets.AWS_API_GW_HOST_K8S_STAGE }}
+ k8s-api-endpoint: ${{ secrets.GAP_HOST_K8S_STAGE }}
k8s-cluster-name: ${{ secrets.AWS_K8S_CLUSTER_NAME_STAGE }}
- gap-name: crib
- use-private-ecr-registry: true
- use-tls: true
- proxy-port: 8080
- metrics-job-name: "test"
- gc-basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
- gc-host: ${{ secrets.GRAFANA_INTERNAL_HOST }}
- gc-org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
-
- - name: setup-gap k8s
- uses: smartcontractkit/.github/actions/setup-gap@00b58566e0ee2761e56d9db0ea72b783fdb89b8d # setup-gap@0.4.0
- with:
- aws-role-duration-seconds: 3600 # 1 hour
- aws-role-arn: ${{ secrets.AWS_OIDC_CRIB_ROLE_ARN_STAGE }}
- api-gateway-host: ${{ secrets.AWS_API_GW_HOST_K8S_STAGE }}
- aws-region: ${{ secrets.AWS_REGION }}
- ecr-private-registry: ${{ secrets.AWS_ACCOUNT_ID_PROD }}
- k8s-cluster-name: ${{ secrets.AWS_K8S_CLUSTER_NAME_STAGE }}
- gap-name: k8s
- use-private-ecr-registry: true
- use-k8s: true
- proxy-port: 8443
- metrics-job-name: "test"
- gc-basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
- gc-host: ${{ secrets.GRAFANA_INTERNAL_HOST }}
- gc-org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
-
- - name: Setup GitHub token using GATI
- id: token
- uses: smartcontractkit/.github/actions/setup-github-token@c0b38e6c40d72d01b8d2f24f92623a2538b3dedb # main
- with:
- aws-role-arn: ${{ secrets.AWS_OIDC_GLOBAL_READ_ONLY_TOKEN_ISSUER_ROLE_ARN }}
- aws-lambda-url: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL }}
- aws-region: ${{ secrets.AWS_REGION }}
- aws-role-duration-seconds: "1800"
- - name: Debug workspace dir
- shell: bash
- run: |
- echo ${{ github.workspace }}
- echo $GITHUB_WORKSPACE
-
- - name: Deploy and validate CRIB Environment for Core
- uses: smartcontractkit/.github/actions/crib-deploy-environment@d4d9ce3fad044642d8d2f7ae5aca9f8c78b0073a # crib-deploy-environment@2.1.2
- id: deploy-crib
- with:
- github-token: ${{ steps.token.outputs.access-token }}
- api-gateway-host: ${{ secrets.AWS_API_GW_HOST_K8S_STAGE }}
- aws-region: ${{ secrets.AWS_REGION }}
- aws-role-arn: ${{ secrets.AWS_OIDC_CRIB_ROLE_ARN_STAGE }}
- ecr-private-registry: ${{ secrets.AWS_ACCOUNT_ID_PROD }}
+ aws-token-issuer-role-arn: ${{ secrets.AWS_OIDC_GLOBAL_READ_ONLY_TOKEN_ISSUER_ROLE_ARN }}
+ aws-token-issuer-lambda-url: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL }}
ingress-base-domain: ${{ secrets.INGRESS_BASE_DOMAIN_STAGE }}
- k8s-cluster-name: ${{ secrets.AWS_K8S_CLUSTER_NAME_STAGE }}
- command: "core-dev-simulated-core-ocr1"
+ k8s-staging-ingress-suffix: ${{ secrets.K8S_STAGING_INGRESS_SUFFIX }}
+ gap-url-integration-tests: ${{ secrets.GAP_URL }}
crib-alert-slack-webhook: ${{ secrets.CRIB_ALERT_SLACK_WEBHOOK }}
- product-image: ${{ secrets.AWS_SDLC_ECR_HOSTNAME }}/chainlink
- product-image-tag: develop
- - uses: actions/checkout@v4.2.1
- - name: Set up Go
- uses: ./.github/actions/setup-go
- with:
- go-version-file: 'go.mod'
- - name: Run CRIB integration test
- working-directory: integration-tests/crib
- env:
- K8S_STAGING_INGRESS_SUFFIX: ${{ secrets.K8S_STAGING_INGRESS_SUFFIX }}
- CRIB_NAMESPACE: ${{ steps.deploy-crib.outputs.devspace-namespace }}
- CRIB_NETWORK: geth
- CRIB_NODES: 5
- GAP_URL: ${{ secrets.GAP_URL }}
- SETH_LOG_LEVEL: info
- # RESTY_DEBUG: true
- TEST_PERSISTENCE: true
- E2E_TEST_CHAINLINK_IMAGE: public.ecr.aws/chainlink/chainlink
- E2E_TEST_CHAINLINK_VERSION: latest
- run: |-
- go test -v -run TestCRIBChaos
- - name: Destroy CRIB Environment
- id: destroy
- if: always() && steps.deploy-crib.outputs.devspace-namespace != ''
- uses: smartcontractkit/.github/actions/crib-purge-environment@c0b38e6c40d72d01b8d2f24f92623a2538b3dedb # crib-purge-environment@0.1.0
- with:
- namespace: ${{ steps.deploy-crib.outputs.devspace-namespace }}
+ crib-chainlink-docker-image-name: ${{ secrets.AWS_SDLC_ECR_HOSTNAME }}/chainlink
+ crib-chainlink-docker-image-tag: develop
diff --git a/.github/workflows/delete-caches.yml b/.github/workflows/delete-caches.yml
index 64b9e799665..aa714d38815 100644
--- a/.github/workflows/delete-caches.yml
+++ b/.github/workflows/delete-caches.yml
@@ -21,7 +21,9 @@ jobs:
PR_NUMBER: ${{ github.event.pull_request.number }}
steps:
- name: Check out code
- uses: actions/checkout@v4.1.2
+ uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup gh-actions-cache extension
env:
diff --git a/.github/workflows/delete-deployments.yml b/.github/workflows/delete-deployments.yml
index 547b29bceec..ff24db42229 100644
--- a/.github/workflows/delete-deployments.yml
+++ b/.github/workflows/delete-deployments.yml
@@ -12,6 +12,8 @@ jobs:
steps:
- name: Checkout repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Clean up integration environment
uses: ./.github/actions/delete-deployments
diff --git a/.github/workflows/dependency-check.yml b/.github/workflows/dependency-check.yml
index 4b2a2f32f79..0b09747f509 100644
--- a/.github/workflows/dependency-check.yml
+++ b/.github/workflows/dependency-check.yml
@@ -26,6 +26,8 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Set up Go
if: needs.changes.outputs.src == 'true'
diff --git a/.github/workflows/flakeguard-nightly.yml b/.github/workflows/flakeguard-nightly.yml
index 178d43d809a..025cca6d0a0 100644
--- a/.github/workflows/flakeguard-nightly.yml
+++ b/.github/workflows/flakeguard-nightly.yml
@@ -21,4 +21,5 @@ jobs:
secrets:
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
+ FLAKEGUARD_SPLUNK_ENDPOINT: ${{ secrets.FLAKEGUARD_SPLUNK_ENDPOINT }}
+ FLAKEGUARD_SPLUNK_HEC: ${{ secrets.FLAKEGUARD_SPLUNK_HEC }}
diff --git a/.github/workflows/flakeguard-on-demand.yml b/.github/workflows/flakeguard-on-demand.yml
index 0ba84c5ab58..f6df40616f7 100644
--- a/.github/workflows/flakeguard-on-demand.yml
+++ b/.github/workflows/flakeguard-on-demand.yml
@@ -14,14 +14,13 @@ on:
description: 'The path to the project to run the flaky test detection.'
default: '.'
baseRef:
- required: true
+ required: false
type: string
- description: 'The base reference or branch to compare changes for detecting flaky tests.'
- default: 'origin/develop'
+ description: 'The base reference or branch to compare changes for detecting flaky tests. Set only when running diffs between branches. E.g. (develop)'
headRef:
required: false
type: string
- description: 'The head reference or branch to compare changes for detecting flaky tests. Default is the current branch.'
+ description: 'The head reference or branch to compare changes for detecting flaky tests. Default is the current branch. E.g. (develop)'
runAllTests:
required: false
type: boolean
@@ -70,4 +69,5 @@ jobs:
secrets:
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
\ No newline at end of file
+ FLAKEGUARD_SPLUNK_ENDPOINT: ${{ secrets.FLAKEGUARD_SPLUNK_ENDPOINT }}
+ FLAKEGUARD_SPLUNK_HEC: ${{ secrets.FLAKEGUARD_SPLUNK_HEC }}
diff --git a/.github/workflows/flakeguard.yml b/.github/workflows/flakeguard.yml
index 4c1aa695c62..0b3adb95fe7 100644
--- a/.github/workflows/flakeguard.yml
+++ b/.github/workflows/flakeguard.yml
@@ -6,6 +6,7 @@ on:
repoUrl:
required: true
type: string
+ default: 'https://github.com/smartcontractkit/chainlink'
description: 'The URL of the repository to compare changes for detecting flaky tests.'
projectPath:
required: true
@@ -15,11 +16,11 @@ on:
baseRef:
required: false
type: string
- description: 'The base reference or branch to compare changes for detecting flaky tests.'
+ description: 'The base reference or branch to compare changes for detecting flaky tests. Set only when running diffs between branches. E.g. (develop)'
headRef:
required: false
type: string
- description: 'The head reference or branch to compare changes for detecting flaky tests. Default is the current branch.'
+ description: 'The head reference or branch to compare changes for detecting flaky tests. Default is the current branch. E.g. (develop)'
runAllTests:
required: false
type: boolean
@@ -54,8 +55,15 @@ on:
required: false
GH_TOKEN:
required: true
+ FLAKEGUARD_SPLUNK_ENDPOINT:
+ description: "The Splunk HTTP Event Collector (HEC) endpoint."
+ required: true
+ FLAKEGUARD_SPLUNK_HEC:
+ description: "The Splunk HTTP Event Collector (HEC) token."
+ required: true
env:
+ GIT_BASE_REF: ${{ inputs.baseRef }}
GIT_HEAD_REF: ${{ inputs.headRef || github.ref }}
SKIPPED_TESTS: ${{ fromJSON(inputs.extraArgs)['skipped_tests'] || '' }} # Comma separated list of test names to skip running in the flaky detector. Related issue: TT-1823
DEFAULT_MAX_RUNNER_COUNT: ${{ fromJSON(inputs.extraArgs)['default_max_runner_count'] || '8' }} # The default maximum number of GitHub runners to use for parallel test execution.
@@ -67,7 +75,7 @@ env:
ALL_TESTS_RUNNER: ${{ fromJSON(inputs.extraArgs)['all_tests_runner'] || 'ubuntu22.04-32cores-128GB' }} # The runner to use for running all tests.
DEFAULT_RUNNER: 'ubuntu-latest' # The default runner to use for running tests.
UPLOAD_ALL_TEST_RESULTS: ${{ fromJSON(inputs.extraArgs)['upload_all_test_results'] || 'false' }} # Whether to upload all test results as artifacts.
-
+ OMIT_TEST_OUTPUTS_ON_SUCCESS: ${{ fromJSON(inputs.extraArgs)['omit_test_outputs_on_success'] || 'true' }}
jobs:
get-tests:
@@ -80,29 +88,51 @@ jobs:
affected_test_packages: ${{ steps.get-tests.outputs.packages }}
git_head_sha: ${{ steps.get_commit_sha.outputs.git_head_sha }}
git_head_short_sha: ${{ steps.get_commit_sha.outputs.git_head_short_sha }}
+ git_base_sha: ${{ steps.get_commit_sha.outputs.git_base_sha }}
steps:
- name: Checkout repository
- uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
+ uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
fetch-depth: 0
ref: ${{ env.GIT_HEAD_REF }}
- - name: Get commit SHA
+ - name: Get SHA
id: get_commit_sha
run: |
+ # Resolve HEAD SHA
git_head_sha=$(git rev-parse HEAD)
git_head_short_sha=$(git rev-parse --short HEAD)
echo "git_head_sha=$git_head_sha" >> $GITHUB_OUTPUT
echo "git_head_short_sha=$git_head_short_sha" >> $GITHUB_OUTPUT
- - name: Set up Go 1.21.9
- uses: actions/setup-go@v5.0.2
+ # Print HEAD SHAs to the console
+ echo "HEAD SHA: $git_head_sha"
+ echo "HEAD Short SHA: $git_head_short_sha"
+
+ # Conditionally resolve BASE SHA
+ if [ -n "${{ env.GIT_BASE_REF }}" ]; then
+ git fetch origin ${{ env.GIT_BASE_REF }} --quiet
+
+ git_base_sha=$(git rev-parse origin/${{ env.GIT_BASE_REF }})
+ echo "git_base_sha=$git_base_sha" >> $GITHUB_OUTPUT
+
+ # Print BASE SHA to the console
+ echo "BASE SHA: $git_base_sha"
+ else
+ echo "BASE SHA not provided."
+ echo "git_base_sha=" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Setup Go
+ uses: ./.github/actions/setup-go
with:
- cache: false
+ restore-build-cache-only: "true"
- name: Install flakeguard
+ if: ${{ inputs.runAllTests == false }}
shell: bash
- run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@404e04e1e2e2dd5a384b09bd05b8d80409b6609a # flakguard@0.1.0
+ run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@7c45cff27ac6b0d4244754660661cdbfcfaf2f9e # flakguard@0.1.0
- name: Find new or updated test packages
if: ${{ inputs.runAllTests == false }}
@@ -111,11 +141,14 @@ jobs:
env:
# Needed to run go test -list
CL_DATABASE_URL: postgresql://postgres@localhost:5432/chainlink_test?sslmode=disable
+ GH_INPUTS_PROJECT_PATH: ${{ inputs.projectPath }}
+ GH_INPUTS_FIND_BY_TEST_FILES_DIFF: ${{ inputs.findByTestFilesDiff }}
+ GH_INPUTS_FIND_BY_AFFECTED_PACKAGES: ${{ inputs.findByAffectedPackages }}
run: |
PATH=$PATH:$(go env GOPATH)/bin
export PATH
- PACKAGES=$(flakeguard find --find-by-test-files-diff=${{ inputs.findByTestFilesDiff }} --find-by-affected-packages=${{ inputs.findByAffectedPackages }} --base-ref=origin/${{ inputs.baseRef }} --project-path=${{ inputs.projectPath }})
+ PACKAGES=$(flakeguard find --find-by-test-files-diff=$GH_INPUTS_FIND_BY_TEST_FILES_DIFF --find-by-affected-packages=$GH_INPUTS_FIND_BY_AFFECTED_PACKAGES --base-ref=origin/${{ env.GIT_BASE_REF }} --project-path=${GH_INPUTS_PROJECT_PATH})
echo $PACKAGES
echo "packages=$PACKAGES" >> $GITHUB_OUTPUT
@@ -126,19 +159,22 @@ jobs:
env:
# Needed to run go test -list
CL_DATABASE_URL: postgresql://postgres@localhost:5432/chainlink_test?sslmode=disable
+ GH_INPUTS_PROJECT_PATH: ${{ inputs.projectPath }}
run: |
PATH=$PATH:$(go env GOPATH)/bin
export PATH
- TEST_FILES=$(flakeguard find --only-show-changed-test-files=true --base-ref=origin/${{ inputs.baseRef }} --project-path=${{ inputs.projectPath }})
+ TEST_FILES=$(flakeguard find --only-show-changed-test-files=true --base-ref=origin/${{ env.GIT_BASE_REF }} --project-path=${GH_INPUTS_PROJECT_PATH})
echo $TEST_FILES
echo "test_files=$TEST_FILES" >> $GITHUB_OUTPUT
- name: Split test packages into groups
id: split-packages
shell: bash
+ env:
+ GH_INPUTS_RUN_ALL_TESTS: ${{ inputs.runAllTests }}
run: |
- if [[ "${{ inputs.runAllTests }}" == "true" ]]; then
+ if [[ "$GH_INPUTS_RUN_ALL_TESTS" == "true" ]]; then
# Use ALL_TESTS_RUNNER for a specified number of groups, each with "./..." to run all tests
ALL_TESTS_RUNNER_COUNT=${{ env.ALL_TESTS_RUNNER_COUNT }}
@@ -206,8 +242,9 @@ jobs:
DB_URL: postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable
steps:
- name: Checkout repository
- uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
+ uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ env.GIT_HEAD_REF }}
- name: Setup NodeJS
@@ -251,8 +288,10 @@ jobs:
- name: Go mod tidy
shell: bash
+ env:
+ GH_INPUTS_PROJECT_PATH: ${{ inputs.projectPath }}
run: |
- cd ${{ inputs.projectPath }}
+ cd $GH_INPUTS_PROJECT_PATH
go mod tidy
- name: Generate random id
@@ -261,13 +300,15 @@ jobs:
- name: Install flakeguard
shell: bash
- run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@404e04e1e2e2dd5a384b09bd05b8d80409b6609a # flakguard@0.1.0
+ run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@7c45cff27ac6b0d4244754660661cdbfcfaf2f9e # flakguard@0.1.0
- name: Run tests with flakeguard
shell: bash
- run: flakeguard run --project-path=${{ inputs.projectPath }} --test-packages=${{ matrix.testPackages }} --run-count=${{ env.TEST_REPEAT_COUNT }} --max-pass-ratio=${{ inputs.maxPassRatio }} --race=${{ env.RUN_WITH_RACE }} --shuffle=${{ env.RUN_WITH_SHUFFLE }} --shuffle-seed=${{ env.SHUFFLE_SEED }} --skip-tests=${{ env.SKIPPED_TESTS }} --output-json=test-result.json
env:
+ GH_INPUTS_PROJECT_PATH: ${{ inputs.projectPath }}
+ GH_INPUTS_MAX_PASS_RATIO: ${{ inputs.maxPassRatio }}
CL_DATABASE_URL: ${{ env.DB_URL }}
+ run: flakeguard run --project-path=$GH_INPUTS_PROJECT_PATH --test-packages=${{ matrix.testPackages }} --run-count=${{ env.TEST_REPEAT_COUNT }} --max-pass-ratio=$GH_INPUTS_MAX_PASS_RATIO --race=${{ env.RUN_WITH_RACE }} --shuffle=${{ env.RUN_WITH_SHUFFLE }} --shuffle-seed=${{ env.SHUFFLE_SEED }} --skip-tests=${{ env.SKIPPED_TESTS }} --output-json=test-result.json --omit-test-outputs-on-success=${{ env.OMIT_TEST_OUTPUTS_ON_SUCCESS }}
- name: Upload test result as artifact
if: always()
@@ -281,22 +322,29 @@ jobs:
needs: [get-tests, run-tests]
if: always()
name: Report
- runs-on: ubuntu-24.04-8cores-32GB-ARM # Use a runner with more resources to avoid OOM errors when aggregating test results.
+ runs-on: ubuntu-latest
outputs:
test_results: ${{ steps.results.outputs.results }}
steps:
- name: Checkout repository
- uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
+ uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ env.GIT_HEAD_REF }}
+ - name: Setup Go
+ uses: ./.github/actions/setup-go
+ with:
+ restore-build-cache-only: "true"
- name: Set Pretty Project Path
id: set_project_path_pretty
+ env:
+ GH_INPUTS_PROJECT_PATH: ${{ inputs.projectPath }}
run: |
- if [ "${{ inputs.projectPath }}" = "." ]; then
+ if [ "$GH_INPUTS_PROJECT_PATH" = "." ]; then
echo "path=github.com/${{ github.repository }}" >> $GITHUB_OUTPUT
else
- echo "path=github.com/${{ github.repository }}/${{ inputs.projectPath }}" >> $GITHUB_OUTPUT
+ echo "path=github.com/${{ github.repository }}/${GH_INPUTS_PROJECT_PATH}" >> $GITHUB_OUTPUT
fi
- name: Download all test result artifacts
@@ -308,11 +356,14 @@ jobs:
- name: Install flakeguard
shell: bash
- run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@404e04e1e2e2dd5a384b09bd05b8d80409b6609a # flakguard@0.1.0
+ run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@7c45cff27ac6b0d4244754660661cdbfcfaf2f9e # flakguard@0.1.0
- name: Aggregate Flakeguard Results
id: results
shell: bash
+ env:
+ GH_INPUTS_REPO_URL: ${{ inputs.repoUrl }}
+ GH_INPUTS_MAX_PASS_RATIO: ${{ inputs.maxPassRatio }}
run: |
set -e # Exit immediately if a command exits with a non-zero status.
@@ -329,7 +380,15 @@ jobs:
--output-path ./flakeguard-report \
--repo-path "${{ github.workspace }}" \
--codeowners-path "${{ github.workspace }}/.github/CODEOWNERS" \
- --max-pass-ratio "${{ inputs.maxPassRatio }}"
+ --max-pass-ratio "$GH_INPUTS_MAX_PASS_RATIO" \
+ --repo-url "$GH_INPUTS_REPO_URL" \
+ --base-sha "${{ needs.get-tests.outputs.git_base_sha }}" \
+ --head-sha "${{ needs.get-tests.outputs.git_head_sha }}" \
+ --github-workflow-name "${{ github.workflow }}" \
+ --github-workflow-run-url "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \
+ --splunk-url "${{ secrets.FLAKEGUARD_SPLUNK_ENDPOINT }}" \
+ --splunk-token "${{ secrets.FLAKEGUARD_SPLUNK_HEC }}" \
+ --splunk-event "${{ github.event }}"
# Print out the summary file
echo -e "\nFlakeguard Summary:"
@@ -340,7 +399,7 @@ jobs:
echo "summary=$summary" >> $GITHUB_OUTPUT
- name: Upload All Test Results as Artifact
- if: ${{ fromJSON(steps.results.outputs.summary).total_tests > 0 }}
+ if: ${{ (success() || failure()) && fromJSON(steps.results.outputs.summary).total_tests > 0 }}
uses: actions/upload-artifact@v4.4.3
with:
path: ./flakeguard-report/all-test-results.json
@@ -348,7 +407,7 @@ jobs:
retention-days: 90
- name: Upload Failed Test Results as Artifact
- if: ${{ fromJSON(steps.results.outputs.summary).failed_runs > 0 }}
+ if: ${{ (success() || failure()) && fromJSON(steps.results.outputs.summary).failed_runs > 0 }}
uses: actions/upload-artifact@v4.4.3
with:
path: ./flakeguard-report/failed-test-results.json
@@ -356,7 +415,7 @@ jobs:
retention-days: 90
- name: Upload Failed Test Results With Logs as Artifact
- if: ${{ fromJSON(steps.results.outputs.summary).failed_runs > 0 }}
+ if: ${{ (success() || failure()) && fromJSON(steps.results.outputs.summary).failed_runs > 0 }}
uses: actions/upload-artifact@v4.4.3
with:
path: ./flakeguard-report/failed-test-results-with-logs.json
@@ -365,8 +424,13 @@ jobs:
- name: Generate Flakeguard Reports
shell: bash
+ if: success() || failure()
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
+ GH_INPUTS_MAX_PASS_RATIO: ${{ inputs.maxPassRatio }}
+ GH_EVENT_NAME: ${{ github.event_name }}
+ GH_EVENT_PULL_REQUEST_BASE_REF: ${{ github.event.pull_request.base.ref }}
+ GH_EVENT_PULL_REQUEST_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
set -e # Exit immediately if a command exits with a non-zero status.
@@ -375,7 +439,7 @@ jobs:
export PATH
# Check if the event is a pull request
- if [ "${{ github.event_name }}" = "pull_request" ]; then
+ if [ "$GH_EVENT_NAME" = "pull_request" ]; then
flakeguard generate-report \
--aggregated-results-path ./flakeguard-report/all-test-results.json \
--summary-path ./flakeguard-report/all-test-summary.json \
@@ -384,12 +448,12 @@ jobs:
--github-run-id "${{ github.run_id }}" \
--failed-tests-artifact-name "failed-test-results-with-logs.json" \
--generate-pr-comment \
- --base-branch "${{ github.event.pull_request.base.ref }}" \
+ --base-branch "$GH_EVENT_PULL_REQUEST_BASE_REF" \
--current-branch "${{ github.head_ref }}" \
- --current-commit-sha "${{ github.event.pull_request.head.sha }}" \
+ --current-commit-sha "$GH_EVENT_PULL_REQUEST_HEAD_SHA" \
--repo-url "https://github.com/${{ github.repository }}" \
--action-run-id "${{ github.run_id }}" \
- --max-pass-ratio "${{ inputs.maxPassRatio }}"
+ --max-pass-ratio "$GH_INPUTS_MAX_PASS_RATIO"
else
flakeguard generate-report \
--aggregated-results-path ./flakeguard-report/all-test-results.json \
@@ -398,15 +462,16 @@ jobs:
--github-repository "${{ github.repository }}" \
--github-run-id "${{ github.run_id }}" \
--failed-tests-artifact-name "failed-test-results-with-logs.json" \
- --base-branch "${{ github.event.pull_request.base.ref }}" \
+ --base-branch "$GH_EVENT_PULL_REQUEST_BASE_REF" \
--current-branch "${{ github.head_ref }}" \
- --current-commit-sha "${{ github.event.pull_request.head.sha }}" \
+ --current-commit-sha "$GH_EVENT_PULL_REQUEST_HEAD_SHA" \
--repo-url "https://github.com/${{ github.repository }}" \
--action-run-id "${{ github.run_id }}" \
- --max-pass-ratio "${{ inputs.maxPassRatio }}"
+ --max-pass-ratio "$GH_INPUTS_MAX_PASS_RATIO"
fi
- name: Add Github Summary
+ if: (success() || failure())
run: |
FILE_SIZE=$(wc -c < ./flakeguard-report/all-test-summary.md)
echo "File size: $FILE_SIZE bytes"
@@ -421,7 +486,7 @@ jobs:
fi
- name: Post comment on PR if flaky tests found
- if: ${{ fromJSON(steps.results.outputs.summary).flaky_tests > 0 && github.event_name == 'pull_request' }}
+ if: ${{ (success() || failure()) && fromJSON(steps.results.outputs.summary).flaky_tests > 0 && github.event_name == 'pull_request' }}
uses: actions/github-script@v7
continue-on-error: true
with:
@@ -438,7 +503,7 @@ jobs:
});
- name: Send Slack message for failed tests
- if: ${{ inputs.slackNotificationAfterTestsChannelId != '' && fromJSON(steps.results.outputs.summary).flaky_tests > 0 }}
+ if: ${{ (success() || failure()) && inputs.slackNotificationAfterTestsChannelId != '' && fromJSON(steps.results.outputs.summary).flaky_tests > 0 }}
uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
@@ -461,7 +526,7 @@ jobs:
"type": "section",
"text": {
"type": "mrkdwn",
- "text": "${{ inputs.runAllTests == true && format('Ran all tests for `{0}` branch.', inputs.headRef) || format('Ran changed tests between `{0}` and `{1}` (`{2}`).', inputs.baseRef, needs.get-tests.outputs.git_head_short_sha, env.GIT_HEAD_REF) }}"
+ "text": "${{ inputs.runAllTests == true && format('Ran all tests for `{0}` branch.', env.GIT_HEAD_REF) || format('Ran changed tests between `{0}` and `{1}` (`{2}`).', env.GIT_BASE_REF, needs.get-tests.outputs.git_head_short_sha, env.GIT_HEAD_REF) }}"
}
},
{
@@ -481,7 +546,7 @@ jobs:
"type": "section",
"text": {
"type": "mrkdwn",
- "text": "${{ format('<{0}/{1}/actions/runs/{2}|View Flaky Detector Details> | <{3}/compare/{4}...{5}#files_bucket|Compare Changes>{6}', github.server_url, github.repository, github.run_id, inputs.repoUrl, inputs.baseRef, needs.get-tests.outputs.git_head_sha, github.event_name == 'pull_request' && format(' | <{0}|View PR>', github.event.pull_request.html_url) || '') }}"
+ "text": "${{ format('<{0}/{1}/actions/runs/{2}|View Flaky Detector Details> | <{3}/compare/{4}...{5}#files_bucket|Compare Changes>{6}', github.server_url, github.repository, github.run_id, inputs.repoUrl, env.GIT_BASE_REF, needs.get-tests.outputs.git_head_sha, github.event_name == 'pull_request' && format(' | <{0}|View PR>', github.event.pull_request.html_url) || '') }}"
}
}
]
@@ -491,7 +556,7 @@ jobs:
- name: Send general Slack message
uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0
- if: ${{ inputs.slackNotificationAfterTestsChannelId != '' && fromJSON(steps.results.outputs.summary).flaky_tests == 0 && fromJSON(steps.results.outputs.summary).total_tests > 0 }}
+ if: ${{ (success() || failure()) && inputs.slackNotificationAfterTestsChannelId != '' && fromJSON(steps.results.outputs.summary).flaky_tests == 0 && fromJSON(steps.results.outputs.summary).total_tests > 0 }}
id: slack
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
@@ -514,7 +579,7 @@ jobs:
"type": "section",
"text": {
"type": "mrkdwn",
- "text": "${{ inputs.runAllTests == true && format('Ran all tests for `{0}` branch.', env.GIT_HEAD_REF) || format('Ran changed tests between `{0}` and `{1}` (`{2}`).', inputs.baseRef, needs.get-tests.outputs.git_head_short_sha, env.GIT_HEAD_REF) }}"
+ "text": "${{ inputs.runAllTests == true && format('Ran all tests for `{0}` branch.', env.GIT_HEAD_REF) || format('Ran changed tests between `{0}` and `{1}` (`{2}`).', env.GIT_BASE_REF, needs.get-tests.outputs.git_head_short_sha, env.GIT_HEAD_REF) }}"
}
},
{
diff --git a/.github/workflows/go-mod-cache.yml b/.github/workflows/go-mod-cache.yml
index 3caac1eff3f..e90e6a9f285 100644
--- a/.github/workflows/go-mod-cache.yml
+++ b/.github/workflows/go-mod-cache.yml
@@ -31,6 +31,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup Go
uses: ./.github/actions/setup-go
diff --git a/.github/workflows/integration-chaos-tests.yml b/.github/workflows/integration-chaos-tests.yml
index 314e54a1ab8..c9f7f2661ec 100644
--- a/.github/workflows/integration-chaos-tests.yml
+++ b/.github/workflows/integration-chaos-tests.yml
@@ -6,11 +6,49 @@ on:
tags:
- "*"
workflow_dispatch:
+ inputs:
+ team:
+ description: Team to run the tests for (e.g. BIX, CCIP)
+ required: true
+ type: string
jobs:
+ run-e2e-tests-workflow-dispatch:
+ name: Run E2E Tests (Workflow Dispatch)
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0d4a2b2b009c87b5c366d0b97f7a8d7de2f60760
+ if: github.event_name == 'workflow_dispatch'
+ with:
+ test_path: .github/e2e-tests.yml
+ chainlink_version: ${{ github.sha }}
+ require_chainlink_image_versions_in_qa_ecr: ${{ github.sha }}
+ test_trigger: E2E Chaos Tests
+ test_log_level: debug
+ team: ${{ inputs.team }}
+ secrets:
+ QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }}
+ QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
+ QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
+ PROD_AWS_ACCOUNT_NUMBER: ${{ secrets.AWS_ACCOUNT_ID_PROD }}
+ QA_PYROSCOPE_INSTANCE: ${{ secrets.QA_PYROSCOPE_INSTANCE }}
+ QA_PYROSCOPE_KEY: ${{ secrets.QA_PYROSCOPE_KEY }}
+ QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
+ GRAFANA_INTERNAL_TENANT_ID: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ GRAFANA_INTERNAL_BASIC_AUTH: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ GRAFANA_INTERNAL_HOST: ${{ secrets.GRAFANA_INTERNAL_HOST }}
+ GRAFANA_INTERNAL_URL_SHORTENER_TOKEN: ${{ secrets.GRAFANA_INTERNAL_URL_SHORTENER_TOKEN }}
+ LOKI_TENANT_ID: ${{ secrets.LOKI_TENANT_ID }}
+ LOKI_URL: ${{ secrets.LOKI_URL }}
+ LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ AWS_REGION: ${{ secrets.QA_AWS_REGION }}
+ AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }}
+ AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }}
+ SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
+
run-e2e-tests-workflow:
- name: Run E2E Tests
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@5412507526722a7b1c5d719fa686eed5a1bc4035 # ctf-run-tests@0.2.0
+ name: Run E2E Tests (Push and Sechedule)
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0d4a2b2b009c87b5c366d0b97f7a8d7de2f60760
+ if: github.event_name != 'workflow_dispatch'
with:
test_path: .github/e2e-tests.yml
chainlink_version: ${{ github.sha }}
@@ -32,8 +70,9 @@ jobs:
LOKI_TENANT_ID: ${{ secrets.LOKI_TENANT_ID }}
LOKI_URL: ${{ secrets.LOKI_URL }}
LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }}
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
AWS_REGION: ${{ secrets.QA_AWS_REGION }}
AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }}
- AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }}
+ AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }}
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
+
diff --git a/.github/workflows/integration-in-memory-tests.yml b/.github/workflows/integration-in-memory-tests.yml
index 8d777b41ea1..e124b12eb28 100644
--- a/.github/workflows/integration-in-memory-tests.yml
+++ b/.github/workflows/integration-in-memory-tests.yml
@@ -33,6 +33,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref }}
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
@@ -73,7 +74,7 @@ jobs:
contents: read
needs: changes
if: github.event_name == 'pull_request' && ( needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
- uses: smartcontractkit/.github/.github/workflows/run-integration-tests.yml@57112554b9e5cfae79e795a8b1c36acf7e9dead7
+ uses: smartcontractkit/.github/.github/workflows/run-integration-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
workflow_name: Run CCIP Integration Tests For PR
test_path: .github/integration-in-memory-tests.yml
@@ -95,7 +96,7 @@ jobs:
contents: read
needs: changes
if: github.event_name == 'merge_group' && ( needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
- uses: smartcontractkit/.github/.github/workflows/run-integration-tests.yml@57112554b9e5cfae79e795a8b1c36acf7e9dead7
+ uses: smartcontractkit/.github/.github/workflows/run-integration-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
workflow_name: Run CCIP Integration Tests For Merge Queue
test_path: .github/integration-in-memory-tests.yml
@@ -134,6 +135,7 @@ jobs:
if: ${{ github.event_name == 'pull_request' }}
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref }}
diff --git a/.github/workflows/integration-tests-publish.yml b/.github/workflows/integration-tests-publish.yml
index df07cc1e231..523974b4aed 100644
--- a/.github/workflows/integration-tests-publish.yml
+++ b/.github/workflows/integration-tests-publish.yml
@@ -23,6 +23,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Setup Other Tags If Not Workflow Dispatch
id: tags
@@ -68,6 +69,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ github.sha }}
- name: Build Chainlink Image
uses: ./.github/actions/build-chainlink-image
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index 2c11d7568aa..33bb7721d77 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -1,3 +1,5 @@
+# N/B: ci-core, which runs on PRs, will trigger linting for affected directories/modules
+# no need to run lint twice
name: Integration Tests
run-name: Integration Tests ${{ inputs.distinct_run_name && inputs.distinct_run_name || '' }}
on:
@@ -52,6 +54,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref }}
- name: Check Merge Group Condition
@@ -86,6 +89,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref }}
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
@@ -116,47 +120,6 @@ jobs:
core_changes: ${{ steps.ignore-filter.outputs.changes || steps.changes.outputs.core_changes }}
ccip_changes: ${{ steps.ignore-filter.outputs.changes || steps.changes.outputs.ccip_changes }}
- lint-integration-tests:
- name: Lint ${{ matrix.project.name }}
- runs-on: ubuntu-24.04-8cores-32GB-ARM
- # We don't directly merge dependabot PRs, so let's not waste the resources
- if: github.actor != 'dependabot[bot]'
- strategy:
- matrix:
- project:
- - name: integration-tests
- id: e2e-tests
- path: ./integration-tests
- cache_id: e2e-tests
- - name: load
- id: load
- path: ./integration-tests/load
- cache_id: load
- steps:
- - name: Checkout the repo
- uses: actions/checkout@v4.2.1
- with:
- repository: smartcontractkit/chainlink
- ref: ${{ inputs.cl_ref }}
- - name: Setup Go
- uses: smartcontractkit/.github/actions/ctf-setup-go@b0d756c57fcdbcff187e74166562a029fdd5d1b9 # ctf-setup-go@0.0.0
- with:
- test_download_vendor_packages_command: cd ${{ matrix.project.path }} && go mod download
- go_mod_path: ${{ matrix.project.path }}/go.mod
- cache_key_id: ${{ matrix.project.cache_id }}
- cache_restore_only: "true"
- - name: Lint Go
- uses: golangci/golangci-lint-action@3cfe3a4abbb849e10058ce4af15d205b6da42804 # v4.0.0
- with:
- version: v1.62.0
- # We already cache these directories in setup-go
- skip-pkg-cache: true
- skip-build-cache: true
- # only-new-issues is only applicable to PRs, otherwise it is always set to false
- only-new-issues: false # disabled for PRs due to unreliability
- args: --out-format colored-line-number,checkstyle:golangci-lint-report.xml
- working-directory: ${{ matrix.project.path }}
-
build-chainlink:
environment: integration
permissions:
@@ -171,6 +134,7 @@ jobs:
- name: (plugins)
dockerfile: plugins/chainlink.Dockerfile
tag-suffix: -plugins
+
name: Build Chainlink Image ${{ matrix.image.name }}
runs-on: ubuntu22.04-8cores-32GB
needs: [changes, enforce-ctf-version]
@@ -178,6 +142,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }}
- name: Setup Github Token
@@ -210,7 +175,7 @@ jobs:
contents: read
needs: [build-chainlink, changes]
if: github.event_name == 'pull_request' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@27467f0073162e0ca77d33ce26f649b3d0f4c188 #ctf-run-tests@0.2.0
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
workflow_name: Run Core E2E Tests For PR
chainlink_version: ${{ inputs.evm-ref || github.sha }}
@@ -251,7 +216,7 @@ jobs:
contents: read
needs: [build-chainlink, changes]
if: github.event_name == 'merge_group' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@27467f0073162e0ca77d33ce26f649b3d0f4c188 #ctf-run-tests@1.0.0
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
workflow_name: Run Core E2E Tests For Merge Queue
chainlink_version: ${{ inputs.evm-ref || github.sha }}
@@ -296,7 +261,7 @@ jobs:
contents: read
needs: [build-chainlink, changes]
if: github.event_name == 'pull_request' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0d4a2b2b009c87b5c366d0b97f7a8d7de2f60760
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
workflow_name: Run CCIP E2E Tests For PR
chainlink_version: ${{ inputs.evm-ref || github.sha }}
@@ -338,7 +303,7 @@ jobs:
contents: read
needs: [build-chainlink, changes]
if: github.event_name == 'merge_group' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true')
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0d4a2b2b009c87b5c366d0b97f7a8d7de2f60760
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
workflow_name: Run CCIP E2E Tests For Merge Queue
chainlink_version: ${{ inputs.evm-ref || github.sha }}
@@ -374,7 +339,7 @@ jobs:
if: always()
name: ETH Smoke Tests
runs-on: ubuntu-latest
- needs: [lint-integration-tests, run-core-e2e-tests-for-pr, run-ccip-e2e-tests-for-pr, run-core-e2e-tests-for-merge-queue, run-ccip-e2e-tests-for-merge-queue]
+ needs: [run-core-e2e-tests-for-pr, run-ccip-e2e-tests-for-pr, run-core-e2e-tests-for-merge-queue, run-ccip-e2e-tests-for-merge-queue]
steps:
- name: Check Core test results
id: check_core_results
@@ -414,10 +379,6 @@ jobs:
if: always() && needs.run-core-e2e-tests-for-merge-queue.result == 'failure'
run: exit 1
- - name: Fail the job if lint not successful
- if: always() && needs.lint-integration-tests.result == 'failure'
- run: exit 1
-
cleanup:
name: Clean up integration environment deployments
if: always()
@@ -428,6 +389,7 @@ jobs:
if: ${{ github.event_name == 'pull_request' }}
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref }}
@@ -447,6 +409,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }}
- name: Download All Artifacts
@@ -471,6 +434,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }}
- name: Setup Go
@@ -491,6 +455,7 @@ jobs:
- name: Checkout solana
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink-solana
ref: develop
fetch-depth: 0
@@ -518,6 +483,7 @@ jobs:
- name: Checkout the solana repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink-solana
ref: ${{ needs.get_solana_sha.outputs.sha }}
- name: Get ProjectSerum Version
@@ -566,6 +532,7 @@ jobs:
- name: Checkout the solana repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink-solana
ref: ${{ needs.get_solana_sha.outputs.sha }}
- name: Build contracts
@@ -600,6 +567,7 @@ jobs:
if: (needs.changes.outputs.core_changes == 'true' || github.event_name == 'workflow_dispatch') && needs.solana-test-image-exists.outputs.exists == 'false'
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink-solana
ref: ${{ needs.get_solana_sha.outputs.sha }}
- name: Download Artifacts
@@ -648,6 +616,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/chainlink-solana
ref: ${{ needs.get_solana_sha.outputs.sha }}
- name: Run Setup
@@ -688,10 +657,13 @@ jobs:
yarn --cwd ./gauntlet build
yarn --cwd ./gauntlet gauntlet
- name: Generate config overrides
+ env:
+ GH_INPUTS_EVM_REF: ${{ inputs.evm-ref }}
+ GH_SHA: ${{ github.sha }}
run: | # https://github.com/smartcontractkit/chainlink-testing-framework/lib/blob/main/config/README.md
cat << EOF > config.toml
[ChainlinkImage]
- version="${{ inputs.evm-ref || github.sha }}"
+ version="${{ env.evm-ref || env.GH_SHA }}"
[Common]
user="${{ github.actor }}"
internal_docker_repo = "${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com"
diff --git a/.github/workflows/lint-gh-workflows.yml b/.github/workflows/lint-gh-workflows.yml
index 9897c023576..a3aaacb1abe 100644
--- a/.github/workflows/lint-gh-workflows.yml
+++ b/.github/workflows/lint-gh-workflows.yml
@@ -8,5 +8,7 @@ jobs:
steps:
- name: Check out Code
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Run actionlint
uses: reviewdog/action-actionlint@c6ee1eb0a5d47b2af53a203652b5dac0b6c4016e # v1.43.0
diff --git a/.github/workflows/on-demand-vrfv2-performance-test.yml b/.github/workflows/on-demand-vrfv2-performance-test.yml
index aadef377718..2f3ea12cbe2 100644
--- a/.github/workflows/on-demand-vrfv2-performance-test.yml
+++ b/.github/workflows/on-demand-vrfv2-performance-test.yml
@@ -34,13 +34,17 @@ jobs:
runs-on: ubuntu-latest
outputs:
test_list: ${{ steps.set-tests.outputs.test_list }}
+ env:
+ GH_INPUTS_TEST_LIST_REGEX: ${{ inputs.test_list_regex }}
+ GH_INPUTS_TEST_CONFIG_OVERRIDE_PATH: ${{ inputs.test_config_override_path }}
+ GH_INPUTS_PERFORMANCE_TEST_TYPE: ${{ inputs.performanceTestType }}
steps:
- name: Generate Test List JSON
id: set-tests
run: |
- TEST_CMD='cd integration-tests/load && go test -v -count=1 -timeout 24h -run "${{ inputs.test_list_regex }}" ./vrfv2'
- TEST_CONFIG_OVERRIDE_PATH=${{ inputs.test_config_override_path }}
- TEST_TYPE=${{ inputs.performanceTestType }}
+ TEST_CMD='cd integration-tests/load && go test -v -count=1 -timeout 24h -run "$GH_INPUTS_TEST_LIST_REGEX" ./vrfv2'
+ TEST_CONFIG_OVERRIDE_PATH=$GH_INPUTS_TEST_CONFIG_OVERRIDE_PATH
+ TEST_TYPE=$GH_INPUTS_PERFORMANCE_TEST_TYPE
TEST_LIST=$(jq -n -c \
--arg test_cmd "$TEST_CMD" \
@@ -67,7 +71,7 @@ jobs:
run-e2e-tests-workflow:
name: Run E2E Tests
needs: set-tests-to-run
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@5412507526722a7b1c5d719fa686eed5a1bc4035 # ctf-run-tests@0.2.0
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
custom_test_list_json: ${{ needs.set-tests-to-run.outputs.test_list }}
chainlink_version: ${{ inputs.chainlink_version }}
diff --git a/.github/workflows/on-demand-vrfv2-smoke-tests.yml b/.github/workflows/on-demand-vrfv2-smoke-tests.yml
index 4ebc38a8081..db242c1aae2 100644
--- a/.github/workflows/on-demand-vrfv2-smoke-tests.yml
+++ b/.github/workflows/on-demand-vrfv2-smoke-tests.yml
@@ -41,13 +41,17 @@ jobs:
steps:
- name: Generate Test List JSON
id: set-tests
+ env:
+ GH_INPUTS_TEST_SUITE: ${{ inputs.test_suite }}
+ GH_INPUTS_TEST_LIST_REGEX: ${{ inputs.test_list_regex }}
+ GH_INPUTS_TEST_CONFIG_OVERRIDE_PATH: ${{ inputs.test_config_override_path }}
run: |
- if [[ "${{ inputs.test_suite }}" == "All Tests" ]]; then
+ if [[ "$GH_INPUTS_TEST_SUITE" == "All Tests" ]]; then
TEST_CMD="cd integration-tests/smoke && go test vrfv2_test.go -test.parallel=1 -timeout 3h -count=1 -json -v"
else
- TEST_CMD='cd integration-tests/smoke && go test -test.run "${{ inputs.test_list_regex }}" -test.parallel=1 -timeout 2h -count=1 -json -v'
+ TEST_CMD='cd integration-tests/smoke && go test -test.run "$GH_INPUTS_TEST_LIST_REGEX" -test.parallel=1 -timeout 2h -count=1 -json -v'
fi
- TEST_CONFIG_OVERRIDE_PATH=${{ inputs.test_config_override_path }}
+ TEST_CONFIG_OVERRIDE_PATH=$GH_INPUTS_TEST_CONFIG_OVERRIDE_PATH
TEST_LIST=$(jq -n -c \
--arg test_cmd "$TEST_CMD" \
@@ -70,7 +74,7 @@ jobs:
run-e2e-tests-workflow:
name: Run E2E Tests
needs: set-tests-to-run
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@5412507526722a7b1c5d719fa686eed5a1bc4035 # ctf-run-tests@0.2.0
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
custom_test_list_json: ${{ needs.set-tests-to-run.outputs.test_list }}
chainlink_version: ${{ inputs.chainlink_version }}
diff --git a/.github/workflows/on-demand-vrfv2plus-performance-test.yml b/.github/workflows/on-demand-vrfv2plus-performance-test.yml
index f6d120ac178..66878c552fd 100644
--- a/.github/workflows/on-demand-vrfv2plus-performance-test.yml
+++ b/.github/workflows/on-demand-vrfv2plus-performance-test.yml
@@ -34,13 +34,17 @@ jobs:
runs-on: ubuntu-latest
outputs:
test_list: ${{ steps.set-tests.outputs.test_list }}
+ env:
+ GH_INPUTS_TEST_LIST_REGEX: ${{ inputs.test_list_regex }}
+ GH_INPUTS_TEST_CONFIG_OVERRIDE_PATH: ${{ inputs.test_config_override_path }}
+ GH_INPUTS_PERFORMANCE_TEST_TYPE: ${{ inputs.performanceTestType }}
steps:
- name: Generate Test List JSON
id: set-tests
run: |
- TEST_CMD='cd integration-tests/load && go test -v -count=1 -timeout 24h -run "${{ inputs.test_list_regex }}" ./vrfv2plus'
- TEST_CONFIG_OVERRIDE_PATH=${{ inputs.test_config_override_path }}
- TEST_TYPE=${{ inputs.performanceTestType }}
+ TEST_CMD='cd integration-tests/load && go test -v -count=1 -timeout 24h -run "$GH_INPUTS_TEST_LIST_REGEX" ./vrfv2plus'
+ TEST_CONFIG_OVERRIDE_PATH=$GH_INPUTS_TEST_CONFIG_OVERRIDE_PATH
+ TEST_TYPE=$GH_INPUTS_PERFORMANCE_TEST_TYPE
TEST_LIST=$(jq -n -c \
--arg test_cmd "$TEST_CMD" \
@@ -67,7 +71,7 @@ jobs:
run-e2e-tests-workflow:
name: Run E2E Tests
needs: set-tests-to-run
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@5412507526722a7b1c5d719fa686eed5a1bc4035 # ctf-run-tests@0.2.0
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
custom_test_list_json: ${{ needs.set-tests-to-run.outputs.test_list }}
chainlink_version: ${{ inputs.chainlink_version }}
diff --git a/.github/workflows/on-demand-vrfv2plus-smoke-tests.yml b/.github/workflows/on-demand-vrfv2plus-smoke-tests.yml
index af26c527988..51c80af9bfa 100644
--- a/.github/workflows/on-demand-vrfv2plus-smoke-tests.yml
+++ b/.github/workflows/on-demand-vrfv2plus-smoke-tests.yml
@@ -41,13 +41,17 @@ jobs:
steps:
- name: Generate Test List JSON
id: set-tests
+ env:
+ GH_INPUTS_TEST_SUITE: ${{ inputs.test_suite }}
+ GH_INPUTS_TEST_LIST_REGEX: ${{ inputs.test_list_regex }}
+ GH_INPUTS_TEST_CONFIG_OVERRIDE_PATH: ${{ inputs.test_config_override_path }}
run: |
- if [[ "${{ inputs.test_suite }}" == "All Tests" ]]; then
+ if [[ "$GH_INPUTS_TEST_SUITE" == "All Tests" ]]; then
TEST_CMD="cd integration-tests/smoke && go test vrfv2plus_test.go -test.parallel=1 -timeout 3h -count=1 -json -v"
else
- TEST_CMD='cd integration-tests/smoke && go test -test.run "${{ inputs.test_list_regex }}" -test.parallel=1 -timeout 2h -count=1 -json -v'
+ TEST_CMD='cd integration-tests/smoke && go test -test.run "$GH_INPUTS_TEST_LIST_REGEX" -test.parallel=1 -timeout 2h -count=1 -json -v'
fi
- TEST_CONFIG_OVERRIDE_PATH=${{ inputs.test_config_override_path }}
+ TEST_CONFIG_OVERRIDE_PATH=$GH_INPUTS_TEST_CONFIG_OVERRIDE_PATH
TEST_LIST=$(jq -n -c \
--arg test_cmd "$TEST_CMD" \
@@ -70,7 +74,7 @@ jobs:
run-e2e-tests-workflow:
name: Run E2E Tests
needs: set-tests-to-run
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@5412507526722a7b1c5d719fa686eed5a1bc4035 # ctf-run-tests@0.2.0
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
custom_test_list_json: ${{ needs.set-tests-to-run.outputs.test_list }}
chainlink_version: ${{ inputs.chainlink_version }}
diff --git a/.github/workflows/operator-ui-ci.yml b/.github/workflows/operator-ui-ci.yml
index 9bce18f8cff..7ea1cd8327b 100644
--- a/.github/workflows/operator-ui-ci.yml
+++ b/.github/workflows/operator-ui-ci.yml
@@ -33,6 +33,8 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Get operator-ui tag
id: get-operator-ui-tag
diff --git a/.github/workflows/run-nightly-e2e-tests.yml b/.github/workflows/run-nightly-e2e-tests.yml
index eba1108f89f..712fb088181 100644
--- a/.github/workflows/run-nightly-e2e-tests.yml
+++ b/.github/workflows/run-nightly-e2e-tests.yml
@@ -20,7 +20,7 @@ on:
jobs:
call-run-e2e-tests-workflow:
name: Run E2E Tests
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@5412507526722a7b1c5d719fa686eed5a1bc4035 # ctf-run-tests@0.2.0
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
chainlink_version: ${{ inputs.chainlink_version || 'develop' }}
test_path: .github/e2e-tests.yml
diff --git a/.github/workflows/run-selected-e2e-tests.yml b/.github/workflows/run-selected-e2e-tests.yml
index 0e7c97c67fc..e95ce1cef19 100644
--- a/.github/workflows/run-selected-e2e-tests.yml
+++ b/.github/workflows/run-selected-e2e-tests.yml
@@ -35,7 +35,7 @@ run-name: ${{ inputs.workflow_run_name }}
jobs:
call-run-e2e-tests-workflow:
name: Run E2E Tests
- uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@5412507526722a7b1c5d719fa686eed5a1bc4035 # ctf-run-tests@0.2.0
+ uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@0632b5652dd5eb03bfa87e23a2b3e2911484fe59
with:
chainlink_version: ${{ github.event.inputs.chainlink_version }}
test_path: .github/e2e-tests.yml
diff --git a/.github/workflows/solidity-foundry-artifacts.yml b/.github/workflows/solidity-foundry-artifacts.yml
index 5a971f65174..620d491e82d 100644
--- a/.github/workflows/solidity-foundry-artifacts.yml
+++ b/.github/workflows/solidity-foundry-artifacts.yml
@@ -16,7 +16,6 @@ on:
- "llo-feeds"
- "operatorforwarder"
- "shared"
- - "transmission"
- "vrf"
- "workflow"
commit_to_use:
@@ -51,6 +50,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ env.head_ref }}
- name: Find modified contracts
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
@@ -87,8 +87,10 @@ jobs:
- name: Transform modified files
id: changes-transform
shell: bash
+ env:
+ GH_INPUTS_PRODUCT: ${{ inputs.product }}
run: |
- if [ "${{ inputs.product }}" = "shared" ]; then
+ if [ "$GH_INPUTS_PRODUCT" = "shared" ]; then
echo "::debug:: Product is shared, transforming changes"
if [[ "${{ steps.changes-dorny.outputs.product }}" == "true" && "${{ steps.changes-dorny.outputs.other_shared }}" == "true" ]]; then
echo "::debug:: Changes were found in 'shared' folder and in 'interfaces' and root folders"
@@ -129,17 +131,18 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
-
- - name: Extract Foundry version
- id: extract-foundry-version
- uses: ./.github/actions/detect-solidity-foundry-version
with:
- working-directory: contracts
+ persist-credentials: false
+
+ - name: Install Foundry
+ uses: ./.github/actions/install-solidity-foundry
- name: Should skip code coverage report
id: skip-code-coverage
+ env:
+ GH_INPUTS_PRODUCT: ${{ inputs.product }}
run: |
- if [[ "${{ inputs.product }}" = "automation" || "${{ inputs.product }}" = "vrf" || "${{ inputs.product }}" = "functions" ]]; then
+ if [[ "$GH_INPUTS_PRODUCT" = "automation" || "$GH_INPUTS_PRODUCT" = "vrf" || "$GH_INPUTS_PRODUCT" = "functions" ]]; then
echo "generate_code_coverage=false" >> $GITHUB_OUTPUT
else
echo "generate_code_coverage=true" >> $GITHUB_OUTPUT
diff --git a/.github/workflows/solidity-foundry.yml b/.github/workflows/solidity-foundry.yml
index f94ef29a3b8..c91a1abd086 100644
--- a/.github/workflows/solidity-foundry.yml
+++ b/.github/workflows/solidity-foundry.yml
@@ -21,7 +21,6 @@ jobs:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.define-matrix.outputs.matrix }}
- foundry-version: ${{ steps.extract-foundry-version.outputs.foundry-version }}
steps:
- name: Define test matrix
id: define-matrix
@@ -38,7 +37,6 @@ jobs:
{ "name": "llo-feeds", "setup": { "run-coverage": true, "min-coverage": 49.3, "run-gas-snapshot": true, "run-forge-fmt": false }},
{ "name": "operatorforwarder", "setup": { "run-coverage": true, "min-coverage": 55.7, "run-gas-snapshot": true, "run-forge-fmt": false }},
{ "name": "shared", "setup": { "run-coverage": true, "extra-coverage-params": "--no-match-path='*CallWithExactGas*' --ir-minimum", "min-coverage": 32.6, "run-gas-snapshot": true, "run-forge-fmt": false }},
- { "name": "transmission", "setup": { "run-coverage": true, "min-coverage": 61.5, "run-gas-snapshot": true, "run-forge-fmt": false }},
{ "name": "vrf", "setup": { "run-coverage": false, "min-coverage": 98.5, "run-gas-snapshot": false, "run-forge-fmt": false }},
{ "name": "workflow", "setup": { "run-coverage": true, "extra-coverage-params": "--ir-minimum", "min-coverage": 96.0, "run-gas-snapshot": true, "run-forge-fmt": true }}
]
@@ -49,12 +47,8 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
-
- - name: Extract Foundry version
- id: extract-foundry-version
- uses: ./.github/actions/detect-solidity-foundry-version
with:
- working-directory: contracts
+ persist-credentials: false
changes:
name: Detect changes
@@ -70,6 +64,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Detect changes
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
@@ -112,8 +108,6 @@ jobs:
- 'contracts/src/v0.8/mocks/**/*.sol'
- 'contracts/src/v0.8/tests/**/*.sol'
- 'contracts/src/v0.8/vendor/**/*.sol'
- transmission:
- - 'contracts/src/v0.8/transmission/**/*.sol'
workflow:
- 'contracts/src/v0.8/workflow/**/*.sol'
@@ -157,6 +151,7 @@ jobs:
|| needs.changes.outputs.non_src_changes == 'true' }}
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
submodules: recursive
# Only needed because we use the NPM versions of packages
@@ -176,9 +171,7 @@ jobs:
${{ contains(fromJson(needs.changes.outputs.all_changes), matrix.product.name)
|| contains(fromJson(needs.changes.outputs.all_changes), 'shared')
|| needs.changes.outputs.non_src_changes == 'true' }}
- uses: foundry-rs/foundry-toolchain@8f1998e9878d786675189ef566a2e4bf24869773 # v1.2.0
- with:
- version: ${{ needs.define-matrix.outputs.foundry-version }}
+ uses: ./.github/actions/install-solidity-foundry
# If Solc version is not set in foundry.toml, then what `forge build` does is that it lazily-installs required solc versions
# using SVM. This is done in parallel, but SVM has a bug and is not thread-safe, which sometimes leads to `Text file busy` error.
@@ -330,10 +323,13 @@ jobs:
steps:
- name: Checkout this repository
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Checkout .github repository
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/.github
ref: b6e37806737eef87e8c9137ceeb23ef0bff8b1db # validate-solidity-artifacts@0.1.0
path: ./dot_github
@@ -342,9 +338,7 @@ jobs:
uses: ./.github/actions/setup-nodejs
- name: Install Foundry
- uses: foundry-rs/foundry-toolchain@8f1998e9878d786675189ef566a2e4bf24869773 # v1.2.0
- with:
- version: ${{ needs.define-matrix.outputs.foundry-version }}
+ uses: ./.github/actions/install-solidity-foundry
- name: Set up Python
uses: actions/setup-python@v5.2.0
@@ -418,6 +412,7 @@ jobs:
if: needs.changes.outputs.sol_mod_only == 'true'
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ github.base_ref }}
- name: Download Slither scripts
@@ -611,6 +606,7 @@ jobs:
if: ${{ (contains(fromJson(needs.changes.outputs.all_changes), matrix.product.name) || needs.changes.outputs.non_src_changes == 'true') && matrix.product.setup.run-forge-fmt }}
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
submodules: recursive
- name: Setup NodeJS
@@ -619,9 +615,7 @@ jobs:
- name: Install Foundry
if: ${{ (contains(fromJson(needs.changes.outputs.all_changes), matrix.product.name) || needs.changes.outputs.non_src_changes == 'true') && matrix.product.setup.run-forge-fmt }}
- uses: foundry-rs/foundry-toolchain@8f1998e9878d786675189ef566a2e4bf24869773 # v1.2.0
- with:
- version: ${{ needs.define-matrix.outputs.foundry-version }}
+ uses: ./.github/actions/install-solidity-foundry
- name: Run Forge fmt
if: ${{ (contains(fromJson(needs.changes.outputs.all_changes), matrix.product.name) || needs.changes.outputs.non_src_changes == 'true') && matrix.product.setup.run-forge-fmt }}
diff --git a/.github/workflows/solidity-hardhat.yml b/.github/workflows/solidity-hardhat.yml
index 7283e17e13f..e2da95eae6e 100644
--- a/.github/workflows/solidity-hardhat.yml
+++ b/.github/workflows/solidity-hardhat.yml
@@ -20,12 +20,14 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
with:
filters: |
src:
- - 'contracts/src/!(v0.8/(ccip|functions|keystone|l2ep|liquiditymanager|llo-feeds|transmission|vrf|workflow)/**)/**/*'
+ - 'contracts/src/!(v0.8/(ccip|functions|keystone|l2ep|liquiditymanager|llo-feeds|vrf|workflow)/**)/**/*'
- 'contracts/test/**/*'
- 'contracts/package.json'
- 'contracts/pnpm-lock.yaml'
@@ -40,6 +42,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup NodeJS
uses: ./.github/actions/setup-nodejs
- name: Setup Hardhat
diff --git a/.github/workflows/solidity-tracability.yml b/.github/workflows/solidity-traceability.yml
similarity index 98%
rename from .github/workflows/solidity-tracability.yml
rename to .github/workflows/solidity-traceability.yml
index f0b1166807f..a894175f6f3 100644
--- a/.github/workflows/solidity-tracability.yml
+++ b/.github/workflows/solidity-traceability.yml
@@ -1,5 +1,5 @@
# This workflow handles the enforcement of code Traceability via changesets and jira issue linking for our Solidity codebase.
-name: Solidity Tracability
+name: Solidity Traceability
on:
merge_group:
@@ -23,6 +23,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Filter paths
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
@@ -59,6 +61,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: ${{ github.event.pull_request.head.sha }}
- name: Assume role capable of dispatching action
@@ -94,6 +97,7 @@ jobs:
- name: Checkout .Github repository
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: smartcontractkit/.github
ref: 6781e048ecc1aadf7d605722c32e8068a5f829ce # jira-tracing@0.3.0
path: ./dot_github
diff --git a/.github/workflows/solidity-wrappers.yml b/.github/workflows/solidity-wrappers.yml
index b2acdf6ca5e..804a6822a29 100644
--- a/.github/workflows/solidity-wrappers.yml
+++ b/.github/workflows/solidity-wrappers.yml
@@ -24,6 +24,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Detect changes
id: ch
uses: ./.github/actions/detect-solidity-file-changes
@@ -41,6 +43,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup Go
uses: ./.github/actions/setup-go
@@ -50,6 +54,9 @@ jobs:
with:
prod: "true"
+ - name: Install Foundry
+ uses: ./.github/actions/install-solidity-foundry
+
- name: Run native compile and generate wrappers
run: make wrappers-all
working-directory: ./contracts
diff --git a/.github/workflows/solidity.yml b/.github/workflows/solidity.yml
index 605b3f2e325..7275f1f6261 100644
--- a/.github/workflows/solidity.yml
+++ b/.github/workflows/solidity.yml
@@ -17,6 +17,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Detect readonly solidity file changes
id: ch
uses: ./.github/actions/detect-solidity-readonly-file-changes
@@ -29,6 +31,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Detect changes
id: ch
uses: ./.github/actions/detect-solidity-file-changes
@@ -44,6 +48,8 @@ jobs:
pre-release-version: ${{ steps.release-tag-check.outputs.pre-release-version }}
steps:
- uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Check release tag
id: release-tag-check
uses: smartcontractkit/chainlink-github-actions/release/release-tag-check@5dd916d08c03cb5f9a97304f4f174820421bb946 # v2.3.11
@@ -62,6 +68,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup NodeJS
uses: ./.github/actions/setup-nodejs
- name: Run Prepublish test
@@ -77,11 +85,13 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
path: chainlink
- name: Checkout diff-so-fancy
uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
repository: so-fancy/diff-so-fancy
ref: a673cb4d2707f64d92b86498a2f5f71c8e2643d5 # v1.4.3
path: diff-so-fancy
@@ -100,6 +110,11 @@ jobs:
with:
go-version-file: "chainlink/go.mod"
+ - name: Install Foundry
+ uses: ./chainlink/.github/actions/install-solidity-foundry
+ with:
+ working-directory: chainlink/contracts
+
- name: Run native compile and generate wrappers
working-directory: ./chainlink/contracts
run: make wrappers-all
@@ -128,6 +143,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup NodeJS
uses: ./.github/actions/setup-nodejs
- name: Run pnpm lint
@@ -148,6 +165,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup NodeJS
uses: ./.github/actions/setup-nodejs
- name: Run prettier check
@@ -162,6 +181,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup NodeJS
uses: ./.github/actions/setup-nodejs
@@ -191,6 +212,8 @@ jobs:
steps:
- name: Checkout the repo
uses: actions/checkout@v4.2.1
+ with:
+ persist-credentials: false
- name: Setup NodeJS
uses: ./.github/actions/setup-nodejs
diff --git a/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml b/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml
index e635ce40922..061db3ae7f3 100644
--- a/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml
+++ b/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml
@@ -12,6 +12,7 @@ jobs:
steps:
- uses: actions/checkout@v4.2.1
with:
+ persist-credentials: false
ref: develop
if: env.GITHUB_REPOSITORY != 'smartcontractkit/chainlink'
- name: Sync
diff --git a/.gitignore b/.gitignore
index 34d25ebb472..bf8606a8e30 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,9 +48,8 @@ cl_backup_*.tar.gz
# Test artifacts
core/cmd/TestClient_ImportExportP2PKeyBundle_test_key.json
-output.txt
race.*
-golangci-lint-output.txt
+*output.txt
/golangci-lint/
.covdata
core/services/job/testdata/wasm/testmodule.wasm
@@ -116,3 +115,4 @@ vendor/*
*.wasm
contracts/lcov.info
+/cache
diff --git a/.golangci.yml b/.golangci.yml
index ca8cf4dade5..63b061c2951 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -1,5 +1,6 @@
run:
- timeout: 15m0s
+ timeout: 15m
+ allow-parallel-runners: true
linters:
enable:
- containedctx
@@ -96,7 +97,7 @@ linters-settings:
- name: waitgroup-by-value
- name: unconditional-recursion
- name: struct-tag
- # - name: string-format
+ - name: string-format
- name: string-of-int
- name: range-val-address
- name: range-val-in-closure
diff --git a/.mockery.yaml b/.mockery.yaml
index dd9024cc066..7efde733145 100644
--- a/.mockery.yaml
+++ b/.mockery.yaml
@@ -127,7 +127,7 @@ packages:
FlagsInterface:
config:
mockname: Flags
- github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface:
+ github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface:
config:
dir: core/services/vrf/mocks
filename: aggregator_v3_interface.go
@@ -583,12 +583,6 @@ packages:
github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer:
interfaces:
ORM:
- ContractReader:
- config:
- mockname: "Mock{{ .InterfaceName }}"
- filename: contract_reader_mock.go
- inpackage: true
- dir: "{{ .InterfaceDir }}"
Handler:
config:
mockname: "Mock{{ .InterfaceName }}"
diff --git a/.tool-versions b/.tool-versions
index 49f7ef749d1..bdf11a7ed21 100644
--- a/.tool-versions
+++ b/.tool-versions
@@ -4,6 +4,7 @@ nodejs 20.13.1
pnpm 9.4.0
postgres 15.1
helm 3.10.3
-golangci-lint 1.61.0
+golangci-lint 1.62.2
protoc 25.1
python 3.10.5
+act 0.2.30
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 544cf09e5b4..d5b6332c5a5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,122 @@
# Changelog Chainlink Core
+## 2.19.0 - 2024-12-12
+
+### Minor Changes
+
+- [#15126](https://github.com/smartcontractkit/chainlink/pull/15126) [`bf9b08c331`](https://github.com/smartcontractkit/chainlink/commit/bf9b08c33119d14a34c4914a3a7cc94ea6cb5481) - update plugin and evm chainwriter to remove evmConfig dependency #updated
+
+- [#15148](https://github.com/smartcontractkit/chainlink/pull/15148) [`07a2cec532`](https://github.com/smartcontractkit/chainlink/commit/07a2cec532704aebe413a9fa29edc04bd9063677) - #added address book remove feature
+
+- [#14898](https://github.com/smartcontractkit/chainlink/pull/14898) [`a417740359`](https://github.com/smartcontractkit/chainlink/commit/a41774035961ce88be2fed7c6759758a7f00881d) - Bump to start the next version
+
+- [#15010](https://github.com/smartcontractkit/chainlink/pull/15010) [`c162226424`](https://github.com/smartcontractkit/chainlink/commit/c1622264243c2ee83ff7ba54989cfe789a8da53c) - #added support enable and disable feed manager
+
+- [#15104](https://github.com/smartcontractkit/chainlink/pull/15104) [`cf7db16483`](https://github.com/smartcontractkit/chainlink/commit/cf7db164832ea95354a3c953126c2fd32a59afd7) - Updated Solana TXM's in-memory storage to track statuses across the Solana transaction lifecycle. Added a method to translate Solana transaction statuses into states expected by the ChainWriter interface. Made the duration transactions are retained in storage after finality or error configurable using `TxRetentionTimeout`. #added
+
+- [#14880](https://github.com/smartcontractkit/chainlink/pull/14880) [`af8132361b`](https://github.com/smartcontractkit/chainlink/commit/af8132361b3fbd6858a792c4814d144582e6467b) - Implement secrets interpolation with dummy workflow registry syncer #internal
+
+- [#14993](https://github.com/smartcontractkit/chainlink/pull/14993) [`883d993dc6`](https://github.com/smartcontractkit/chainlink/commit/883d993dc6f58b561787c0e287ed121a08ce550d) - #changed UI(chainconfig): make admin address optional
+
+- [#14937](https://github.com/smartcontractkit/chainlink/pull/14937) [`3ad089f664`](https://github.com/smartcontractkit/chainlink/commit/3ad089f6644ed54cb21421e84a01b9628c15e205) - #added Enable and Disable Feeds Manager mutations
+
+- [#14935](https://github.com/smartcontractkit/chainlink/pull/14935) [`c042b627f1`](https://github.com/smartcontractkit/chainlink/commit/c042b627f1fb3a8e6009314c4c2e4daa3c7659c7) - #internal Fix Contract Reader data word index calculation and change ccip contract reader config for more optimal querying.
+
+- [#15210](https://github.com/smartcontractkit/chainlink/pull/15210) [`7ff9cf9916`](https://github.com/smartcontractkit/chainlink/commit/7ff9cf9916ae1648ccc3475c86e45c9df6ab8d1f) - #removed Remove unused deprecated key interfaces.
+
+- [#14791](https://github.com/smartcontractkit/chainlink/pull/14791) [`090063799c`](https://github.com/smartcontractkit/chainlink/commit/090063799cd2fd62646c383bf2d2e42d25225c40) - #updated
+ update ethkeys, ethtransactions to handle duplicate chain id in different network
+ introduce network arg input to Chain graphql query to allow better lookup based on network and chain id
+
+- [#14405](https://github.com/smartcontractkit/chainlink/pull/14405) [`03115e8038`](https://github.com/smartcontractkit/chainlink/commit/03115e80382dc02a7bce66dc16d8bae5bd7de132) - #internal Updated the TXM confirmation logic to use the mined transaction count to identify re-org'd or confirmed transactions.
+
+ - Confirmer uses the mined transaction count to determine if transactions have been re-org'd or confirmed.
+ - Confirmer no longer sets transaction states to `confirmed_missing_receipt`. This state is maintained in queries for backwards compatibility.
+ - Finalizer now responsible for fetching and storing receipts for confirmed transactions.
+ - Finalizer now responsible for resuming pending task runs.
+ - Finalizer now responsible for marking old transactions without receipts broadcasted before the finalized head as fatal.
+
+- [#14912](https://github.com/smartcontractkit/chainlink/pull/14912) [`bb6a20a882`](https://github.com/smartcontractkit/chainlink/commit/bb6a20a8825d9f374b99238097b4c9f701336a0c) - Use correct OCR2OracleSpecID when setting up RequestedRoundTracker #bugfix
+
+- [#15029](https://github.com/smartcontractkit/chainlink/pull/15029) [`99241ec680`](https://github.com/smartcontractkit/chainlink/commit/99241ec68098d818b97b046a1f9b4f5c8f0c5366) - Added multiple blocks history estimator feature and config for Solana TXM. #added
+
+- [#15197](https://github.com/smartcontractkit/chainlink/pull/15197) [`3b3b86ceae`](https://github.com/smartcontractkit/chainlink/commit/3b3b86ceaed419fa3890be17c8699a3416081fb9) - Add don_id to Mercury Enhanced EA telemetry #added
+
+- [#15266](https://github.com/smartcontractkit/chainlink/pull/15266) [`a9d6a3f05c`](https://github.com/smartcontractkit/chainlink/commit/a9d6a3f05c2ca8f8efbd909179f06788c356429e) - #removed unused key files and move public_key test file.
+
+- [#14781](https://github.com/smartcontractkit/chainlink/pull/14781) [`bfd9a3ffe1`](https://github.com/smartcontractkit/chainlink/commit/bfd9a3ffe11484f3dc413bb77a709f2c4bb281b0) - Support multiple chains evm clients for TXM gas estimator to fetch L1 gas oracle
+ #added
+
+- [#15244](https://github.com/smartcontractkit/chainlink/pull/15244) [`827e003a0c`](https://github.com/smartcontractkit/chainlink/commit/827e003a0c8c0212c6de0cb330e1f27a9c583dab) - #bugfix Update Log.Level and MaxSize configs description in the docs
+
+- [#15296](https://github.com/smartcontractkit/chainlink/pull/15296) [`de9868df2c`](https://github.com/smartcontractkit/chainlink/commit/de9868df2c8869bcaf641b06e77dcaa720506263) - #updated chain config: allow chain id and account address to be manually provided when no selections are available
+
+- [#15160](https://github.com/smartcontractkit/chainlink/pull/15160) [`816dcf814a`](https://github.com/smartcontractkit/chainlink/commit/816dcf814aff1ab5ca043eb47849162a61bc184b) - Add CSA authentication support to Beholder #added
+
+- [#15237](https://github.com/smartcontractkit/chainlink/pull/15237) [`1f9c07de61`](https://github.com/smartcontractkit/chainlink/commit/1f9c07de618ecfa3f23b8259ce0558941b5c357f) - #added feat: support creating solana chain config in job distributor page
+
+- [#15299](https://github.com/smartcontractkit/chainlink/pull/15299) [`a2c3da471c`](https://github.com/smartcontractkit/chainlink/commit/a2c3da471cc344a14003f53c2c2f09c937c204c1) - #updated Update few incorrect occurences of the password for notreal@fakeemail.ch.
+
+### Patch Changes
+
+- [#14896](https://github.com/smartcontractkit/chainlink/pull/14896) [`38ef1799dc`](https://github.com/smartcontractkit/chainlink/commit/38ef1799dc8dade6882acbafda3f49e942483f6f) - Ensure RPCClient with enabled polling respects health check flag #internal
+
+- [#14978](https://github.com/smartcontractkit/chainlink/pull/14978) [`65351c3a6f`](https://github.com/smartcontractkit/chainlink/commit/65351c3a6fffcff03d249e64cae223daabd86e3c) - Set `NodePool.EnforceRepeatableRead = true` by default for all chains. This forces Core to stop using RPCs behind on the latest finalized block. #changed #nops
+
+- [#14875](https://github.com/smartcontractkit/chainlink/pull/14875) [`101fbbc75a`](https://github.com/smartcontractkit/chainlink/commit/101fbbc75a76893d2ebe0c24fa61773876007d76) - #updated ignoring tx type 126 on celo
+
+- [#14929](https://github.com/smartcontractkit/chainlink/pull/14929) [`da5910eda9`](https://github.com/smartcontractkit/chainlink/commit/da5910eda98882f8a1b9ccc52b99afa223fb3997) - Add config validation so it requires ws url when http polling disabled #bugfix
+
+- [#14964](https://github.com/smartcontractkit/chainlink/pull/14964) [`7a80f364f9`](https://github.com/smartcontractkit/chainlink/commit/7a80f364f902c46a958021777336d6f6de9203c3) - #internal Add tokenDestGasOverhead to CalculateMessageMaxGas
+
+- [#15115](https://github.com/smartcontractkit/chainlink/pull/15115) [`f8a6218727`](https://github.com/smartcontractkit/chainlink/commit/f8a62187273bac1f12eeee0fe33355fe1b4faebb) - Fixed outdated headtracker config doc. #internal
+
+- [#14955](https://github.com/smartcontractkit/chainlink/pull/14955) [`1b8819e518`](https://github.com/smartcontractkit/chainlink/commit/1b8819e5189459a557a981ab115813253cdda919) - #updated bump CTF to v1.50.13, more robust ethereum client compatibility pipeline
+
+- [#14950](https://github.com/smartcontractkit/chainlink/pull/14950) [`0cd0867140`](https://github.com/smartcontractkit/chainlink/commit/0cd086714086b2a788c54de9aea13d58316518dd) - #internal OracleFactory error handling change
+
+- [#14893](https://github.com/smartcontractkit/chainlink/pull/14893) [`e116f744b2`](https://github.com/smartcontractkit/chainlink/commit/e116f744b222b7d664a8501566093ca1c1c63aa9) - Relocation of the deployment directory into a direct subdir of the root. #internal
+
+- [#15024](https://github.com/smartcontractkit/chainlink/pull/15024) [`6b29cdb7f3`](https://github.com/smartcontractkit/chainlink/commit/6b29cdb7f349b370581822ec6f54713faa7ca49e) - Minor fixes to the CCIPChainReader enabling proper serialization #internal
+
+- [#14827](https://github.com/smartcontractkit/chainlink/pull/14827) [`a9f86b51bf`](https://github.com/smartcontractkit/chainlink/commit/a9f86b51bf8d3a8548d4870c91f3e82669f5f21a) - #added Handle Hex String in EA Telemetry
+
+- [#15137](https://github.com/smartcontractkit/chainlink/pull/15137) [`7bd35dcea0`](https://github.com/smartcontractkit/chainlink/commit/7bd35dcea04b02ceb2e46a0431eca61ab3b78889) - #internal Update ccip contract reader cfg for ccip message sent to use output codec wrapper modifier
+
+- [#14710](https://github.com/smartcontractkit/chainlink/pull/14710) [`12174c79c4`](https://github.com/smartcontractkit/chainlink/commit/12174c79c4d1746149d7c89e41e67f9dc6525c18) - Adds new custom calldata DA oracle #added
+
+- [#14891](https://github.com/smartcontractkit/chainlink/pull/14891) [`12e2eb251c`](https://github.com/smartcontractkit/chainlink/commit/12e2eb251c406b601b2f954ed25ccad369421403) - Fix flaky WS test server #internal
+
+- [#11809](https://github.com/smartcontractkit/chainlink/pull/11809) [`2e8e16820b`](https://github.com/smartcontractkit/chainlink/commit/2e8e16820b02a9ca83aa46e7ae2deac31eaf08aa) - Upgrade go-ethereum to v1.14.11 #internal
+
+- [#15279](https://github.com/smartcontractkit/chainlink/pull/15279) [`276d1f3255`](https://github.com/smartcontractkit/chainlink/commit/276d1f3255aeafb1767ee84f697fc4746890a9a6) - Integration tests for USDC token transfer #internal
+
+- [#14984](https://github.com/smartcontractkit/chainlink/pull/14984) [`1738332823`](https://github.com/smartcontractkit/chainlink/commit/173833282344857b5e7d95863d8dab211db71ad7) - use last mined nonce instead of pending nonce to recover from occasional nonce gap issues within nonce tracker. #internal
+
+- [#11809](https://github.com/smartcontractkit/chainlink/pull/11809) [`2e8e16820b`](https://github.com/smartcontractkit/chainlink/commit/2e8e16820b02a9ca83aa46e7ae2deac31eaf08aa) - Fix HeadTracker tests caused by simulated client update #internal
+
+- [#15130](https://github.com/smartcontractkit/chainlink/pull/15130) [`4f0491483c`](https://github.com/smartcontractkit/chainlink/commit/4f0491483c089ee2fd5e7875b0d58b65b304b111) - CCIP token transfer integration tests #internal
+
+- [#15150](https://github.com/smartcontractkit/chainlink/pull/15150) [`68bff71f20`](https://github.com/smartcontractkit/chainlink/commit/68bff71f201c8d40219aeadea08a49a19f1ba6f1) - #updated Operator UI to support StreamSpec job definition
+
+- [#14433](https://github.com/smartcontractkit/chainlink/pull/14433) [`340a6bfdf5`](https://github.com/smartcontractkit/chainlink/commit/340a6bfdf54745dd1c6d9f322d9c9515c97060bb) - Merge raw configs correctly #bugfix
+
+- [#15060](https://github.com/smartcontractkit/chainlink/pull/15060) [`239b3a95d1`](https://github.com/smartcontractkit/chainlink/commit/239b3a95d14dd872a7192de461c33fdc143fb163) - Modify release changelog generation format #internal
+
+- [#15019](https://github.com/smartcontractkit/chainlink/pull/15019) [`039777ffb8`](https://github.com/smartcontractkit/chainlink/commit/039777ffb8994e0af3a133dd02d9852f4d0a0ae1) - #updated celo alfajores config
+
+- [#15157](https://github.com/smartcontractkit/chainlink/pull/15157) [`12986aa461`](https://github.com/smartcontractkit/chainlink/commit/12986aa461a86a593dbce422725abf7e05f05332) - Enable AutoPurge feature on all affected chains #nops
+
+- [#14800](https://github.com/smartcontractkit/chainlink/pull/14800) [`7bac85fdb3`](https://github.com/smartcontractkit/chainlink/commit/7bac85fdb37ed15eb42357b0a0ce06e4febd7494) - #bugfix Memory leak fix on promwrapper
+
+- [#14867](https://github.com/smartcontractkit/chainlink/pull/14867) [`2d28b4eb9d`](https://github.com/smartcontractkit/chainlink/commit/2d28b4eb9d8635215d953b4f5d256791a9941035) - #updated Use labelers from `chainlink-common`
+
+- [#15284](https://github.com/smartcontractkit/chainlink/pull/15284) [`7cd17d687a`](https://github.com/smartcontractkit/chainlink/commit/7cd17d687a11fcfe36ad78d6279dc642b6186eaa) - Bump Solana to include MultiNode integration. #added
+
+- [#15372](https://github.com/smartcontractkit/chainlink/pull/15372) [`d3fa330b1b`](https://github.com/smartcontractkit/chainlink/commit/d3fa330b1b3c275c48ea7ec962b4b8457f940fcd) - fix reported evm node states
+
+- [#15577](https://github.com/smartcontractkit/chainlink/pull/15577) [`6da84b21c1`](https://github.com/smartcontractkit/chainlink/commit/6da84b21c16f680f86f640df7ac4cfefab5b942e) - Fixes a race condition with the Finalizer when clearing txs #bugfix
+
## 2.18.0 - 2024-11-01
### Minor Changes
@@ -50,6 +167,7 @@
Reduced Generics: Significantly less bulky code!
#updated #changed #internal
+
- [#14629](https://github.com/smartcontractkit/chainlink/pull/14629) [`4928e60ddf`](https://github.com/smartcontractkit/chainlink/commit/4928e60ddfe375e4a0c644cb210802b4c4db5dbd) Thanks [@huangzhen1997](https://github.com/huangzhen1997)! - Support Zircuit fraud transactions detection and zk overflow detection #added
- [#14334](https://github.com/smartcontractkit/chainlink/pull/14334) [`0ad624673f`](https://github.com/smartcontractkit/chainlink/commit/0ad624673f6f1a8e155fc43c67a8ae6caddefa90) Thanks [@krehermann](https://github.com/krehermann)! - #added keystone contract deployment
- [#14709](https://github.com/smartcontractkit/chainlink/pull/14709) [`1560aa9167`](https://github.com/smartcontractkit/chainlink/commit/1560aa9167a812abe3a8370c033b3290dcbcb261) Thanks [@KuphJr](https://github.com/KuphJr)! - Add encryptionPublicKey to CapabilitiesRegistry.sol
diff --git a/GNUmakefile b/GNUmakefile
index 336efd326a7..bb200cc2cb9 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -4,6 +4,7 @@ COMMIT_SHA ?= $(shell git rev-parse HEAD)
VERSION = $(shell jq -r '.version' package.json)
GO_LDFLAGS := $(shell tools/bin/ldflags)
GOFLAGS = -ldflags "$(GO_LDFLAGS)"
+GCFLAGS = -gcflags "$(GO_GCFLAGS)"
.PHONY: install
install: install-chainlink-autoinstall ## Install chainlink and all its dependencies.
@@ -38,7 +39,7 @@ docs: ## Install and run pkgsite to view Go docs
.PHONY: install-chainlink
install-chainlink: operator-ui ## Install the chainlink binary.
- go install $(GOFLAGS) .
+ go install $(GCFLAGS) $(GOFLAGS) .
.PHONY: install-chainlink-cover
install-chainlink-cover: operator-ui ## Install the chainlink binary with cover flag.
@@ -97,7 +98,7 @@ abigen: ## Build & install abigen.
.PHONY: generate
generate: abigen codecgen mockery protoc gomods ## Execute all go:generate commands.
gomods -w go generate -x ./...
- mockery
+ find . -type f -name .mockery.yaml -execdir mockery \; ## Execute mockery for all .mockery.yaml files
.PHONY: rm-mocked
rm-mocked:
@@ -133,13 +134,6 @@ testdb-force: ## Prepares the test database, drops any pesky user connections th
testdb-user-only: ## Prepares the test database with user only.
go run . local db preparetest --user-only
-# Format for CI
-.PHONY: presubmit
-presubmit: ## Format go files and imports.
- goimports -w .
- gofmt -w .
- go mod tidy
-
.PHONY: gomods
gomods: ## Install gomods
go install github.com/jmank88/gomods@v0.1.4
@@ -180,7 +174,7 @@ config-docs: ## Generate core node configuration documentation
.PHONY: golangci-lint
golangci-lint: ## Run golangci-lint for all issues.
[ -d "./golangci-lint" ] || mkdir ./golangci-lint && \
- docker run --rm -v $(shell pwd):/app -w /app golangci/golangci-lint:v1.61.0 golangci-lint run --max-issues-per-linter 0 --max-same-issues 0 | tee ./golangci-lint/$(shell date +%Y-%m-%d_%H:%M:%S).txt
+ docker run --rm -v $(shell pwd):/app -w /app golangci/golangci-lint:v1.62.2 golangci-lint run --max-issues-per-linter 0 --max-same-issues 0 | tee ./golangci-lint/$(shell date +%Y-%m-%d_%H:%M:%S).txt
.PHONY: modgraph
modgraph:
@@ -189,7 +183,7 @@ modgraph:
.PHONY: test-short
test-short: ## Run 'go test -short' and suppress uninteresting output
- go test -short ./... | grep -v "no test files" | grep -v "\(cached\)"
+ go test -short ./... | grep -v "\[no test files\]" | grep -v "\(cached\)"
help:
@echo ""
diff --git a/ccip/config/evm/Avalanche_Fuji.toml b/ccip/config/evm/Avalanche_Fuji.toml
index 91b8bf6bab8..7df1d26a336 100644
--- a/ccip/config/evm/Avalanche_Fuji.toml
+++ b/ccip/config/evm/Avalanche_Fuji.toml
@@ -10,9 +10,8 @@ RPCBlockQueryDelay = 2
NoNewFinalizedHeadsThreshold = '1m'
[GasEstimator]
-PriceDefault = '25 gwei'
-PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '25 gwei'
+PriceMin = '1 gwei'
+PriceDefault = '1 gwei'
[GasEstimator.BlockHistory]
BlockHistorySize = 24
diff --git a/ccip/config/evm/Avalanche_Mainnet.toml b/ccip/config/evm/Avalanche_Mainnet.toml
index f51af60098d..341ae5478b3 100644
--- a/ccip/config/evm/Avalanche_Mainnet.toml
+++ b/ccip/config/evm/Avalanche_Mainnet.toml
@@ -10,9 +10,8 @@ RPCBlockQueryDelay = 2
NoNewFinalizedHeadsThreshold = '1m'
[GasEstimator]
-PriceDefault = '25 gwei'
-PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '25 gwei'
+PriceMin = '1 gwei'
+PriceDefault = '1 gwei'
[GasEstimator.BlockHistory]
# Average block time of 2s
diff --git a/common/client/transaction_sender_test.go b/common/client/transaction_sender_test.go
index 656791b7e86..14dc0799a6a 100644
--- a/common/client/transaction_sender_test.go
+++ b/common/client/transaction_sender_test.go
@@ -258,7 +258,6 @@ func TestTransactionSender_SendTransaction(t *testing.T) {
_, txSender = newTestTransactionSender(t, chainID, logger.Test(t),
[]Node[types.ID, TestSendTxRPCClient]{fastNode, slowNode},
[]SendOnlyNode[types.ID, TestSendTxRPCClient]{slowSendOnly})
-
})
t.Run("Returns error if there is no healthy primary nodes", func(t *testing.T) {
chainID := types.RandomID()
diff --git a/contracts/.changeset/cold-geckos-yawn.md b/contracts/.changeset/cold-geckos-yawn.md
new file mode 100644
index 00000000000..e7677f1282e
--- /dev/null
+++ b/contracts/.changeset/cold-geckos-yawn.md
@@ -0,0 +1,10 @@
+---
+'@chainlink/contracts': minor
+---
+
+Remove dead transmission code
+
+
+PR issue: CM-661
+
+Solidity Review issue: CM-662
\ No newline at end of file
diff --git a/contracts/.changeset/cuddly-roses-vanish.md b/contracts/.changeset/cuddly-roses-vanish.md
new file mode 100644
index 00000000000..29282bab46b
--- /dev/null
+++ b/contracts/.changeset/cuddly-roses-vanish.md
@@ -0,0 +1,10 @@
+---
+'@chainlink/contracts': patch
+---
+
+#internal Generate gethwrappers through Foundry instead of solc-select via python
+
+
+PR issue: CCIP-4737
+
+Solidity Review issue: CCIP-3966
\ No newline at end of file
diff --git a/contracts/.changeset/early-cups-relax.md b/contracts/.changeset/early-cups-relax.md
new file mode 100644
index 00000000000..1ec6aaba0b7
--- /dev/null
+++ b/contracts/.changeset/early-cups-relax.md
@@ -0,0 +1,9 @@
+---
+'@chainlink/contracts': minor
+---
+
+#internal Account for tokenTransferBytesOverhead in exec cost
+
+PR issue: CCIP-4646
+
+Solidity Review issue: CCIP-3966
\ No newline at end of file
diff --git a/contracts/.changeset/eighty-cycles-film.md b/contracts/.changeset/eighty-cycles-film.md
new file mode 100644
index 00000000000..6cd56afa80a
--- /dev/null
+++ b/contracts/.changeset/eighty-cycles-film.md
@@ -0,0 +1,10 @@
+---
+'@chainlink/contracts': patch
+---
+
+remove legacy curse check from RMNRemote isCursed() method #bugfix
+
+
+PR issue: CCIP-4476
+
+Solidity Review issue: CCIP-3966
\ No newline at end of file
diff --git a/contracts/.changeset/new-elephants-behave.md b/contracts/.changeset/new-elephants-behave.md
new file mode 100644
index 00000000000..29f3c248afc
--- /dev/null
+++ b/contracts/.changeset/new-elephants-behave.md
@@ -0,0 +1,5 @@
+---
+'@chainlink/contracts': patch
+---
+
+fix test naming
diff --git a/contracts/.changeset/tame-cycles-ring.md b/contracts/.changeset/tame-cycles-ring.md
new file mode 100644
index 00000000000..31fb56ce133
--- /dev/null
+++ b/contracts/.changeset/tame-cycles-ring.md
@@ -0,0 +1,10 @@
+---
+'@chainlink/contracts': patch
+---
+
+enable via-ir in CCIP compilation
+
+
+PR issue: CCIP-4656
+
+Solidity Review issue: CCIP-3966
\ No newline at end of file
diff --git a/contracts/.changeset/violet-lamps-pump.md b/contracts/.changeset/violet-lamps-pump.md
new file mode 100644
index 00000000000..4b180df24cd
--- /dev/null
+++ b/contracts/.changeset/violet-lamps-pump.md
@@ -0,0 +1,10 @@
+---
+'@chainlink/contracts': patch
+---
+
+Create a new version of the ERC165Checker library which checks for sufficient gas before making an external call to prevent message delivery issues. #bugfix
+
+
+PR issue: CCIP-4659
+
+Solidity Review issue: CCIP-3966
\ No newline at end of file
diff --git a/contracts/.solhintignore-test b/contracts/.solhintignore-test
index acaca4fe1e4..137ba9998c7 100644
--- a/contracts/.solhintignore-test
+++ b/contracts/.solhintignore-test
@@ -4,7 +4,6 @@
./src/v0.8/tests
./src/v0.8/llo-feeds/
./src/v0.8/automation/
-./src/v0.8/transmission/
./src/v0.8/l2ep/
./src/v0.8/shared/
./src/v0.8/operatorforwarder/
diff --git a/contracts/GNUmakefile b/contracts/GNUmakefile
index 673198bb1e2..7361754ee0b 100644
--- a/contracts/GNUmakefile
+++ b/contracts/GNUmakefile
@@ -1,6 +1,6 @@
# ALL_FOUNDRY_PRODUCTS contains a list of all products that have a foundry
# profile defined and use the Foundry snapshots.
-ALL_FOUNDRY_PRODUCTS = ccip functions keystone l2ep liquiditymanager llo-feeds operatorforwarder shared transmission workflow
+ALL_FOUNDRY_PRODUCTS = ccip functions keystone l2ep liquiditymanager llo-feeds operatorforwarder shared workflow
# To make a snapshot for a specific product, either set the `FOUNDRY_PROFILE` env var
# or call the target with `FOUNDRY_PROFILE=product`
diff --git a/contracts/foundry.toml b/contracts/foundry.toml
index 45272ad3f17..6c7c41a2d5b 100644
--- a/contracts/foundry.toml
+++ b/contracts/foundry.toml
@@ -22,12 +22,23 @@ multiline_func_header = "params_first"
sort_imports = true
single_line_statement_blocks = "preserve"
+# This profile should be used for testing CCIP locally and in CI.
[profile.ccip]
-solc_version = '0.8.24'
+solc_version = '0.8.26'
src = 'src/v0.8/ccip'
test = 'src/v0.8/ccip/test'
+evm_version = 'paris'
optimizer_runs = 500
+
+# This profile should be used prior to any release to ensure the tests are passing with via-ir enabled. Enabling via-ir
+# locally or in CI will slow down the compilation process, so it is not recommended to use it for everyday development.
+[profile.ccip-compile]
+solc_version = '0.8.26'
+src = 'src/v0.8/ccip'
+test = 'src/v0.8/ccip/test'
evm_version = 'paris'
+optimizer_runs = 80_000
+via_ir = true
[profile.functions]
solc_version = '0.8.19'
@@ -85,12 +96,6 @@ solc_version = '0.8.19'
src = 'src/v0.8/operatorforwarder'
test = 'src/v0.8/operatorforwarder/test'
-[profile.transmission]
-optimizer_runs = 1_000_000
-solc_version = '0.8.19'
-src = 'src/v0.8/transmission'
-test = 'src/v0.8/transmission/test'
-
[profile.workflow]
optimizer_runs = 1_000_000
solc_version = '0.8.24'
@@ -104,5 +109,6 @@ optimizer_runs = 1_000_000
src = 'src/v0.8/shared'
test = 'src/v0.8/shared/test'
solc_version = '0.8.24'
+evm_version = 'paris'
# See more config options https://github.com/foundry-rs/foundry/tree/master/config
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index d655e886262..019626e6a67 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -1,757 +1,406 @@
-ARMProxy_constructor:test_Constructor() (gas: 302231)
-ARMProxy_isCursed:test_IsCursed_Success() (gas: 47209)
-ARMProxy_isCursed:test_call_ARMCallEmptyContract_Revert() (gas: 19412)
-ARMProxy_isCursed:test_isCursed_RevertReasonForwarded_Revert() (gas: 45210)
-ARMProxy_setARM:test_SetARM() (gas: 16599)
-ARMProxy_setARM:test_SetARMzero() (gas: 11275)
-BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27346)
-BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 54878)
-BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244452)
-BurnFromMintTokenPool_lockOrBurn:test_setup_Success() (gas: 24210)
-BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27486)
-BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 54878)
-BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 242352)
-BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17852)
-BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 27287)
-BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 54624)
-BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 109426)
-BurnMintWithLockReleaseFlagTokenPool_lockOrBurn:test_LockOrBurn_CorrectReturnData_Success() (gas: 242805)
-BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27346)
-BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 54878)
-BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244496)
-BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24223)
-CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2077779)
-CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 332619)
-CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 458568)
-CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289191)
-CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 289486)
-CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 292216)
-CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 288824)
-CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 336363)
-CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 290590)
-CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 290055)
-CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 308646)
-CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1191231)
-CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 288918)
-CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 289112)
-CCIPHome__validateConfig:test__validateConfig_Success() (gas: 299797)
-CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 773105)
-CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 293455)
-CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 293503)
-CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 187822)
-CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 350051)
-CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 18089)
-CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 282212)
-CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14976)
-CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 373475)
-CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 38098)
-CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 11783)
-CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 11015)
-CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 37072)
-CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1455674)
-CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 63865)
-CCIPHome_constructor:test_constructor_success() (gas: 3531036)
-CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2773023)
-CCIPHome_getCapabilityConfiguration:test_getCapabilityConfiguration_success() (gas: 9116)
-CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2547513)
-CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 9110)
-CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23074)
-CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 8840)
-CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5113754)
-CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 9024)
-CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19084)
-CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 8773)
-CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 30676)
-CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 29383)
-CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1395154)
-CCIPHome_setCandidate:test_setCandidate_success() (gas: 1365439)
-CCIPHome_supportsInterface:test_supportsInterface_success() (gas: 9885)
-DefensiveExampleTest:test_HappyPath_Success() (gas: 200540)
-DefensiveExampleTest:test_Recovery() (gas: 425013)
-E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1512391)
-EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96980)
-EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49812)
-EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17479)
-EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15753)
-EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99953)
-EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76182)
-EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99974)
-EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 145007)
-EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80439)
-EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80604)
-EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 96107)
-EtherSenderReceiverTest_constructor:test_constructor() (gas: 17575)
-EtherSenderReceiverTest_getFee:test_getFee() (gas: 27456)
-EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20355)
-EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16682)
-EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16615)
-EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25456)
-EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25373)
-EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17969)
-EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25328)
-EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26348)
-FactoryBurnMintERC20_approve:test_Approve_Success() (gas: 55819)
-FactoryBurnMintERC20_approve:test_InvalidAddress_Reverts() (gas: 10703)
-FactoryBurnMintERC20_burn:test_BasicBurn_Success() (gas: 172464)
-FactoryBurnMintERC20_burn:test_BurnFromZeroAddress_Reverts() (gas: 47338)
-FactoryBurnMintERC20_burn:test_ExceedsBalance_Reverts() (gas: 22005)
-FactoryBurnMintERC20_burn:test_SenderNotBurner_Reverts() (gas: 13520)
-FactoryBurnMintERC20_burnFrom:test_BurnFrom_Success() (gas: 58274)
-FactoryBurnMintERC20_burnFrom:test_ExceedsBalance_Reverts() (gas: 36191)
-FactoryBurnMintERC20_burnFrom:test_InsufficientAllowance_Reverts() (gas: 22113)
-FactoryBurnMintERC20_burnFrom:test_SenderNotBurner_Reverts() (gas: 13487)
-FactoryBurnMintERC20_burnFromAlias:test_BurnFrom_Success() (gas: 58248)
-FactoryBurnMintERC20_burnFromAlias:test_ExceedsBalance_Reverts() (gas: 36155)
-FactoryBurnMintERC20_burnFromAlias:test_InsufficientAllowance_Reverts() (gas: 22068)
-FactoryBurnMintERC20_burnFromAlias:test_SenderNotBurner_Reverts() (gas: 13442)
-FactoryBurnMintERC20_constructor:test_Constructor_Success() (gas: 1450638)
-FactoryBurnMintERC20_decreaseApproval:test_DecreaseApproval_Success() (gas: 31419)
-FactoryBurnMintERC20_getCCIPAdmin:test_getCCIPAdmin_Success() (gas: 12717)
-FactoryBurnMintERC20_getCCIPAdmin:test_setCCIPAdmin_Success() (gas: 23874)
-FactoryBurnMintERC20_grantMintAndBurnRoles:test_GrantMintAndBurnRoles_Success() (gas: 121194)
-FactoryBurnMintERC20_grantRole:test_GrantBurnAccess_Success() (gas: 53403)
-FactoryBurnMintERC20_grantRole:test_GrantMany_Success() (gas: 961486)
-FactoryBurnMintERC20_grantRole:test_GrantMintAccess_Success() (gas: 94165)
-FactoryBurnMintERC20_increaseApproval:test_IncreaseApproval_Success() (gas: 44398)
-FactoryBurnMintERC20_mint:test_BasicMint_Success() (gas: 149804)
-FactoryBurnMintERC20_mint:test_MaxSupplyExceeded_Reverts() (gas: 50679)
-FactoryBurnMintERC20_mint:test_SenderNotMinter_Reverts() (gas: 11405)
-FactoryBurnMintERC20_supportsInterface:test_SupportsInterface_Success() (gas: 11538)
-FactoryBurnMintERC20_transfer:test_InvalidAddress_Reverts() (gas: 10701)
-FactoryBurnMintERC20_transfer:test_Transfer_Success() (gas: 42482)
-FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16846)
-FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16759)
-FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16813)
-FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 41239)
-FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroInput_Success() (gas: 12563)
-FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 140709)
-FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 162719)
-FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12263)
-FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11476)
-FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54860)
-FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45257)
-FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12368)
-FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 89062)
-FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13346)
-FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17435)
-FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12349)
-FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106632)
-FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110982)
-FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 111057)
-FeeQuoter_constructor:test_Setup_Success() (gas: 5011219)
-FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 68416)
-FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29300)
-FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 96433)
-FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14857)
-FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20988)
-FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 73071)
-FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 26476)
-FeeQuoter_getTokenAndGasPrices:test_StalenessCheckDisabled_Success() (gas: 112065)
-FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16184)
-FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 109175)
-FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 68059)
-FeeQuoter_getTokenPrice:test_GetTokenPrice_LocalMoreRecent_Success() (gas: 33529)
-FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 78516)
-FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 37307)
-FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 35086)
-FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28176)
-FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 96089)
-FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20615)
-FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27984)
-FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28029)
-FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40822)
-FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29736)
-FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18465)
-FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 83340)
-FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 53570)
-FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 239736)
-FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22668)
-FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29966)
-FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100417)
-FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 143246)
-FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21280)
-FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 114510)
-FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 23495)
-FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63909)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1897852)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1897810)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1877929)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1897584)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1897788)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1897600)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 65232)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 65112)
-FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894)
-FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1897226)
-FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61843)
-FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116970)
-FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14182)
-FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1895903)
-FeeQuoter_onReport:test_OnReport_SkipPriceUpdateWhenStaleUpdateReceived() (gas: 52614)
-FeeQuoter_onReport:test_onReport() (gas: 89071)
-FeeQuoter_onReport:test_onReport_withKeystoneForwarderContract() (gas: 122700)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17381)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21553)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18613)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18153)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18467)
-FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18590)
-FeeQuoter_processMessageArgs:test_applyTokensTransferFeeConfigUpdates_InvalidFeeRange_Revert() (gas: 21476)
-FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44974)
-FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 20008)
-FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20405)
-FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17976)
-FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 123405)
-FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42236)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28702)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 30021)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76515)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28300)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 26159)
-FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19595)
-FeeQuoter_supportsInterface:test_SupportsInterface_Success() (gas: 13263)
-FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 12198)
-FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23872)
-FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 28648)
-FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74816)
-FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 145691)
-FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 52443)
-FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 66423)
-FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 20124)
-FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 93563)
-FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 53142)
-FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12431)
-FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 10710)
-FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 4057945)
-FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10906)
-FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6841)
-FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6567)
-HybridLockReleaseUSDCTokenPool_TransferLiquidity:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 176859)
-HybridLockReleaseUSDCTokenPool_TransferLiquidity:test_transferLiquidity_Success() (gas: 167004)
-HybridLockReleaseUSDCTokenPool_lockOrBurn:test_PrimaryMechanism_Success() (gas: 135878)
-HybridLockReleaseUSDCTokenPool_lockOrBurn:test_WhileMigrationPause_Revert() (gas: 109718)
-HybridLockReleaseUSDCTokenPool_lockOrBurn:test_onLockReleaseMechanism_Success() (gas: 146937)
-HybridLockReleaseUSDCTokenPool_lockOrBurn:test_onLockReleaseMechanism_thenSwitchToPrimary_Success() (gas: 209160)
-HybridLockReleaseUSDCTokenPool_releaseOrMint:test_OnLockReleaseMechanism_Success() (gas: 213127)
-HybridLockReleaseUSDCTokenPool_releaseOrMint:test_WhileMigrationPause_Revert() (gas: 109646)
-HybridLockReleaseUSDCTokenPool_releaseOrMint:test_incomingMessageWithPrimaryMechanism() (gas: 265910)
-LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3209936)
-LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 29734)
-LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 80625)
-LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59227)
-LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3206264)
-LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11511)
-LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 74100)
-LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 54745)
-LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 223256)
-LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11003)
-LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18182)
-LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10250)
-LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83328)
-LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 56101)
-LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60188)
-LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464)
+BurnFromMintTokenPool_lockOrBurn:test_PoolBurn() (gas: 238950)
+BurnFromMintTokenPool_lockOrBurn:test_setup() (gas: 24178)
+BurnMintTokenPool_lockOrBurn:test_PoolBurn() (gas: 236872)
+BurnMintTokenPool_lockOrBurn:test_Setup() (gas: 17819)
+BurnMintTokenPool_releaseOrMint:test_PoolMint() (gas: 102527)
+BurnMintWithLockReleaseFlagTokenPool_lockOrBurn:test_LockOrBurn_CorrectReturnData() (gas: 237292)
+BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn() (gas: 239012)
+BurnWithFromMintTokenPool_lockOrBurn:test_Setup() (gas: 24169)
+CCIPClientExample_sanity:test_ImmutableExamples() (gas: 2072849)
+CCIPHome__validateConfig:test__validateConfig() (gas: 300016)
+CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners() (gas: 332965)
+CCIPHome__validateConfig:test__validateConfigSmallerFChain() (gas: 459322)
+CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs() (gas: 350127)
+CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs() (gas: 282241)
+CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes() (gas: 373692)
+CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet() (gas: 1455733)
+CCIPHome_constructor:test_constructor() (gas: 3547489)
+CCIPHome_getAllConfigs:test_getAllConfigs() (gas: 2772793)
+CCIPHome_getCapabilityConfiguration:test_getCapabilityConfiguration() (gas: 9073)
+CCIPHome_getConfigDigests:test_getConfigDigests() (gas: 2547587)
+CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins() (gas: 5113791)
+CCIPHome_revokeCandidate:test_revokeCandidate() (gas: 30647)
+CCIPHome_setCandidate:test_setCandidate() (gas: 1365392)
+CCIPHome_supportsInterface:test_supportsInterface() (gas: 9885)
+DefensiveExampleTest:test_HappyPath() (gas: 200517)
+DefensiveExampleTest:test_Recovery() (gas: 424996)
+E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1490237)
+ERC165CheckerReverting_supportsInterfaceReverting:test__supportsInterfaceReverting() (gas: 10445)
+EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96964)
+EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49797)
+EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17460)
+EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15748)
+EtherSenderReceiverTest_ccipSend:test_ccipSend_feeToken() (gas: 145087)
+EtherSenderReceiverTest_ccipSend:test_ccipSend_native() (gas: 80451)
+EtherSenderReceiverTest_ccipSend:test_ccipSend_nativeExcess() (gas: 80616)
+EtherSenderReceiverTest_ccipSend:test_ccipSend_weth() (gas: 96167)
+EtherSenderReceiverTest_constructor:test_constructor() (gas: 17582)
+EtherSenderReceiverTest_getFee:test_getFee() (gas: 27482)
+EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16700)
+EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16611)
+EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25455)
+EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25372)
+EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17955)
+EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25327)
+EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26347)
+FactoryBurnMintERC20_approve:test_Approve() (gas: 55786)
+FactoryBurnMintERC20_burn:test_BasicBurn() (gas: 172448)
+FactoryBurnMintERC20_burnFrom:test_BurnFrom() (gas: 58290)
+FactoryBurnMintERC20_burnFromAlias:test_BurnFrom() (gas: 58264)
+FactoryBurnMintERC20_constructor:test_Constructor() (gas: 1450297)
+FactoryBurnMintERC20_decreaseApproval:test_DecreaseApproval() (gas: 31420)
+FactoryBurnMintERC20_getCCIPAdmin:test_getCCIPAdmin() (gas: 12740)
+FactoryBurnMintERC20_getCCIPAdmin:test_setCCIPAdmin() (gas: 23852)
+FactoryBurnMintERC20_grantMintAndBurnRoles:test_GrantMintAndBurnRoles() (gas: 121216)
+FactoryBurnMintERC20_grantRole:test_GrantBurnAccess() (gas: 53386)
+FactoryBurnMintERC20_grantRole:test_GrantMany() (gas: 961708)
+FactoryBurnMintERC20_grantRole:test_GrantMintAccess() (gas: 94181)
+FactoryBurnMintERC20_increaseApproval:test_IncreaseApproval() (gas: 44421)
+FactoryBurnMintERC20_mint:test_BasicMint() (gas: 149826)
+FactoryBurnMintERC20_supportsInterface:test_SupportsInterface() (gas: 11539)
+FactoryBurnMintERC20_transfer:test_Transfer() (gas: 42505)
+FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates() (gas: 141541)
+FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroInput() (gas: 12536)
+FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates() (gas: 162691)
+FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens() (gas: 54793)
+FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken() (gas: 45276)
+FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12380)
+FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig() (gas: 88736)
+FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13218)
+FeeQuoter_constructor:test_Setup() (gas: 5039899)
+FeeQuoter_convertTokenAmount:test_ConvertTokenAmount() (gas: 68417)
+FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost() (gas: 96377)
+FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost() (gas: 21075)
+FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector() (gas: 14836)
+FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices() (gas: 73123)
+FeeQuoter_getTokenAndGasPrices:test_StalenessCheckDisabled() (gas: 111926)
+FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice() (gas: 109013)
+FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed() (gas: 68180)
+FeeQuoter_getTokenPrice:test_GetTokenPrice_LocalMoreRecent() (gas: 33568)
+FeeQuoter_getTokenPrices:test_GetTokenPrices() (gas: 78534)
+FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee() (gas: 37322)
+FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee() (gas: 35101)
+FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas() (gas: 28149)
+FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee() (gas: 96077)
+FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee() (gas: 20587)
+FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas() (gas: 27978)
+FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas() (gas: 27979)
+FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee() (gas: 40537)
+FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults() (gas: 29706)
+FeeQuoter_getValidatedFee:test_EmptyMessage() (gas: 83608)
+FeeQuoter_getValidatedFee:test_HighGasMessage() (gas: 240058)
+FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer() (gas: 143671)
+FeeQuoter_getValidatedFee:test_SingleTokenMessage() (gas: 115178)
+FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier() (gas: 63919)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice() (gas: 58905)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed() (gas: 65115)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals() (gas: 1897724)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals() (gas: 1897766)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals() (gas: 1877822)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals() (gas: 1897564)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals() (gas: 1897700)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value() (gas: 1897534)
+FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod() (gas: 65233)
+FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken() (gas: 61854)
+FeeQuoter_onReport:test_OnReport_SkipPriceUpdateWhenStaleUpdateReceived() (gas: 52631)
+FeeQuoter_onReport:test_onReport() (gas: 89096)
+FeeQuoter_onReport:test_onReport_withKeystoneForwarderContract() (gas: 122724)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault() (gas: 17207)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1() (gas: 18283)
+FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2() (gas: 18391)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2() (gas: 28669)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount() (gas: 30001)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData() (gas: 76624)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1() (gas: 28300)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs() (gas: 26158)
+FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount() (gas: 19641)
+FeeQuoter_supportsInterface:test_SupportsInterface() (gas: 13264)
+FeeQuoter_updatePrices:test_OnlyGasPrice() (gas: 23912)
+FeeQuoter_updatePrices:test_OnlyTokenPrice() (gas: 28761)
+FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller() (gas: 74821)
+FeeQuoter_updatePrices:test_UpdateMultiplePrices() (gas: 146024)
+FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 52517)
+FeeQuoter_updateTokenPriceFeeds:test_FeedUnset() (gas: 66506)
+FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate() (gas: 93647)
+FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate() (gas: 53215)
+FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds() (gas: 12471)
+FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress() (gas: 6789)
+FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress() (gas: 6514)
+HybridLockReleaseUSDCTokenPool_TransferLiquidity:test_transferLiquidity() (gas: 167013)
+HybridLockReleaseUSDCTokenPool_lockOrBurn:test_PrimaryMechanism() (gas: 130356)
+HybridLockReleaseUSDCTokenPool_lockOrBurn:test_onLockReleaseMechanism() (gas: 140104)
+HybridLockReleaseUSDCTokenPool_lockOrBurn:test_onLockReleaseMechanism_thenSwitchToPrimary() (gas: 202967)
+HybridLockReleaseUSDCTokenPool_releaseOrMint:test_OnLockReleaseMechanism() (gas: 206218)
+HybridLockReleaseUSDCTokenPool_releaseOrMint:test_incomingMessageWithPrimaryMechanism() (gas: 260387)
+LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity() (gas: 3222607)
+LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList() (gas: 72828)
+LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint() (gas: 217898)
+LockReleaseTokenPool_setRebalancer:test_SetRebalancer() (gas: 18183)
+LockReleaseTokenPool_supportsInterface:test_SupportsInterface() (gas: 10251)
+LockReleaseTokenPool_transferLiquidity:test_transferLiquidity() (gas: 83263)
MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5456)
-MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3563)
-MerkleMultiProofTest:test_MerkleRoot256() (gas: 394891)
-MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3661)
+MerkleMultiProofTest:test_MerkleRoot256() (gas: 396915)
+MerkleMultiProofTest:test_MerkleRootSingleLeaf() (gas: 3684)
MerkleMultiProofTest:test_SpecSync_gas() (gas: 34152)
-MockRouterTest:test_ccipSendWithEVMExtraArgsV1_Success() (gas: 110095)
-MockRouterTest:test_ccipSendWithEVMExtraArgsV2_Success() (gas: 132614)
-MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 34059)
-MockRouterTest:test_ccipSendWithInvalidEVMExtraArgs_Revert() (gas: 106706)
-MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60864)
-MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126741)
-MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 63499)
-MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 44070)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ConfigRateMoreThanCapacity_Revert() (gas: 16554)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ConfigRateZero_Revert() (gas: 16634)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_DiableConfigCapacityNonZero_Revert() (gas: 16585)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_DisableConfigRateNonZero_Revert() (gas: 16571)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 133973)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 316663)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 17490)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 76620)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 76603)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 38739)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 53937)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 17154)
-MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 12481)
-MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 1977286)
-MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2093583)
-MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 30794)
-MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 48169)
-MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15907)
-MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17624)
-MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21652)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 14636)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210637)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 58473)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 17791)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 45202)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 46514)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76999)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 309039)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50680)
-MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 51331)
-MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19375)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15914)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210357)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 60266)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 47025)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 48305)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 78006)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308985)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 52450)
-MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 10967)
-MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 19190)
-MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 10642)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 18518)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 281000)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 255391)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 205169)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 29012)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_AbiEncoded_Revert() (gas: 14001)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 18365)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 18294)
-MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59441)
-MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44190)
-MultiOCR3Base_setOCR3Configs:test_MoreTransmittersThanSigners_Revert() (gas: 104844)
-MultiOCR3Base_setOCR3Configs:test_NoTransmitters_Revert() (gas: 18908)
-MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283842)
-MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422489)
-MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 512288)
-MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters_Success() (gas: 680609)
-MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 829200)
-MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 457530)
-MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12436)
-MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2142528)
-MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141905)
-MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 807791)
-MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 158911)
-MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 112357)
-MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254293)
-MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 861787)
-MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 476186)
-MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 42765)
-MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 48348)
-MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 76893)
-MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 65621)
-MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 33387)
-MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 79597)
-MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 33589)
-MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 47082)
-MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 25583)
-MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 18615)
-MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24193)
-MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 60994)
-MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39824)
-MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 32920)
-NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123604)
-NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySet_overrideAllowed() (gas: 45986)
-NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate_success() (gas: 66889)
-NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12169)
-NonceManager_getInboundNonce:test_getInboundNonce_NoPrevOffRampForChain() (gas: 185821)
-NonceManager_getInboundNonce:test_getInboundNonce_Upgraded() (gas: 152976)
-NonceManager_getInboundNonce:test_getInboundNonce_UpgradedNonceNewSenderStartsAtZero() (gas: 189296)
-NonceManager_getInboundNonce:test_getInboundNonce_UpgradedNonceStartsAtV1Nonce() (gas: 252384)
-NonceManager_getInboundNonce:test_getInboundNonce_UpgradedOffRampNonceSkipsIfMsgInFlight() (gas: 220672)
-NonceManager_getInboundNonce:test_getInboundNonce_UpgradedSenderNoncesReadsPreviousRamp() (gas: 60520)
-NonceManager_getIncrementedOutboundNonce:test_getIncrementedOutboundNonce() (gas: 37979)
-NonceManager_getIncrementedOutboundNonce:test_incrementInboundNonce() (gas: 38756)
-NonceManager_getIncrementedOutboundNonce:test_incrementInboundNonce_SkippedIncorrectNonce() (gas: 23759)
-NonceManager_getIncrementedOutboundNonce:test_incrementNoncesInboundAndOutbound() (gas: 71901)
-NonceManager_getOutboundNonce:test_getOutboundNonce_Upgrade() (gas: 105300)
-NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceNewSenderStartsAtZero() (gas: 166146)
-NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceStartsAtV1Nonce() (gas: 195937)
-NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeSenderNoncesReadsPreviousRamp() (gas: 140158)
-OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5903354)
-OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 626094)
-OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 166505)
-OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 16719)
-OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 274389)
-OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 168604)
-OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 181037)
-OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13441)
-OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 72724)
-OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15519)
-OffRamp_applySourceChainConfigUpdates:test_allowNonOnRampUpdateAfterLaneIsUsed_success() (gas: 284695)
-OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 177591)
-OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 333573)
-OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 276839)
-OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 168529)
-OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 188173)
-OffRamp_batchExecute:test_SingleReport_Success() (gas: 156527)
-OffRamp_batchExecute:test_Unhealthy_Success() (gas: 545431)
-OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10643)
-OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92450)
-OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 63117)
-OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 69655)
-OffRamp_commit:test_InvalidInterval_Revert() (gas: 65803)
-OffRamp_commit:test_InvalidRootRevert() (gas: 64898)
-OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6664144)
-OffRamp_commit:test_NoConfig_Revert() (gas: 6247562)
-OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 112728)
-OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 120561)
-OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 112660)
-OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 354785)
-OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 163983)
-OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 140923)
-OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 147631)
-OffRamp_commit:test_RootWithRMNDisabled_success() (gas: 153596)
-OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 61365)
-OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 231709)
-OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 125027)
-OffRamp_commit:test_Unhealthy_Revert() (gas: 60177)
-OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206221)
-OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 53305)
-OffRamp_constructor:test_Constructor_Success() (gas: 6210339)
-OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 137118)
-OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103828)
-OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101677)
-OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 162599)
-OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 101597)
-OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101598)
-OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17532)
-OffRamp_execute:test_LargeBatch_Success() (gas: 3378447)
-OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 371209)
-OffRamp_execute:test_MultipleReports_Success() (gas: 298806)
-OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7072622)
-OffRamp_execute:test_NoConfig_Revert() (gas: 6297092)
-OffRamp_execute:test_NonArray_Revert() (gas: 27572)
-OffRamp_execute:test_SingleReport_Success() (gas: 175631)
-OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 147790)
-OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6964290)
-OffRamp_execute:test_ZeroReports_Revert() (gas: 17248)
-OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens() (gas: 56213)
-OffRamp_executeSingleMessage:test_executeSingleMessage_NonContract() (gas: 20508)
-OffRamp_executeSingleMessage:test_executeSingleMessage_NonContractWithTokens() (gas: 238130)
-OffRamp_executeSingleMessage:test_executeSingleMessage_WithMessageInterceptor() (gas: 91994)
-OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens() (gas: 268223)
-OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28659)
-OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 15530)
-OffRamp_executeSingleReport:test_InvalidSourcePoolAddress() (gas: 474738)
-OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48296)
-OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 34101)
-OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28824)
-OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 187677)
-OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 197809)
-OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40687)
-OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 405023)
-OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 248786)
-OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 192430)
-OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 212456)
-OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 243699)
-OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 141510)
-OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 402622)
-OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58242)
-OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73812)
-OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 574336)
-OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 522887)
-OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 26795)
-OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 540963)
-OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 540910)
-OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 452000)
-OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135231)
-OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 164892)
-OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3905742)
-OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 121048)
-OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 89737)
-OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 81694)
-OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 74284)
-OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 172639)
-OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 213251)
-OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 27248)
-OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 165935)
-OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 27774)
-OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55362)
-OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 489669)
-OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 314861)
-OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2224794)
-OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165330)
-OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 226161)
-OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 226701)
-OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 774719)
-OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 344726)
-OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37632)
-OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 101465)
-OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36790)
-OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 91430)
-OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 83518)
-OffRamp_releaseOrMintTokens:test_releaseOrMintTokens() (gas: 168872)
-OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_RevertWhenInvalidDataLengthReturnData() (gas: 62822)
-OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_RevertWhenPoolDoesNotSupportDest() (gas: 78426)
-OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride() (gas: 170742)
-OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals() (gas: 181981)
-OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11465)
-OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13975)
-OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 47491)
-OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 25464)
-OffRamp_trialExecute:test_trialExecute() (gas: 271859)
-OffRamp_trialExecute:test_trialExecute_RateLimitError() (gas: 127545)
-OffRamp_trialExecute:test_trialExecute_TokenHandlingErrorIsCaught() (gas: 138855)
-OffRamp_trialExecute:test_trialExecute_TokenPoolIsNotAContract() (gas: 289500)
-OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 251641)
-OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 17227)
-OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_Revert() (gas: 67101)
-OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_Success() (gas: 325983)
-OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 65892)
-OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 12902)
-OnRamp_constructor:test_Constructor_EnableAllowList_ForwardFromRouter_Reverts() (gas: 2569362)
-OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 95148)
-OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 93090)
-OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 98066)
-OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 93146)
-OnRamp_constructor:test_Constructor_Success() (gas: 2647459)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115432)
-OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146300)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145875)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 144080)
-OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 146072)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145470)
-OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 140731)
-OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38526)
-OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143112)
-OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36611)
-OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36493)
-OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 18290)
-OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38412)
-OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23629)
-OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186715)
-OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 213144)
-OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 147070)
-OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161303)
-OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 4073863)
-OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24015)
-OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75854)
-OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38588)
-OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 281529)
-OnRamp_getFee:test_EmptyMessage_Success() (gas: 98692)
-OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 65475)
-OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 87119)
-OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35166)
-OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113865)
-OnRamp_getFee:test_Unhealthy_Revert() (gas: 17040)
-OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10565)
-OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35405)
-OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 11535)
-OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZero_Revert() (gas: 13194)
-OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert() (gas: 11499)
-OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 11938)
-OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13264)
-OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56440)
-OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 125901)
-PingPong_ccipReceive:test_CcipReceive_Success() (gas: 172880)
-PingPong_setOutOfOrderExecution:test_OutOfOrderExecution_Success() (gas: 20283)
-PingPong_setPaused:test_Pausing_Success() (gas: 17738)
-PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 151993)
-PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 177608)
-RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1079685)
-RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23879)
-RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 10597)
-RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 10843)
-RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1085033)
-RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19041)
-RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 10889)
-RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 10628)
-RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 28147)
-RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 597564)
-RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 15071)
-RMNHome_setCandidate:test_setCandidate_success() (gas: 589330)
-RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 30186)
-RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 18854)
-RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 14009)
-RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 104862)
-RMNHome_validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 18850)
-RMNHome_validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 18710)
-RMNHome_validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 20387)
-RMNHome_validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_NotEnoughObservers_reverts() (gas: 21405)
-RMNHome_validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 137318)
-RMNHome_validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 20522)
-RMNRemote_constructor:test_constructor() (gas: 8398)
-RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 154501)
-RMNRemote_curse:test_curse_calledByNonOwner_reverts() (gas: 18734)
-RMNRemote_curse:test_curse_success() (gas: 149475)
-RMNRemote_global_and_legacy_curses:test_global_and_legacy_curses_success() (gas: 133441)
+MockRouterTest:test_ccipSendWithEVMExtraArgsV1() (gas: 110081)
+MockRouterTest:test_ccipSendWithEVMExtraArgsV2() (gas: 132594)
+MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue() (gas: 126679)
+MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens() (gas: 44038)
+MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs() (gas: 317373)
+MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes() (gas: 134278)
+MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig() (gas: 76755)
+MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound() (gas: 76797)
+MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig() (gas: 54084)
+MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference() (gas: 38924)
+MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs() (gas: 12505)
+MultiAggregateRateLimiter_constructor:test_Constructor() (gas: 2102740)
+MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers() (gas: 1986594)
+MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket() (gas: 30888)
+MultiAggregateRateLimiter_getTokenBucket:test_Refill() (gas: 48378)
+MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue() (gas: 17616)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains() (gas: 211462)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken() (gas: 58832)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens() (gas: 17918)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled() (gas: 45460)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset() (gas: 77765)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens() (gas: 50967)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains() (gas: 310077)
+MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes() (gas: 51611)
+MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens() (gas: 19379)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains() (gas: 211014)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken() (gas: 60544)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled() (gas: 47112)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset() (gas: 78506)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens() (gas: 52677)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains() (gas: 309835)
+MultiAggregateRateLimiter_setFeeQuoter:test_Owner() (gas: 19146)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains() (gas: 281364)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain() (gas: 255770)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves() (gas: 205543)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken() (gas: 29151)
+MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners() (gas: 512335)
+MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners() (gas: 829238)
+MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters() (gas: 680660)
+MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners() (gas: 457485)
+MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput() (gas: 12437)
+MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs() (gas: 2142785)
+MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners() (gas: 861909)
+MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners() (gas: 476109)
+MultiOCR3Base_transmit:test_TransmitSigners_gas() (gas: 33559)
+MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas() (gas: 18638)
+NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123595)
+NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySet_overrideAllowed() (gas: 45935)
+NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66937)
+NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12145)
+NonceManager_getInboundNonce:test_getInboundNonce_NoPrevOffRampForChain() (gas: 178906)
+NonceManager_getInboundNonce:test_getInboundNonce_Upgraded() (gas: 146095)
+NonceManager_getInboundNonce:test_getInboundNonce_UpgradedNonceNewSenderStartsAtZero() (gas: 182376)
+NonceManager_getInboundNonce:test_getInboundNonce_UpgradedNonceStartsAtV1Nonce() (gas: 245089)
+NonceManager_getInboundNonce:test_getInboundNonce_UpgradedOffRampNonceSkipsIfMsgInFlight() (gas: 213735)
+NonceManager_getInboundNonce:test_getInboundNonce_UpgradedSenderNoncesReadsPreviousRamp() (gas: 60418)
+NonceManager_getIncrementedOutboundNonce:test_getIncrementedOutboundNonce() (gas: 37974)
+NonceManager_getIncrementedOutboundNonce:test_incrementInboundNonce() (gas: 38746)
+NonceManager_getIncrementedOutboundNonce:test_incrementInboundNonce_SkippedIncorrectNonce() (gas: 23739)
+NonceManager_getIncrementedOutboundNonce:test_incrementNoncesInboundAndOutbound() (gas: 71886)
+NonceManager_getOutboundNonce:test_getOutboundNonce_Upgrade() (gas: 105254)
+NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceNewSenderStartsAtZero() (gas: 166086)
+NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceStartsAtV1Nonce() (gas: 195806)
+NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeSenderNoncesReadsPreviousRamp() (gas: 140101)
+OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains() (gas: 626140)
+OffRamp_applySourceChainConfigUpdates:test_AddNewChain() (gas: 166441)
+OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates() (gas: 16671)
+OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain() (gas: 180998)
+OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp() (gas: 168513)
+OffRamp_applySourceChainConfigUpdates:test_allowNonOnRampUpdateAfterLaneIsUsed() (gas: 284861)
+OffRamp_batchExecute:test_MultipleReportsDifferentChains() (gas: 326028)
+OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain() (gas: 170852)
+OffRamp_batchExecute:test_MultipleReportsSameChain() (gas: 269327)
+OffRamp_batchExecute:test_MultipleReportsSkipDuplicate() (gas: 161811)
+OffRamp_batchExecute:test_SingleReport() (gas: 149617)
+OffRamp_batchExecute:test_Unhealthy() (gas: 533326)
+OffRamp_commit:test_OnlyGasPriceUpdates() (gas: 112973)
+OffRamp_commit:test_OnlyTokenPriceUpdates() (gas: 112927)
+OffRamp_commit:test_PriceSequenceNumberCleared() (gas: 355397)
+OffRamp_commit:test_ReportAndPriceUpdate() (gas: 164209)
+OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 141051)
+OffRamp_commit:test_RootWithRMNDisabled() (gas: 153873)
+OffRamp_commit:test_StaleReportWithRoot() (gas: 232101)
+OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot() (gas: 206722)
+OffRamp_constructor:test_Constructor() (gas: 6269512)
+OffRamp_execute:test_LargeBatch() (gas: 3373860)
+OffRamp_execute:test_MultipleReports() (gas: 291458)
+OffRamp_execute:test_MultipleReportsWithPartialValidationFailures() (gas: 364776)
+OffRamp_execute:test_SingleReport() (gas: 168850)
+OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens() (gas: 51610)
+OffRamp_executeSingleMessage:test_executeSingleMessage_NonContract() (gas: 20514)
+OffRamp_executeSingleMessage:test_executeSingleMessage_NonContractWithTokens() (gas: 230418)
+OffRamp_executeSingleMessage:test_executeSingleMessage_WithMessageInterceptor() (gas: 87465)
+OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens() (gas: 259935)
+OffRamp_executeSingleReport:test_InvalidSourcePoolAddress() (gas: 455358)
+OffRamp_executeSingleReport:test_ReceiverError() (gas: 180797)
+OffRamp_executeSingleReport:test_SingleMessageNoTokens() (gas: 205270)
+OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain() (gas: 241357)
+OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered() (gas: 185263)
+OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver() (gas: 243920)
+OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 134656)
+OffRamp_executeSingleReport:test_SkippedIncorrectNonce() (gas: 58298)
+OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes() (gas: 392394)
+OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE() (gas: 562427)
+OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 510808)
+OffRamp_executeSingleReport:test_Unhealthy() (gas: 528949)
+OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain() (gas: 439299)
+OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage() (gas: 158038)
+OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered() (gas: 128422)
+OffRamp_getExecutionState:test_FillExecutionState() (gas: 3955662)
+OffRamp_getExecutionState:test_GetDifferentChainExecutionState() (gas: 121311)
+OffRamp_getExecutionState:test_GetExecutionState() (gas: 90102)
+OffRamp_manuallyExecute:test_manuallyExecute() (gas: 212368)
+OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched() (gas: 165742)
+OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit() (gas: 479145)
+OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2229662)
+OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride() (gas: 212918)
+OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride() (gas: 732218)
+OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages() (gas: 337015)
+OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken() (gas: 94629)
+OffRamp_releaseOrMintTokens:test_releaseOrMintTokens() (gas: 161157)
+OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride() (gas: 163023)
+OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals() (gas: 174276)
+OffRamp_setDynamicConfig:test_SetDynamicConfig() (gas: 25442)
+OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor() (gas: 47493)
+OffRamp_trialExecute:test_trialExecute() (gas: 263635)
+OffRamp_trialExecute:test_trialExecute_RateLimitError() (gas: 120721)
+OffRamp_trialExecute:test_trialExecute_TokenHandlingErrorIsCaught() (gas: 132031)
+OffRamp_trialExecute:test_trialExecute_TokenPoolIsNotAContract() (gas: 281380)
+OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy() (gas: 244294)
+OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates() (gas: 325979)
+OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 17190)
+OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates() (gas: 65874)
+OnRamp_constructor:test_Constructor() (gas: 2672129)
+OnRamp_forwardFromRouter:test_ForwardFromRouter() (gas: 145362)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2() (gas: 146196)
+OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue() (gas: 115375)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145760)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 144036)
+OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 146001)
+OnRamp_forwardFromRouter:test_ForwardFromRouter_ConfigurableSourceRouter() (gas: 140639)
+OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered() (gas: 186473)
+OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce() (gas: 212828)
+OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 147007)
+OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception() (gas: 274726)
+OnRamp_getFee:test_EmptyMessage() (gas: 99005)
+OnRamp_getFee:test_GetFeeOfZeroForTokenMessage() (gas: 86961)
+OnRamp_getFee:test_SingleTokenMessage() (gas: 114125)
+OnRamp_getTokenPool:test_GetTokenPool() (gas: 35382)
+OnRamp_setDynamicConfig:test_setDynamicConfig() (gas: 56650)
+OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens() (gas: 125835)
+PingPong_ccipReceive:test_CcipReceive() (gas: 165845)
+PingPong_setOutOfOrderExecution:test_OutOfOrderExecution() (gas: 20350)
+PingPong_setPaused:test_Pausing() (gas: 17738)
+PingPong_startPingPong:test_StartPingPong_With_OOO() (gas: 144996)
+PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered() (gas: 170649)
+RMNHome_getConfigDigests:test_getConfigDigests() (gas: 1081176)
+RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive() (gas: 1086556)
+RMNHome_revokeCandidate:test_revokeCandidate() (gas: 28085)
+RMNHome_setCandidate:test_setCandidate() (gas: 590250)
+RMNHome_setDynamicConfig:test_setDynamicConfig() (gas: 105498)
+RMNProxy_constructor:test_Constructor() (gas: 302031)
+RMNProxy_isCursed:test_IsCursed_GlobalCurseSubject() (gas: 89809)
+RMNProxy_setARM:test_SetARM() (gas: 16599)
+RMNProxy_setARM:test_SetARMzero() (gas: 11275)
+RMNRemote_constructor:test_constructor() (gas: 8410)
+RMNRemote_curse:test_curse() (gas: 149422)
+RMNRemote_global_curses:test_isCursed_globalCurseSubject() (gas: 71707)
RMNRemote_isBlessed:test_isBlessed() (gas: 17588)
-RMNRemote_setConfig:test_setConfig_ZeroValueNotAllowed_revert() (gas: 37971)
-RMNRemote_setConfig:test_setConfig_addSigner_removeSigner_success() (gas: 993448)
-RMNRemote_setConfig:test_setConfig_duplicateOnChainPublicKey_reverts() (gas: 323540)
-RMNRemote_setConfig:test_setConfig_invalidSignerOrder_reverts() (gas: 80201)
-RMNRemote_setConfig:test_setConfig_notEnoughSigners_reverts() (gas: 54232)
-RMNRemote_uncurse:test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() (gas: 51940)
-RMNRemote_uncurse:test_uncurse_calledByNonOwner_reverts() (gas: 18615)
-RMNRemote_uncurse:test_uncurse_success() (gas: 40135)
-RMNRemote_verify_withConfigNotSet:test_verify_reverts() (gas: 13600)
-RMNRemote_verify_withConfigSet:test_verify_InvalidSignature_reverts() (gas: 96471)
-RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_duplicateSignature_reverts() (gas: 94289)
-RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_not_sorted_reverts() (gas: 101352)
-RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 304744)
-RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 428284)
-RMNRemote_verify_withConfigSet:test_verify_success() (gas: 86181)
-RateLimiter_constructor:test_Constructor_Success() (gas: 19806)
-RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16042)
-RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22435)
-RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31495)
-RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20403)
-RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40693)
-RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15800)
-RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25781)
-RateLimiter_consume:test_Refill_Success() (gas: 37447)
-RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18388)
-RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24930)
-RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38947)
-RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46852)
-RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38509)
-RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36107)
-RegistryModuleOwnerCustom_registerAccessControlDefaultAdmin:test_registerAccessControlDefaultAdmin_Revert() (gas: 20200)
-RegistryModuleOwnerCustom_registerAccessControlDefaultAdmin:test_registerAccessControlDefaultAdmin_Success() (gas: 130631)
-RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19797)
-RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130126)
-RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19602)
-RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 129930)
-Router_applyRampUpdates:test_applyRampUpdates_OffRampUpdatesWithRouting() (gas: 10749731)
-Router_applyRampUpdates:test_applyRampUpdates_OnRampDisable() (gas: 56422)
-Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 131447)
-Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 221710)
-Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 71858)
-Router_ccipSend:test_InvalidMsgValue() (gas: 32411)
-Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 69524)
-Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 193318)
-Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 61550)
-Router_ccipSend:test_NativeFeeToken_Success() (gas: 191922)
-Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 226583)
-Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 25056)
-Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 45056)
-Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 194231)
-Router_ccipSend:test_ccipSend_nativeFeeNoTokenSuccess_gas() (gas: 140696)
-Router_ccipSend:test_ccipSend_nativeFeeOneTokenSuccess_gas() (gas: 230894)
-Router_constructor:test_Constructor_Success() (gas: 13222)
+RMNRemote_setConfig:test_setConfig_addSigner_removeSigner() (gas: 994169)
+RMNRemote_uncurse:test_uncurse() (gas: 40136)
+RMNRemote_verify_withConfigSet:test_verify() (gas: 86470)
+RateLimiter_constructor:test_Constructor() (gas: 19820)
+RateLimiter_consume:test_ConsumeAggregateValue() (gas: 31633)
+RateLimiter_consume:test_ConsumeTokens() (gas: 20369)
+RateLimiter_consume:test_ConsumeUnlimited() (gas: 40923)
+RateLimiter_consume:test_Refill() (gas: 37562)
+RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState() (gas: 39126)
+RateLimiter_currentTokenBucketState:test_Refill() (gas: 47182)
+RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig() (gas: 38645)
+RegistryModuleOwnerCustom_registerAccessControlDefaultAdmin:test_registerAccessControlDefaultAdmin() (gas: 130641)
+RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin() (gas: 130136)
+RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner() (gas: 129941)
+Router_applyRampUpdates:test_applyRampUpdates_OffRampUpdatesWithRouting() (gas: 10413055)
+Router_applyRampUpdates:test_applyRampUpdates_OnRampDisable() (gas: 56445)
+Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 124459)
+Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 211890)
+Router_ccipSend:test_InvalidMsgValue() (gas: 27856)
+Router_ccipSend:test_NativeFeeToken() (gas: 184996)
+Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 62458)
+Router_ccipSend:test_NativeFeeTokenOverpay() (gas: 186413)
+Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 54550)
+Router_ccipSend:test_NonLinkFeeToken() (gas: 219583)
+Router_ccipSend:test_WrappedNativeFeeToken() (gas: 187235)
+Router_ccipSend:test_ccipSend_nativeFeeNoTokenSuccess_gas() (gas: 133616)
+Router_ccipSend:test_ccipSend_nativeFeeOneTokenSuccess_gas() (gas: 221091)
+Router_constructor:test_Constructor() (gas: 13148)
Router_getArmProxy:test_getArmProxy() (gas: 10573)
-Router_getFee:test_GetFeeSupportedChain_Success() (gas: 51934)
-Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17385)
-Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10565)
-Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11410)
-Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20199)
-Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11236)
-Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 349502)
-Router_recoverTokens:test_RecoverTokens_Success() (gas: 52667)
-Router_routeMessage:test_routeMessage_AutoExec_Success() (gas: 43213)
-Router_routeMessage:test_routeMessage_ExecutionEvent_Success() (gas: 159418)
-Router_routeMessage:test_routeMessage_ManualExec_Success() (gas: 35723)
-Router_routeMessage:test_routeMessage_OnlyOffRamp_Revert() (gas: 25376)
-Router_routeMessage:test_routeMessage_WhenNotHealthy_Revert() (gas: 44812)
-Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 11030)
-TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51433)
-TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 44189)
-TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12662)
-TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 67155)
-TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 11395)
-TokenAdminRegistry_getPool:test_getPool_Success() (gas: 17701)
-TokenAdminRegistry_getPools:test_getPools_Success() (gas: 40331)
-TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 106315)
-TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 104412)
-TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 15643)
-TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 15177)
-TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 113094)
-TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 108031)
-TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 116216)
-TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 12651)
-TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 54735)
-TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 19316)
-TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 18170)
-TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36267)
-TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30875)
-TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18202)
-TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49592)
-TokenPoolFactory_constructor:test_constructor_Revert() (gas: 1121653)
-TokenPoolFactory_createTokenPool:test_createTokenPoolLockRelease_ExistingToken_predict_Success() (gas: 12612969)
-TokenPoolFactory_createTokenPool:test_createTokenPool_BurnFromMintTokenPool_Success() (gas: 6513874)
-TokenPoolFactory_createTokenPool:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 13434268)
-TokenPoolFactory_createTokenPool:test_createTokenPool_RemoteTokenHasDifferentDecimals_Success() (gas: 13441570)
-TokenPoolFactory_createTokenPool:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 13771048)
-TokenPoolFactory_createTokenPool:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 6301066)
-TokenPoolFactory_createTokenPool:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 6510314)
-TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 2827849)
-TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12119)
-TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23567)
-TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 178398)
-TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23929)
-TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8408)
-TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 25005)
-TokenPoolWithAllowList_setRouter:test_ZeroAddressNotAllowed_Revert() (gas: 10729)
-TokenPool_addRemotePool:test_NonExistentChain_Revert() (gas: 14222)
-TokenPool_addRemotePool:test_PoolAlreadyAdded_Revert() (gas: 117205)
-TokenPool_addRemotePool:test_ZeroLengthAddressNotAllowed_Revert() (gas: 14014)
-TokenPool_addRemotePool:test_addRemotePool_MultipleActive() (gas: 472820)
-TokenPool_addRemotePool:test_addRemotePool_Success() (gas: 157095)
-TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 455575)
-TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 15032)
-TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 11863)
-TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 592089)
-TokenPool_applyChainUpdates:test_applyChainUpdates_UpdatesRemotePoolHashes() (gas: 1077776)
-TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 226472)
+Router_getFee:test_GetFeeSupportedChain() (gas: 52021)
+Router_recoverTokens:test_RecoverTokens() (gas: 52668)
+Router_routeMessage:test_routeMessage_AutoExec() (gas: 38071)
+Router_routeMessage:test_routeMessage_ExecutionEvent() (gas: 153593)
+Router_routeMessage:test_routeMessage_ManualExec() (gas: 31120)
+TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole() (gas: 44236)
+TokenAdminRegistry_addRegistryModule:test_addRegistryModule() (gas: 67093)
+TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds() (gas: 11363)
+TokenAdminRegistry_getPool:test_getPool() (gas: 17679)
+TokenAdminRegistry_getPools:test_getPools() (gas: 40271)
+TokenAdminRegistry_isAdministrator:test_isAdministrator() (gas: 106335)
+TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module() (gas: 113043)
+TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner() (gas: 107992)
+TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed() (gas: 116200)
+TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule() (gas: 54757)
+TokenAdminRegistry_setPool:test_setPool() (gas: 36207)
+TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool() (gas: 30852)
+TokenAdminRegistry_transferAdminRole:test_transferAdminRole() (gas: 49558)
+TokenPoolFactory_createTokenPool:test_createTokenPoolLockRelease_ExistingToken_predict() (gas: 12646379)
+TokenPoolFactory_createTokenPool:test_createTokenPool_BurnFromMintTokenPool() (gas: 6526762)
+TokenPoolFactory_createTokenPool:test_createTokenPool_ExistingRemoteToken_AndPredictPool() (gas: 13480657)
+TokenPoolFactory_createTokenPool:test_createTokenPool_RemoteTokenHasDifferentDecimals() (gas: 13488141)
+TokenPoolFactory_createTokenPool:test_createTokenPool_WithNoExistingRemoteContracts_predict() (gas: 13819502)
+TokenPoolFactory_createTokenPool:test_createTokenPool_WithNoExistingTokenOnRemoteChain() (gas: 6315855)
+TokenPoolFactory_createTokenPool:test_createTokenPool_WithRemoteTokenAndRemotePool() (gas: 6523352)
+TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList() (gas: 178482)
+TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero() (gas: 23580)
+TokenPoolWithAllowList_getAllowList:test_GetAllowList() (gas: 23908)
+TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled() (gas: 8386)
+TokenPoolWithAllowList_setRouter:test_SetRouter() (gas: 24994)
+TokenPool_addRemotePool:test_addRemotePool() (gas: 157121)
+TokenPool_addRemotePool:test_addRemotePool_MultipleActive() (gas: 453937)
+TokenPool_applyChainUpdates:test_applyChainUpdates() (gas: 592354)
+TokenPool_applyChainUpdates:test_applyChainUpdates_UpdatesRemotePoolHashes() (gas: 1077690)
TokenPool_calculateLocalAmount:test_calculateLocalAmount() (gas: 93680)
TokenPool_constructor:test_constructor() (gas: 21930)
-TokenPool_constructor:test_constructor_DecimalCallFails() (gas: 2824157)
-TokenPool_getRemotePool:test_getRemotePools() (gas: 330500)
-TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 21504)
-TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 240435)
-TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 94291)
-TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 21156)
-TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 204376)
-TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 49238)
-TokenPool_parseRemoteDecimals:test_parseRemoteDecimals() (gas: 14020)
-TokenPool_parseRemoteDecimals:test_parseRemoteDecimals_NoDecimalsDefaultsToLocalDecimals() (gas: 9727)
-TokenPool_removeRemotePool:test_InvalidRemotePoolForChain_Revert() (gas: 17499)
-TokenPool_removeRemotePool:test_NonExistentChain_Revert() (gas: 14344)
-TokenPool_removeRemotePool:test_removeRemotePool_Success() (gas: 188387)
-TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17214)
-TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 15307)
-TokenPool_setChainRateLimiterConfigs:test_MismatchedArrayLengths_Revert() (gas: 23960)
-TokenPool_setChainRateLimiterConfigs:test_NonExistentChain_Revert() (gas: 19424)
-TokenPool_setChainRateLimiterConfigs:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 16511)
-TokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11002)
-TokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 37606)
-USDCBridgeMigrator_BurnLockedUSDC:test_PrimaryMechanism_Success() (gas: 135887)
-USDCBridgeMigrator_BurnLockedUSDC:test_WhileMigrationPause_Revert() (gas: 109751)
-USDCBridgeMigrator_BurnLockedUSDC:test_invalidPermissions_Revert() (gas: 39493)
-USDCBridgeMigrator_BurnLockedUSDC:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 309833)
-USDCBridgeMigrator_BurnLockedUSDC:test_onLockReleaseMechanism_Success() (gas: 146961)
-USDCBridgeMigrator_BurnLockedUSDC:test_onLockReleaseMechanism_thenSwitchToPrimary_Success() (gas: 209124)
-USDCBridgeMigrator_cancelMigrationProposal:test_cancelExistingCCTPMigrationProposal_Success() (gas: 56155)
-USDCBridgeMigrator_cancelMigrationProposal:test_cannotCancelANonExistentMigrationProposal_Revert() (gas: 12669)
-USDCBridgeMigrator_excludeTokensFromBurn:test_excludeTokensWhenNoMigrationProposalPending_Revert() (gas: 13579)
-USDCBridgeMigrator_proposeMigration:test_ChainNotUsingLockRelease_Revert() (gas: 15765)
-USDCBridgeMigrator_provideLiquidity:test_PrimaryMechanism_Success() (gas: 136004)
-USDCBridgeMigrator_provideLiquidity:test_WhileMigrationPause_Revert() (gas: 109893)
-USDCBridgeMigrator_provideLiquidity:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 13390)
-USDCBridgeMigrator_provideLiquidity:test_cannotProvideLiquidityWhenMigrationProposalPending_Revert() (gas: 67428)
-USDCBridgeMigrator_provideLiquidity:test_cannotProvideLiquidity_AfterMigration_Revert() (gas: 313933)
-USDCBridgeMigrator_provideLiquidity:test_invalidPermissions_Revert() (gas: 39493)
-USDCBridgeMigrator_provideLiquidity:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 310092)
-USDCBridgeMigrator_provideLiquidity:test_onLockReleaseMechanism_Success() (gas: 147102)
-USDCBridgeMigrator_provideLiquidity:test_onLockReleaseMechanism_thenSwitchToPrimary_Success() (gas: 209430)
-USDCBridgeMigrator_releaseOrMint:test_OnLockReleaseMechanism_Success() (gas: 213160)
-USDCBridgeMigrator_releaseOrMint:test_WhileMigrationPause_Revert() (gas: 109679)
-USDCBridgeMigrator_releaseOrMint:test_incomingMessageWithPrimaryMechanism() (gas: 265963)
-USDCBridgeMigrator_releaseOrMint:test_unstickManualTxAfterMigration_destChain_Success() (gas: 150538)
-USDCBridgeMigrator_releaseOrMint:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 511783)
-USDCBridgeMigrator_updateChainSelectorMechanism:test_PrimaryMechanism_Success() (gas: 136021)
-USDCBridgeMigrator_updateChainSelectorMechanism:test_WhileMigrationPause_Revert() (gas: 109871)
-USDCBridgeMigrator_updateChainSelectorMechanism:test_cannotRevertChainMechanism_afterMigration_Revert() (gas: 313532)
-USDCBridgeMigrator_updateChainSelectorMechanism:test_invalidPermissions_Revert() (gas: 39471)
-USDCBridgeMigrator_updateChainSelectorMechanism:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 310092)
-USDCBridgeMigrator_updateChainSelectorMechanism:test_onLockReleaseMechanism_Success() (gas: 147057)
-USDCBridgeMigrator_updateChainSelectorMechanism:test_onLockReleaseMechanism_thenSwitchToPrimary_Success() (gas: 209483)
-USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 26049)
-USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35319)
-USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 29897)
-USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133426)
-USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 433430)
-USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 265695)
-USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 47231)
-USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 95262)
-USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66437)
-USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11314)
-USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10107)
\ No newline at end of file
+TokenPool_constructor:test_constructor_DecimalCallFails() (gas: 2836717)
+TokenPool_getRemotePool:test_getRemotePools() (gas: 330476)
+TokenPool_onlyOffRamp:test_onlyOffRamp() (gas: 94348)
+TokenPool_onlyOnRamp:test_onlyOnRamp() (gas: 49257)
+TokenPool_parseRemoteDecimals:test_parseRemoteDecimals() (gas: 14030)
+TokenPool_parseRemoteDecimals:test_parseRemoteDecimals_NoDecimalsDefaultsToLocalDecimals() (gas: 9705)
+TokenPool_removeRemotePool:test_removeRemotePool() (gas: 188402)
+TokenPool_setRateLimitAdmin:test_SetRateLimitAdmin() (gas: 37630)
+USDCBridgeMigrator_BurnLockedUSDC:test_PrimaryMechanism() (gas: 130520)
+USDCBridgeMigrator_BurnLockedUSDC:test_lockOrBurn_then_BurnInCCTPMigration() (gas: 303986)
+USDCBridgeMigrator_BurnLockedUSDC:test_onLockReleaseMechanism() (gas: 140171)
+USDCBridgeMigrator_BurnLockedUSDC:test_onLockReleaseMechanism_thenSwitchToPrimary() (gas: 203330)
+USDCBridgeMigrator_cancelMigrationProposal:test_cancelExistingCCTPMigrationProposal() (gas: 56117)
+USDCBridgeMigrator_provideLiquidity:test_PrimaryMechanism() (gas: 130538)
+USDCBridgeMigrator_provideLiquidity:test_lockOrBurn_then_BurnInCCTPMigration() (gas: 303986)
+USDCBridgeMigrator_provideLiquidity:test_onLockReleaseMechanism() (gas: 140260)
+USDCBridgeMigrator_provideLiquidity:test_onLockReleaseMechanism_thenSwitchToPrimary() (gas: 203331)
+USDCBridgeMigrator_releaseOrMint:test_OnLockReleaseMechanism() (gas: 206251)
+USDCBridgeMigrator_releaseOrMint:test_incomingMessageWithPrimaryMechanism() (gas: 260440)
+USDCBridgeMigrator_releaseOrMint:test_unstickManualTxAfterMigration_destChain() (gas: 142763)
+USDCBridgeMigrator_releaseOrMint:test_unstickManualTxAfterMigration_homeChain() (gas: 505520)
+USDCBridgeMigrator_updateChainSelectorMechanism:test_PrimaryMechanism() (gas: 130520)
+USDCBridgeMigrator_updateChainSelectorMechanism:test_lockOrBurn_then_BurnInCCTPMigration() (gas: 303968)
+USDCBridgeMigrator_updateChainSelectorMechanism:test_onLockReleaseMechanism() (gas: 140260)
+USDCBridgeMigrator_updateChainSelectorMechanism:test_onLockReleaseMechanism_thenSwitchToPrimary() (gas: 203312)
+USDCTokenPool_lockOrBurn:test_LockOrBurn() (gas: 128094)
+USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx() (gas: 260189)
+USDCTokenPool_supportsInterface:test_SupportsInterface() (gas: 10108)
\ No newline at end of file
diff --git a/contracts/gas-snapshots/shared.gas-snapshot b/contracts/gas-snapshots/shared.gas-snapshot
index 54475701734..fc8096cbb5d 100644
--- a/contracts/gas-snapshots/shared.gas-snapshot
+++ b/contracts/gas-snapshots/shared.gas-snapshot
@@ -1,111 +1,111 @@
-AuthorizedCallers_applyAuthorizedCallerUpdates:test_AddAndRemove_Success() (gas: 124848)
-AuthorizedCallers_applyAuthorizedCallerUpdates:test_OnlyAdd_Success() (gas: 132793)
-AuthorizedCallers_applyAuthorizedCallerUpdates:test_OnlyCallableByOwner_Revert() (gas: 12218)
-AuthorizedCallers_applyAuthorizedCallerUpdates:test_OnlyRemove_Success() (gas: 44833)
-AuthorizedCallers_applyAuthorizedCallerUpdates:test_RemoveThenAdd_Success() (gas: 56901)
-AuthorizedCallers_applyAuthorizedCallerUpdates:test_SkipRemove_Success() (gas: 31911)
-AuthorizedCallers_applyAuthorizedCallerUpdates:test_ZeroAddressNotAllowed_Revert() (gas: 64612)
-AuthorizedCallers_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 64589)
-AuthorizedCallers_constructor:test_constructor_Success() (gas: 663486)
-BurnMintERC20_approve:test_approve() (gas: 57609)
-BurnMintERC20_burn:test_BasicBurn() (gas: 153528)
-BurnMintERC20_burnFrom:test_BurnFrom() (gas: 57965)
-BurnMintERC20_burnFromAlias:test_burn() (gas: 58009)
-BurnMintERC20_constructor:test_Constructor() (gas: 1680059)
-BurnMintERC20_getCCIPAdmin:test_getCCIPAdmin() (gas: 10544)
-BurnMintERC20_getCCIPAdmin:test_setCCIPAdmin() (gas: 21562)
-BurnMintERC20_grantMintAndBurnRoles:test_GrantMintAndBurnRoles() (gas: 79089)
-BurnMintERC20_mint:test_mint() (gas: 101815)
-BurnMintERC20_supportsInterface:test_SupportsInterface() (gas: 11202)
-BurnMintERC20_transfer:test_transfer() (gas: 42318)
-BurnMintERC677_approve:testApproveSuccess() (gas: 55477)
-BurnMintERC677_approve:testInvalidAddressReverts() (gas: 10653)
-BurnMintERC677_burn:testBasicBurnSuccess() (gas: 172022)
-BurnMintERC677_burn:testBurnFromZeroAddressReverts() (gas: 47166)
-BurnMintERC677_burn:testExceedsBalanceReverts() (gas: 21816)
-BurnMintERC677_burn:testSenderNotBurnerReverts() (gas: 13346)
-BurnMintERC677_burnFrom:testBurnFromSuccess() (gas: 57928)
-BurnMintERC677_burnFrom:testExceedsBalanceReverts() (gas: 35838)
-BurnMintERC677_burnFrom:testInsufficientAllowanceReverts() (gas: 21824)
-BurnMintERC677_burnFrom:testSenderNotBurnerReverts() (gas: 13346)
-BurnMintERC677_burnFromAlias:testBurnFromSuccess() (gas: 57955)
-BurnMintERC677_burnFromAlias:testExceedsBalanceReverts() (gas: 35854)
-BurnMintERC677_burnFromAlias:testInsufficientAllowanceReverts() (gas: 21844)
-BurnMintERC677_burnFromAlias:testSenderNotBurnerReverts() (gas: 13366)
-BurnMintERC677_constructor:testConstructorSuccess() (gas: 1651040)
-BurnMintERC677_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31049)
-BurnMintERC677_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121279)
-BurnMintERC677_grantRole:testGrantBurnAccessSuccess() (gas: 53402)
-BurnMintERC677_grantRole:testGrantManySuccess() (gas: 937593)
-BurnMintERC677_grantRole:testGrantMintAccessSuccess() (gas: 94280)
-BurnMintERC677_increaseApproval:testIncreaseApprovalSuccess() (gas: 44052)
-BurnMintERC677_mint:testBasicMintSuccess() (gas: 149664)
-BurnMintERC677_mint:testMaxSupplyExceededReverts() (gas: 50323)
-BurnMintERC677_mint:testSenderNotMinterReverts() (gas: 11182)
-BurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12455)
-BurnMintERC677_transfer:testInvalidAddressReverts() (gas: 10629)
-BurnMintERC677_transfer:testTransferSuccess() (gas: 42279)
-CallWithExactGas__callWithExactGas:test_CallWithExactGasReceiverErrorSuccess() (gas: 65883)
-CallWithExactGas__callWithExactGas:test_CallWithExactGasSafeReturnDataExactGas() (gas: 18293)
-CallWithExactGas__callWithExactGas:test_NoContractReverts() (gas: 11544)
-CallWithExactGas__callWithExactGas:test_NoGasForCallExactCheckReverts() (gas: 15760)
-CallWithExactGas__callWithExactGas:test_NotEnoughGasForCallReverts() (gas: 16210)
-CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractExactGasSuccess() (gas: 20033)
-CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractReceiverErrorSuccess() (gas: 66394)
-CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoContractSuccess() (gas: 12942)
-CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoGasForCallExactCheckReturnFalseSuccess() (gas: 12984)
-CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NotEnoughGasForCallReturnsFalseSuccess() (gas: 13293)
-CallWithExactGas__callWithExactGasSafeReturnData:test_CallWithExactGasSafeReturnDataExactGas() (gas: 20287)
-CallWithExactGas__callWithExactGasSafeReturnData:test_NoContractReverts() (gas: 13915)
-CallWithExactGas__callWithExactGasSafeReturnData:test_NoGasForCallExactCheckReverts() (gas: 16108)
-CallWithExactGas__callWithExactGasSafeReturnData:test_NotEnoughGasForCallReverts() (gas: 16513)
-CallWithExactGas__callWithExactGasSafeReturnData:test_callWithExactGasSafeReturnData_ThrowOOGError_Revert() (gas: 36713)
-EnumerableMapAddresses_at:testAtSuccess() (gas: 95055)
-EnumerableMapAddresses_at:testBytes32AtSuccess() (gas: 94828)
-EnumerableMapAddresses_at:testBytesAtSuccess() (gas: 96507)
-EnumerableMapAddresses_contains:testBytes32ContainsSuccess() (gas: 93503)
-EnumerableMapAddresses_contains:testBytesContainsSuccess() (gas: 93974)
-EnumerableMapAddresses_contains:testContainsSuccess() (gas: 93678)
-EnumerableMapAddresses_get:testBytes32GetSuccess() (gas: 94238)
-EnumerableMapAddresses_get:testBytesGetSuccess() (gas: 95919)
-EnumerableMapAddresses_get:testGetSuccess() (gas: 94409)
-EnumerableMapAddresses_get_errorMessage:testBytesGetErrorMessageSuccess() (gas: 95852)
-EnumerableMapAddresses_get_errorMessage:testGetErrorMessageSuccess() (gas: 94467)
-EnumerableMapAddresses_length:testBytes32LengthSuccess() (gas: 72418)
-EnumerableMapAddresses_length:testBytesLengthSuccess() (gas: 73035)
-EnumerableMapAddresses_length:testLengthSuccess() (gas: 72592)
-EnumerableMapAddresses_remove:testBytes32RemoveSuccess() (gas: 73432)
-EnumerableMapAddresses_remove:testBytesRemoveSuccess() (gas: 74216)
-EnumerableMapAddresses_remove:testRemoveSuccess() (gas: 73651)
-EnumerableMapAddresses_set:testBytes32SetSuccess() (gas: 94475)
-EnumerableMapAddresses_set:testBytesSetSuccess() (gas: 95405)
-EnumerableMapAddresses_set:testSetSuccess() (gas: 94638)
-EnumerableMapAddresses_tryGet:testBytes32TryGetSuccess() (gas: 94602)
-EnumerableMapAddresses_tryGet:testBytesTryGetSuccess() (gas: 96316)
-EnumerableMapAddresses_tryGet:testTryGetSuccess() (gas: 94869)
-OpStackBurnMintERC677_constructor:testConstructorSuccess() (gas: 1721342)
-OpStackBurnMintERC677_interfaceCompatibility:testBurnCompatibility() (gas: 291244)
-OpStackBurnMintERC677_interfaceCompatibility:testMintCompatibility() (gas: 137917)
-OpStackBurnMintERC677_interfaceCompatibility:testStaticFunctionsCompatibility() (gas: 13773)
-OpStackBurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12728)
-Ownable2Step_acceptOwnership:test_acceptOwnership_MustBeProposedOwner_reverts() (gas: 10353)
-Ownable2Step_acceptOwnership:test_acceptOwnership_success() (gas: 31070)
-Ownable2Step_constructor:test_constructor_OwnerCannotBeZero_reverts() (gas: 35924)
-Ownable2Step_constructor:test_constructor_success() (gas: 10424)
-Ownable2Step_onlyOwner:test_onlyOwner_OnlyCallableByOwner_reverts() (gas: 10746)
-Ownable2Step_onlyOwner:test_onlyOwner_success() (gas: 7503)
-Ownable2Step_transferOwnership:test_transferOwnership_CannotTransferToSelf_reverts() (gas: 10494)
-Ownable2Step_transferOwnership:test_transferOwnership_success() (gas: 30124)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_EmptySubset_Reverts() (gas: 5191)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_EmptySuperset_Reverts() (gas: 4522)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_HasDuplicates_Reverts() (gas: 7738)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_NotASubset_Reverts() (gas: 11700)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SingleElementSubset() (gas: 3908)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SingleElementSubsetAndSuperset_Equal() (gas: 1459)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SingleElementSubsetAndSuperset_NotEqual_Reverts() (gas: 6149)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SubsetEqualsSuperset_NoRevert() (gas: 7830)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SubsetLargerThanSuperset_Reverts() (gas: 15363)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SupersetHasDuplicates_Reverts() (gas: 8767)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_UnsortedSubset_Reverts() (gas: 7106)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_UnsortedSuperset_Reverts() (gas: 8947)
-SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_ValidSubset_Success() (gas: 5653)
\ No newline at end of file
+AuthorizedCallers_applyAuthorizedCallerUpdates:test_AddAndRemove_Success() (gas: 124942)
+AuthorizedCallers_applyAuthorizedCallerUpdates:test_OnlyAdd_Success() (gas: 132869)
+AuthorizedCallers_applyAuthorizedCallerUpdates:test_OnlyCallableByOwner_Revert() (gas: 12238)
+AuthorizedCallers_applyAuthorizedCallerUpdates:test_OnlyRemove_Success() (gas: 44907)
+AuthorizedCallers_applyAuthorizedCallerUpdates:test_RemoveThenAdd_Success() (gas: 56991)
+AuthorizedCallers_applyAuthorizedCallerUpdates:test_SkipRemove_Success() (gas: 31961)
+AuthorizedCallers_applyAuthorizedCallerUpdates:test_ZeroAddressNotAllowed_Revert() (gas: 64413)
+AuthorizedCallers_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 64390)
+AuthorizedCallers_constructor:test_constructor_Success() (gas: 674931)
+BurnMintERC20_approve:test_approve() (gas: 57652)
+BurnMintERC20_burn:test_BasicBurn() (gas: 153607)
+BurnMintERC20_burnFrom:test_BurnFrom() (gas: 57995)
+BurnMintERC20_burnFromAlias:test_burn() (gas: 58039)
+BurnMintERC20_constructor:test_Constructor() (gas: 1694831)
+BurnMintERC20_getCCIPAdmin:test_getCCIPAdmin() (gas: 10548)
+BurnMintERC20_getCCIPAdmin:test_setCCIPAdmin() (gas: 21590)
+BurnMintERC20_grantMintAndBurnRoles:test_GrantMintAndBurnRoles() (gas: 79142)
+BurnMintERC20_mint:test_mint() (gas: 101849)
+BurnMintERC20_supportsInterface:test_SupportsInterface() (gas: 11218)
+BurnMintERC20_transfer:test_transfer() (gas: 42338)
+BurnMintERC677_approve:testApproveSuccess() (gas: 55512)
+BurnMintERC677_approve:testInvalidAddressReverts() (gas: 10663)
+BurnMintERC677_burn:testBasicBurnSuccess() (gas: 172100)
+BurnMintERC677_burn:testBurnFromZeroAddressReverts() (gas: 47201)
+BurnMintERC677_burn:testExceedsBalanceReverts() (gas: 21841)
+BurnMintERC677_burn:testSenderNotBurnerReverts() (gas: 13359)
+BurnMintERC677_burnFrom:testBurnFromSuccess() (gas: 57959)
+BurnMintERC677_burnFrom:testExceedsBalanceReverts() (gas: 35864)
+BurnMintERC677_burnFrom:testInsufficientAllowanceReverts() (gas: 21849)
+BurnMintERC677_burnFrom:testSenderNotBurnerReverts() (gas: 13359)
+BurnMintERC677_burnFromAlias:testBurnFromSuccess() (gas: 57985)
+BurnMintERC677_burnFromAlias:testExceedsBalanceReverts() (gas: 35880)
+BurnMintERC677_burnFromAlias:testInsufficientAllowanceReverts() (gas: 21869)
+BurnMintERC677_burnFromAlias:testSenderNotBurnerReverts() (gas: 13379)
+BurnMintERC677_constructor:testConstructorSuccess() (gas: 1672812)
+BurnMintERC677_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31069)
+BurnMintERC677_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121324)
+BurnMintERC677_grantRole:testGrantBurnAccessSuccess() (gas: 53442)
+BurnMintERC677_grantRole:testGrantManySuccess() (gas: 937759)
+BurnMintERC677_grantRole:testGrantMintAccessSuccess() (gas: 94323)
+BurnMintERC677_increaseApproval:testIncreaseApprovalSuccess() (gas: 44076)
+BurnMintERC677_mint:testBasicMintSuccess() (gas: 149699)
+BurnMintERC677_mint:testMaxSupplyExceededReverts() (gas: 50363)
+BurnMintERC677_mint:testSenderNotMinterReverts() (gas: 11195)
+BurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12476)
+BurnMintERC677_transfer:testInvalidAddressReverts() (gas: 10639)
+BurnMintERC677_transfer:testTransferSuccess() (gas: 42299)
+CallWithExactGas__callWithExactGas:test_CallWithExactGasReceiverErrorSuccess() (gas: 65949)
+CallWithExactGas__callWithExactGas:test_CallWithExactGasSafeReturnDataExactGas() (gas: 18324)
+CallWithExactGas__callWithExactGas:test_NoContractReverts() (gas: 11559)
+CallWithExactGas__callWithExactGas:test_NoGasForCallExactCheckReverts() (gas: 15788)
+CallWithExactGas__callWithExactGas:test_NotEnoughGasForCallReverts() (gas: 16241)
+CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractExactGasSuccess() (gas: 20073)
+CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractReceiverErrorSuccess() (gas: 66461)
+CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoContractSuccess() (gas: 12962)
+CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoGasForCallExactCheckReturnFalseSuccess() (gas: 13005)
+CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NotEnoughGasForCallReturnsFalseSuccess() (gas: 13317)
+CallWithExactGas__callWithExactGasSafeReturnData:test_CallWithExactGasSafeReturnDataExactGas() (gas: 20331)
+CallWithExactGas__callWithExactGasSafeReturnData:test_NoContractReverts() (gas: 13939)
+CallWithExactGas__callWithExactGasSafeReturnData:test_NoGasForCallExactCheckReverts() (gas: 16139)
+CallWithExactGas__callWithExactGasSafeReturnData:test_NotEnoughGasForCallReverts() (gas: 16547)
+CallWithExactGas__callWithExactGasSafeReturnData:test_callWithExactGasSafeReturnData_ThrowOOGError_Revert() (gas: 36755)
+EnumerableMapAddresses_at:testAtSuccess() (gas: 95086)
+EnumerableMapAddresses_at:testBytes32AtSuccess() (gas: 94855)
+EnumerableMapAddresses_at:testBytesAtSuccess() (gas: 96542)
+EnumerableMapAddresses_contains:testBytes32ContainsSuccess() (gas: 93518)
+EnumerableMapAddresses_contains:testBytesContainsSuccess() (gas: 93990)
+EnumerableMapAddresses_contains:testContainsSuccess() (gas: 93696)
+EnumerableMapAddresses_get:testBytes32GetSuccess() (gas: 94256)
+EnumerableMapAddresses_get:testBytesGetSuccess() (gas: 95945)
+EnumerableMapAddresses_get:testGetSuccess() (gas: 94431)
+EnumerableMapAddresses_get_errorMessage:testBytesGetErrorMessageSuccess() (gas: 95878)
+EnumerableMapAddresses_get_errorMessage:testGetErrorMessageSuccess() (gas: 94489)
+EnumerableMapAddresses_length:testBytes32LengthSuccess() (gas: 72445)
+EnumerableMapAddresses_length:testBytesLengthSuccess() (gas: 73064)
+EnumerableMapAddresses_length:testLengthSuccess() (gas: 72623)
+EnumerableMapAddresses_remove:testBytes32RemoveSuccess() (gas: 73462)
+EnumerableMapAddresses_remove:testBytesRemoveSuccess() (gas: 74249)
+EnumerableMapAddresses_remove:testRemoveSuccess() (gas: 73686)
+EnumerableMapAddresses_set:testBytes32SetSuccess() (gas: 94496)
+EnumerableMapAddresses_set:testBytesSetSuccess() (gas: 95428)
+EnumerableMapAddresses_set:testSetSuccess() (gas: 94663)
+EnumerableMapAddresses_tryGet:testBytes32TryGetSuccess() (gas: 94622)
+EnumerableMapAddresses_tryGet:testBytesTryGetSuccess() (gas: 96345)
+EnumerableMapAddresses_tryGet:testTryGetSuccess() (gas: 94893)
+OpStackBurnMintERC677_constructor:testConstructorSuccess() (gas: 1743682)
+OpStackBurnMintERC677_interfaceCompatibility:testBurnCompatibility() (gas: 291483)
+OpStackBurnMintERC677_interfaceCompatibility:testMintCompatibility() (gas: 137957)
+OpStackBurnMintERC677_interfaceCompatibility:testStaticFunctionsCompatibility() (gas: 13781)
+OpStackBurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12752)
+Ownable2Step_acceptOwnership:test_acceptOwnership_MustBeProposedOwner_reverts() (gas: 10360)
+Ownable2Step_acceptOwnership:test_acceptOwnership_success() (gas: 31088)
+Ownable2Step_constructor:test_constructor_OwnerCannotBeZero_reverts() (gas: 35858)
+Ownable2Step_constructor:test_constructor_success() (gas: 10428)
+Ownable2Step_onlyOwner:test_onlyOwner_OnlyCallableByOwner_reverts() (gas: 10754)
+Ownable2Step_onlyOwner:test_onlyOwner_success() (gas: 7506)
+Ownable2Step_transferOwnership:test_transferOwnership_CannotTransferToSelf_reverts() (gas: 10501)
+Ownable2Step_transferOwnership:test_transferOwnership_success() (gas: 30140)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_EmptySubset_Reverts() (gas: 5208)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_EmptySuperset_Reverts() (gas: 4535)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_HasDuplicates_Reverts() (gas: 7761)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_NotASubset_Reverts() (gas: 11733)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SingleElementSubset() (gas: 3922)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SingleElementSubsetAndSuperset_Equal() (gas: 1464)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SingleElementSubsetAndSuperset_NotEqual_Reverts() (gas: 6172)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SubsetEqualsSuperset_NoRevert() (gas: 7859)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SubsetLargerThanSuperset_Reverts() (gas: 15410)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_SupersetHasDuplicates_Reverts() (gas: 8790)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_UnsortedSubset_Reverts() (gas: 7128)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_UnsortedSuperset_Reverts() (gas: 8970)
+SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_ValidSubset_Success() (gas: 5671)
\ No newline at end of file
diff --git a/contracts/gas-snapshots/workflow.gas-snapshot b/contracts/gas-snapshots/workflow.gas-snapshot
index 9195c401ef3..bdfd2b24aec 100644
--- a/contracts/gas-snapshots/workflow.gas-snapshot
+++ b/contracts/gas-snapshots/workflow.gas-snapshot
@@ -17,9 +17,9 @@ WorkflowRegistryManager_getVersion:test_WhenVersionNumberIsRegistered() (gas: 28
WorkflowRegistryManager_getVersionNumberByContractAddressAndChainID:test_WhenAVersionIsRegisteredForTheContractAddressAndChainIDCombination() (gas: 285022)
WorkflowRegistryManager_getVersionNumberByContractAddressAndChainID:test_WhenNoVersionIsRegisteredForTheContractAddressAndChainIDCombination() (gas: 286634)
WorkflowRegistryManager_getVersionNumberByContractAddressAndChainID:test_WhenTheContractAddressIsInvalid() (gas: 284604)
-WorkflowRegistry_activateWorkflow:test_WhenTheCallerIsAnAuthorizedAddress() (gas: 495029)
-WorkflowRegistry_deleteWorkflow:test_WhenTheCallerIsAnAuthorizedAddress_AndTheDonIDIsAllowed() (gas: 403945)
-WorkflowRegistry_deleteWorkflow:test_WhenTheCallerIsAnAuthorizedAddress_AndTheDonIDIsNotAllowed() (gas: 421748)
+WorkflowRegistry_activateWorkflow:test_WhenTheCallerIsAnAuthorizedAddress() (gas: 517416)
+WorkflowRegistry_deleteWorkflow:test_WhenTheCallerIsAnAuthorizedAddress_AndTheDonIDIsAllowed() (gas: 422157)
+WorkflowRegistry_deleteWorkflow:test_WhenTheCallerIsAnAuthorizedAddress_AndTheDonIDIsNotAllowed() (gas: 439960)
WorkflowRegistry_getAllAllowedDONs:test_WhenTheRegistryIsLocked() (gas: 47473)
WorkflowRegistry_getAllAllowedDONs:test_WhenTheSetOfAllowedDONsIsEmpty() (gas: 25780)
WorkflowRegistry_getAllAllowedDONs:test_WhenThereAreMultipleAllowedDONs() (gas: 75437)
@@ -28,9 +28,9 @@ WorkflowRegistry_getAllAuthorizedAddresses:test_WhenTheRegistryIsLocked() (gas:
WorkflowRegistry_getAllAuthorizedAddresses:test_WhenTheSetOfAuthorizedAddressesIsEmpty() (gas: 26152)
WorkflowRegistry_getAllAuthorizedAddresses:test_WhenThereAreMultipleAuthorizedAddresses() (gas: 78270)
WorkflowRegistry_getAllAuthorizedAddresses:test_WhenThereIsASingleAuthorizedAddress() (gas: 16832)
-WorkflowRegistry_getWorkflowMetadata:test_WhenTheRegistryIsLocked() (gas: 519145)
+WorkflowRegistry_getWorkflowMetadata:test_WhenTheRegistryIsLocked() (gas: 541532)
WorkflowRegistry_getWorkflowMetadata:test_WhenTheWorkflowDoesNotExist() (gas: 17543)
-WorkflowRegistry_getWorkflowMetadata:test_WhenTheWorkflowExistsWithTheOwnerAndName() (gas: 490001)
+WorkflowRegistry_getWorkflowMetadata:test_WhenTheWorkflowExistsWithTheOwnerAndName() (gas: 512388)
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitExceedsTotalWorkflows() (gas: 128146)
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitIsEqualToTotalWorkflows() (gas: 128035)
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitIsLessThanTotalWorkflows() (gas: 90141)
@@ -48,17 +48,17 @@ WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenStartIsGreaterThanOrEqu
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenTheOwnerHasNoWorkflows() (gas: 14006)
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenTheRegistryIsLocked() (gas: 165968)
WorkflowRegistry_lockRegistry:test_WhenTheCallerIsTheContractOwner() (gas: 38758)
-WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsAllowed_AndTheCallerIsAnAuthorizedAddress() (gas: 494993)
-WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsAllowed_AndTheCallerIsAnUnauthorizedAddress() (gas: 502796)
-WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsNotAllowed_AndTheCallerIsAnAuthorizedAddress() (gas: 502555)
-WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsNotAllowed_AndTheCallerIsAnUnauthorizedAddress() (gas: 506966)
-WorkflowRegistry_registerWorkflow:test_WhenTheWorkflowInputsAreAllValid() (gas: 549769)
-WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsAnAuthorizedAddress_AndTheWorkflowIsInAnAllowedDON() (gas: 891242)
-WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsAnAuthorizedAddress_AndTheWorkflowIsNotInAnAllowedDON() (gas: 488397)
-WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsNotAnAuthorizedAddress() (gas: 486751)
+WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsAllowed_AndTheCallerIsAnAuthorizedAddress() (gas: 517380)
+WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsAllowed_AndTheCallerIsAnUnauthorizedAddress() (gas: 525183)
+WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsNotAllowed_AndTheCallerIsAnAuthorizedAddress() (gas: 524942)
+WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsNotAllowed_AndTheCallerIsAnUnauthorizedAddress() (gas: 529353)
+WorkflowRegistry_registerWorkflow:test_WhenTheWorkflowInputsAreAllValid() (gas: 572178)
+WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsAnAuthorizedAddress_AndTheWorkflowIsInAnAllowedDON() (gas: 936016)
+WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsAnAuthorizedAddress_AndTheWorkflowIsNotInAnAllowedDON() (gas: 510784)
+WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsNotAnAuthorizedAddress() (gas: 509138)
WorkflowRegistry_unlockRegistry:test_WhenTheCallerIsTheContractOwner() (gas: 30325)
WorkflowRegistry_updateAllowedDONs:test_WhenTheBoolInputIsFalse() (gas: 29739)
WorkflowRegistry_updateAllowedDONs:test_WhenTheBoolInputIsTrue() (gas: 170296)
WorkflowRegistry_updateAuthorizedAddresses:test_WhenTheBoolInputIsFalse() (gas: 30278)
WorkflowRegistry_updateAuthorizedAddresses:test_WhenTheBoolInputIsTrue() (gas: 175515)
-WorkflowRegistry_updateWorkflow:test_WhenTheWorkflowInputsAreAllValid() (gas: 479601)
\ No newline at end of file
+WorkflowRegistry_updateWorkflow:test_WhenTheWorkflowInputsAreAllValid() (gas: 515666)
diff --git a/contracts/scripts/native_solc_compile_all b/contracts/scripts/native_solc_compile_all
index 090d8c8a07b..42abac3c6b3 100755
--- a/contracts/scripts/native_solc_compile_all
+++ b/contracts/scripts/native_solc_compile_all
@@ -12,7 +12,7 @@ python3 -m pip install --require-hashes -r $SCRIPTPATH/requirements.txt
# 6 and 7 are legacy contracts, for each other product we have a native_solc_compile_all_$product script
# These scripts can be run individually, or all together with this script.
# To add new CL products, simply write a native_solc_compile_all_$product script and add it to the list below.
-for product in automation events_mock feeds functions keystone llo-feeds logpoller operatorforwarder shared transmission vrf ccip liquiditymanager workflow
+for product in automation events_mock feeds functions keystone llo-feeds logpoller operatorforwarder shared vrf ccip liquiditymanager workflow
do
$SCRIPTPATH/native_solc_compile_all_$product
done
diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip
index 4b894c1e2f1..8c3168c4fc3 100755
--- a/contracts/scripts/native_solc_compile_all_ccip
+++ b/contracts/scripts/native_solc_compile_all_ccip
@@ -6,85 +6,79 @@ echo " ┌───────────────────────
echo " │ Compiling CCIP contracts... │"
echo " └──────────────────────────────────────────────┘"
-SOLC_VERSION="0.8.24"
-OPTIMIZE_RUNS=26000
-OPTIMIZE_RUNS_OFFRAMP=500
+# The offRamp uses a specific lower optimization runs value. All other contracts use the default value
+# as specified in the foundry.toml.
+OPTIMIZE_RUNS_OFFRAMP=800
+PROJECT="ccip"
+FOUNDRY_PROJECT_SUFFIX="-compile"
+CONTRACTS_DIR="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; cd ../ && pwd -P )"
+export FOUNDRY_PROFILE="$PROJECT"$FOUNDRY_PROJECT_SUFFIX
-SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
-python3 -m pip install --require-hashes -r "$SCRIPTPATH"/requirements.txt
-solc-select install $SOLC_VERSION
-solc-select use $SOLC_VERSION
-export SOLC_VERSION=$SOLC_VERSION
-
-ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; cd ../../ && pwd -P )"
-
-compileContract () {
+compileContract() {
local contract
- contract=$(basename "$1" ".sol")
+ contract=$(basename "$1")
+ echo "Compiling" "$contract"
- local optimize_runs=$OPTIMIZE_RUNS
+ local command
+ command="forge build $CONTRACTS_DIR/src/v0.8/$PROJECT/"$1.sol" \
+ --root $CONTRACTS_DIR \
+ $(getOptimizations "$contract") \
+ --extra-output-files bin abi \
+ -o $CONTRACTS_DIR/solc/$PROJECT/$contract"
- case $1 in
- "ccip/offRamp/OffRamp.sol")
- echo "OffRamp uses $OPTIMIZE_RUNS_OFFRAMP optimizer runs."
- optimize_runs=$OPTIMIZE_RUNS_OFFRAMP
- ;;
- esac
-
- solc --overwrite --optimize --optimize-runs $optimize_runs --metadata-hash none \
- -o "$ROOT"/contracts/solc/v$SOLC_VERSION/"$contract" \
- --abi --bin --allow-paths "$ROOT"/contracts/src/v0.8 \
- --bin-runtime --hashes --metadata --metadata-literal --combined-json abi,hashes,metadata,srcmap,srcmap-runtime \
- --evm-version paris \
- "$ROOT"/contracts/src/v0.8/"$1"
+ $command
}
+# Define optimization overrides in this function. Anything that is not an override will use the default value
+# as specified in the foundry.toml.
+function getOptimizations() {
+ local optimize_runs_override=""
-# Solc produces and overwrites intermediary contracts.
-# Contracts should be ordered in reverse-import-complexity-order to minimize overwrite risks.
-compileContract ccip/offRamp/OffRamp.sol
-compileContract ccip/FeeQuoter.sol
-compileContract ccip/onRamp/OnRamp.sol
-compileContract ccip/applications/PingPongDemo.sol
-compileContract ccip/applications/EtherSenderReceiver.sol
-compileContract ccip/rmn/RMNRemote.sol
-compileContract ccip/rmn/RMNHome.sol
-compileContract ccip/rmn/ARMProxy.sol
-compileContract ccip/MultiAggregateRateLimiter.sol
-compileContract ccip/Router.sol
-compileContract ccip/tokenAdminRegistry/TokenAdminRegistry.sol
-compileContract ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol
-compileContract ccip/capability/CCIPHome.sol
-compileContract ccip/NonceManager.sol
-compileContract shared/token/ERC677/BurnMintERC677.sol
-compileContract shared/token/ERC20/BurnMintERC20.sol
+ case $1 in
+ "OffRamp")
+ optimize_runs_override="--optimizer-runs "$OPTIMIZE_RUNS_OFFRAMP
+ ;;
+ esac
+ echo "$optimize_runs_override"
+}
-# Pools
-compileContract ccip/pools/LockReleaseTokenPool.sol
-compileContract ccip/pools/BurnMintTokenPool.sol
-compileContract ccip/pools/BurnFromMintTokenPool.sol
-compileContract ccip/pools/BurnWithFromMintTokenPool.sol
-compileContract ccip/pools/TokenPool.sol
+compileContract offRamp/OffRamp
+compileContract FeeQuoter
+compileContract onRamp/OnRamp
+compileContract applications/PingPongDemo
+compileContract applications/EtherSenderReceiver
+compileContract MultiAggregateRateLimiter
+compileContract Router
+compileContract tokenAdminRegistry/TokenAdminRegistry
+compileContract tokenAdminRegistry/RegistryModuleOwnerCustom
+compileContract capability/CCIPHome
+compileContract NonceManager
+compileContract rmn/RMNRemote
+compileContract rmn/RMNHome
+compileContract rmn/RMNProxy
+# Pools
+compileContract pools/LockReleaseTokenPool
+compileContract pools/BurnMintTokenPool
+compileContract pools/BurnFromMintTokenPool
+compileContract pools/BurnWithFromMintTokenPool
+compileContract pools/TokenPool
+compileContract pools/USDC/USDCTokenPool
# Test helpers
-compileContract ccip/test/helpers/BurnMintERC677Helper.sol
-compileContract ccip/test/helpers/MessageHasher.sol
-compileContract ccip/test/helpers/USDCReaderTester.sol
-compileContract ccip/test/helpers/ReportCodec.sol
-compileContract ccip/test/helpers/receivers/MaybeRevertMessageReceiver.sol
-compileContract ccip/test/helpers/MultiOCR3Helper.sol
-compileContract ccip/test/mocks/MockE2EUSDCTokenMessenger.sol
-compileContract ccip/test/mocks/MockE2EUSDCTransmitter.sol
-compileContract ccip/test/WETH9.sol
-compileContract ccip/test/helpers/CCIPReaderTester.sol
-
-# Encoding Utils
-compileContract ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol
+compileContract test/helpers/BurnMintERC677Helper
+compileContract test/helpers/MessageHasher
+compileContract test/helpers/USDCReaderTester
+compileContract test/helpers/ReportCodec
+compileContract test/helpers/receivers/MaybeRevertMessageReceiver
+compileContract test/helpers/MultiOCR3Helper
+compileContract test/mocks/MockE2EUSDCTokenMessenger
+compileContract test/mocks/MockE2EUSDCTransmitter
+compileContract test/WETH9
+compileContract test/helpers/CCIPReaderTester
+# Offchain test encoding utils
+compileContract test/helpers/EncodingUtils
-# Customer contracts
-compileContract ccip/pools/USDC/USDCTokenPool.sol
-compileContract tests/MockV3Aggregator.sol
diff --git a/contracts/scripts/native_solc_compile_all_feeds b/contracts/scripts/native_solc_compile_all_feeds
index 2c5808d4663..66cb3f19161 100755
--- a/contracts/scripts/native_solc_compile_all_feeds
+++ b/contracts/scripts/native_solc_compile_all_feeds
@@ -30,6 +30,5 @@ compileContract () {
}
# Aggregators
-compileContract shared/interfaces/AggregatorV2V3Interface.sol
compileContract Chainlink.sol
compileContract ChainlinkClient.sol
diff --git a/contracts/scripts/native_solc_compile_all_shared b/contracts/scripts/native_solc_compile_all_shared
index 841f94354e3..d205b51321c 100755
--- a/contracts/scripts/native_solc_compile_all_shared
+++ b/contracts/scripts/native_solc_compile_all_shared
@@ -6,32 +6,40 @@ echo " ┌───────────────────────
echo " │ Compiling shared contracts... │"
echo " └──────────────────────────────────────────────┘"
-SOLC_VERSION="0.8.19"
-OPTIMIZE_RUNS=1000000
+PROJECT="shared"
+FOUNDRY_PROJECT_SUFFIX=""
+CONTRACTS_DIR="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; cd ../ && pwd -P )"
+export FOUNDRY_PROFILE="$PROJECT"$FOUNDRY_PROJECT_SUFFIX
-SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
-python3 -m pip install --require-hashes -r "$SCRIPTPATH"/requirements.txt
-solc-select install $SOLC_VERSION
-solc-select use $SOLC_VERSION
-export SOLC_VERSION=$SOLC_VERSION
-
-ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; cd ../../ && pwd -P )"
-
-compileContract () {
+compileContract() {
local contract
- contract=$(basename "$1" ".sol")
-
- solc --overwrite --optimize --optimize-runs $OPTIMIZE_RUNS --metadata-hash none \
- -o "$ROOT"/contracts/solc/v$SOLC_VERSION/"$contract" \
- --abi --bin --allow-paths "$ROOT"/contracts/src/v0.8\
- "$ROOT"/contracts/src/v0.8/"$1"
+ contract=$(basename "$1")
+ echo "Compiling" "$contract"
+
+ if [ -n "$2" ]; then
+ echo "Compiling from another project: ""$2"
+ PROJECT=$2
+ fi
+
+ # We override the foundry.toml Solidity version to not change the bytecode.
+ local command
+ command="forge build $CONTRACTS_DIR/src/v0.8/$PROJECT/"$1.sol" \
+ --root $CONTRACTS_DIR \
+ --extra-output-files bin abi \
+ --use 0.8.19 \
+ -o $CONTRACTS_DIR/solc/$PROJECT/$contract"
+
+ $command
}
-compileContract shared/token/ERC677/BurnMintERC677.sol
-compileContract shared/token/ERC677/LinkToken.sol
-compileContract shared/token/ERC20/BurnMintERC20.sol
-compileContract shared/mocks/WERC20Mock.sol
-compileContract vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol
-compileContract shared/test/helpers/ChainReaderTester.sol
-compileContract vendor/multicall/ebd8b64/src/Multicall3.sol
+compileContract token/ERC677/BurnMintERC677
+compileContract token/ERC677/LinkToken
+compileContract token/ERC20/BurnMintERC20
+compileContract test/helpers/ChainReaderTester
+compileContract mocks/WERC20Mock
+compileContract interfaces/AggregatorV3Interface
+
+compileContract openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20 vendor
+compileContract multicall/ebd8b64/src/Multicall3 vendor
+compileContract MockV3Aggregator tests
\ No newline at end of file
diff --git a/contracts/scripts/native_solc_compile_all_transmission b/contracts/scripts/native_solc_compile_all_transmission
deleted file mode 100755
index 9650a2b27d3..00000000000
--- a/contracts/scripts/native_solc_compile_all_transmission
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-echo " ┌──────────────────────────────────────────────┐"
-echo " │ Compiling Transmission contracts... │"
-echo " └──────────────────────────────────────────────┘"
-
-SOLC_VERSION="0.8.19"
-OPTIMIZE_RUNS=1000000
-
-SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
-ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; cd ../../ && pwd -P )"
-python3 -m pip install --require-hashes -r "$SCRIPTPATH"/requirements.txt
-
-solc-select install $SOLC_VERSION
-solc-select use $SOLC_VERSION
-export SOLC_VERSION=$SOLC_VERSION
-
-compileContract () {
- local contract
- contract=$(basename "$1" ".sol")
-
- solc --overwrite --optimize --optimize-runs $OPTIMIZE_RUNS --metadata-hash none \
- -o "$ROOT"/contracts/solc/v$SOLC_VERSION/"$contract" \
- --abi --bin --allow-paths "$ROOT"/contracts/src/v0.8\
- "$ROOT"/contracts/src/v0.8/"$1"
-}
-
-# Contracts
-compileContract transmission/dev/ERC-4337/SCA.sol
-compileContract transmission/dev/ERC-4337/Paymaster.sol
-compileContract transmission/dev/ERC-4337/SmartContractAccountFactory.sol
-
-# Testhelpers
-compileContract transmission/dev/testhelpers/SmartContractAccountHelper.sol
-compileContract transmission/dev/testhelpers/Greeter.sol
-
-# Vendor
-compileContract vendor/entrypoint/core/EntryPoint.sol
diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol
index b312e732e61..8275999af9e 100644
--- a/contracts/src/v0.8/ccip/FeeQuoter.sol
+++ b/contracts/src/v0.8/ccip/FeeQuoter.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IReceiver} from "../keystone/interfaces/IReceiver.sol";
import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol";
@@ -600,7 +600,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver,
// fee logic for other chains should be implemented in the future.
uint256 executionCost = uint112(packedGasPrice)
* (
- destChainConfig.destGasOverhead + (message.data.length * destChainConfig.destGasPerPayloadByte) + tokenTransferGas
+ destChainConfig.destGasOverhead
+ + ((message.data.length + tokenTransferBytesOverhead) * destChainConfig.destGasPerPayloadByte) + tokenTransferGas
+ _parseEVMExtraArgsFromBytes(message.extraArgs, destChainConfig).gasLimit
) * destChainConfig.gasMultiplierWeiPerEth;
diff --git a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
index 4ec67b409d6..fc553e4939c 100644
--- a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
+++ b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol";
import {IFeeQuoter} from "./interfaces/IFeeQuoter.sol";
diff --git a/contracts/src/v0.8/ccip/NonceManager.sol b/contracts/src/v0.8/ccip/NonceManager.sol
index 382844c27d9..d8569658fcc 100644
--- a/contracts/src/v0.8/ccip/NonceManager.sol
+++ b/contracts/src/v0.8/ccip/NonceManager.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol";
import {IEVM2AnyOnRamp} from "./interfaces/IEVM2AnyOnRamp.sol";
diff --git a/contracts/src/v0.8/ccip/Router.sol b/contracts/src/v0.8/ccip/Router.sol
index 150ba00f39d..a3f9e409f72 100644
--- a/contracts/src/v0.8/ccip/Router.sol
+++ b/contracts/src/v0.8/ccip/Router.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol";
import {IAny2EVMMessageReceiver} from "./interfaces/IAny2EVMMessageReceiver.sol";
diff --git a/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol b/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol
index 8a07792782b..ca72079ec4e 100644
--- a/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol
+++ b/contracts/src/v0.8/ccip/applications/EtherSenderReceiver.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
diff --git a/contracts/src/v0.8/ccip/capability/CCIPHome.sol b/contracts/src/v0.8/ccip/capability/CCIPHome.sol
index 829c54c5b62..174b2e3d83b 100644
--- a/contracts/src/v0.8/ccip/capability/CCIPHome.sol
+++ b/contracts/src/v0.8/ccip/capability/CCIPHome.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ICapabilityConfiguration} from "../../keystone/interfaces/ICapabilityConfiguration.sol";
import {INodeInfoProvider} from "../../keystone/interfaces/INodeInfoProvider.sol";
diff --git a/contracts/src/v0.8/ccip/interfaces/IRMNRemote.sol b/contracts/src/v0.8/ccip/interfaces/IRMNRemote.sol
index 74dd8e83fac..37573f2d980 100644
--- a/contracts/src/v0.8/ccip/interfaces/IRMNRemote.sol
+++ b/contracts/src/v0.8/ccip/interfaces/IRMNRemote.sol
@@ -12,7 +12,7 @@ interface IRMNRemote {
}
/// @notice Verifies signatures of RMN nodes, on dest lane updates as provided in the CommitReport.
- /// @param offRampAddress is not inferred by msg.sender, in case the call is made through ARMProxy.
+ /// @param offRampAddress is not inferred by msg.sender, in case the call is made through RMNProxy.
/// @param merkleRoots must be well formed, and is a representation of the CommitReport received from the oracles.
/// @param signatures rmnNodes ECDSA sigs, only r & s, must be sorted in ascending order by signer address.
/// @dev Will revert if verification fails.
diff --git a/contracts/src/v0.8/ccip/libraries/ERC165CheckerReverting.sol b/contracts/src/v0.8/ccip/libraries/ERC165CheckerReverting.sol
new file mode 100644
index 00000000000..574b6d1501a
--- /dev/null
+++ b/contracts/src/v0.8/ccip/libraries/ERC165CheckerReverting.sol
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol";
+
+/// @notice Library used to query support of an interface declared via {IERC165}.
+/// @dev These functions return the actual result of the query: they do not `revert` if an interface is not supported.
+library ERC165CheckerReverting {
+ error InsufficientGasForStaticCall();
+
+ // As per the EIP-165 spec, no interface should ever match 0xffffffff.
+ bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff;
+
+ /// @dev 30k gas is required to make the staticcall. Under the 63/64 rule this means that 30,477 gas must be available
+ /// to ensure that at least 30k is forwarded. Checking for at least 31,000 ensures that after additional
+ /// operations are performed there is still >= 30,477 gas remaining.
+ /// 30,000 = ((30,477 * 63) / 64)
+ uint256 private constant MINIMUM_GAS_REQUIREMENT = 31_000;
+
+ /// @notice Returns true if `account` supports a defined interface.
+ /// @dev The function must support both the interfaceId and interfaces specified by ERC165 generally as per the standard.
+ /// @param account the contract to be queried for support.
+ /// @param interfaceId the interface being checked for support.
+ /// @return true if the contract at account indicates support of the interface with, false otherwise.
+ function _supportsInterfaceReverting(address account, bytes4 interfaceId) internal view returns (bool) {
+ // As a gas optimization, short circuit return false if interfaceId is not supported, as it is most likely interfaceId
+ // to be unsupported by the target.
+ return _supportsERC165InterfaceUncheckedReverting(account, interfaceId)
+ && !_supportsERC165InterfaceUncheckedReverting(account, INTERFACE_ID_INVALID)
+ && _supportsERC165InterfaceUncheckedReverting(account, type(IERC165).interfaceId);
+ }
+
+ /// @notice Query if a contract implements an interface, does not check ERC165 support
+ /// @param account The address of the contract to query for support of an interface
+ /// @param interfaceId The interface identifier, as specified in ERC-165
+ /// @return true if the contract at account indicates support of the interface with
+ /// identifier interfaceId, false otherwise
+ /// @dev Assumes that account contains a contract that supports ERC165, otherwise
+ /// the behavior of this method is undefined. This precondition can be checked.
+ /// @dev Function will only revert if the minimum gas requirement is not met before the staticcall is performed.
+ function _supportsERC165InterfaceUncheckedReverting(address account, bytes4 interfaceId) internal view returns (bool) {
+ bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);
+
+ bool success;
+ uint256 returnSize;
+ uint256 returnValue;
+
+ bytes4 notEnoughGasSelector = InsufficientGasForStaticCall.selector;
+
+ assembly {
+ // The EVM does not return a specific error code if a revert is due to OOG. This check ensures that
+ // the message will not throw an OOG error by requiring that the amount of gas for the following
+ // staticcall exists before invoking it.
+ if lt(gas(), MINIMUM_GAS_REQUIREMENT) {
+ mstore(0x0, notEnoughGasSelector)
+ revert(0x0, 0x4)
+ }
+
+ success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)
+ returnSize := returndatasize()
+ returnValue := mload(0x00)
+ }
+ return success && returnSize >= 0x20 && returnValue > 0;
+ }
+}
diff --git a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
index 76424b4e2a7..2b6f075bc7a 100644
--- a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IAny2EVMMessageReceiver} from "../interfaces/IAny2EVMMessageReceiver.sol";
@@ -13,13 +13,13 @@ import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol";
import {CallWithExactGas} from "../../shared/call/CallWithExactGas.sol";
import {Client} from "../libraries/Client.sol";
+import {ERC165CheckerReverting} from "../libraries/ERC165CheckerReverting.sol";
import {Internal} from "../libraries/Internal.sol";
import {MerkleMultiProof} from "../libraries/MerkleMultiProof.sol";
import {Pool} from "../libraries/Pool.sol";
import {MultiOCR3Base} from "../ocr/MultiOCR3Base.sol";
import {IERC20} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/token/ERC20/IERC20.sol";
-import {ERC165Checker} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165Checker.sol";
import {EnumerableSet} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/structs/EnumerableSet.sol";
/// @notice OffRamp enables OCR networks to execute multiple messages in an OffRamp in a single transaction.
@@ -28,7 +28,7 @@ import {EnumerableSet} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts
/// @dev MultiOCR3Base is used to store multiple OCR configs for the OffRamp. The execution plugin type has to be
/// configured without signature verification, and the commit plugin type with verification.
contract OffRamp is ITypeAndVersion, MultiOCR3Base {
- using ERC165Checker for address;
+ using ERC165CheckerReverting for address;
using EnumerableSet for EnumerableSet.UintSet;
error ZeroChainSelectorNotAllowed();
@@ -604,9 +604,12 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
// 3. If the receiver is a contract but it does not support the IAny2EVMMessageReceiver interface.
//
// The ordering of these checks is important, as the first check is the cheapest to execute.
+ //
+ // To prevent message delivery bypass issues, a modified version of the ERC165Checker is used
+ // which checks for sufficient gas before making the external call.
if (
(message.data.length == 0 && message.gasLimit == 0) || message.receiver.code.length == 0
- || !message.receiver.supportsInterface(type(IAny2EVMMessageReceiver).interfaceId)
+ || !message.receiver._supportsInterfaceReverting(type(IAny2EVMMessageReceiver).interfaceId)
) return;
(bool success, bytes memory returnData,) = s_sourceChainConfigs[message.header.sourceChainSelector]
@@ -647,7 +650,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base {
// This is done to prevent a pool from reverting the entire transaction if it doesn't support the interface.
// The call gets a max or 30k gas per instance, of which there are three. This means offchain gas estimations should
// account for 90k gas overhead due to the interface check.
- if (localPoolAddress == address(0) || !localPoolAddress.supportsInterface(Pool.CCIP_POOL_V1)) {
+ if (localPoolAddress == address(0) || !localPoolAddress._supportsInterfaceReverting(Pool.CCIP_POOL_V1)) {
revert NotACompatiblePool(localPoolAddress);
}
diff --git a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
index e988b17ad82..fb0cbedd5e7 100644
--- a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
+++ b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IEVM2AnyOnRampClient} from "../interfaces/IEVM2AnyOnRampClient.sol";
diff --git a/contracts/src/v0.8/ccip/pools/BurnFromMintTokenPool.sol b/contracts/src/v0.8/ccip/pools/BurnFromMintTokenPool.sol
index 8ce63a12bb5..c42ca75f66d 100644
--- a/contracts/src/v0.8/ccip/pools/BurnFromMintTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/BurnFromMintTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IBurnMintERC20} from "../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/pools/BurnMintTokenPool.sol b/contracts/src/v0.8/ccip/pools/BurnMintTokenPool.sol
index 30203a4ced7..d1d6577b105 100644
--- a/contracts/src/v0.8/ccip/pools/BurnMintTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/BurnMintTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IBurnMintERC20} from "../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/pools/BurnMintTokenPoolAbstract.sol b/contracts/src/v0.8/ccip/pools/BurnMintTokenPoolAbstract.sol
index b3bbf4ff5e1..91472a5f5c8 100644
--- a/contracts/src/v0.8/ccip/pools/BurnMintTokenPoolAbstract.sol
+++ b/contracts/src/v0.8/ccip/pools/BurnMintTokenPoolAbstract.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol b/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol
index fb8538141ca..3659c638dd5 100644
--- a/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/BurnWithFromMintTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IBurnMintERC20} from "../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/pools/LockReleaseTokenPool.sol b/contracts/src/v0.8/ccip/pools/LockReleaseTokenPool.sol
index ecc28a14dd1..54977a95758 100644
--- a/contracts/src/v0.8/ccip/pools/LockReleaseTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/LockReleaseTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ILiquidityContainer} from "../../liquiditymanager/interfaces/ILiquidityContainer.sol";
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
diff --git a/contracts/src/v0.8/ccip/pools/TokenPool.sol b/contracts/src/v0.8/ccip/pools/TokenPool.sol
index 9d8e77a7928..47a2ebad238 100644
--- a/contracts/src/v0.8/ccip/pools/TokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/TokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IPoolV1} from "../interfaces/IPool.sol";
import {IRMN} from "../interfaces/IRMN.sol";
diff --git a/contracts/src/v0.8/ccip/pools/USDC/BurnMintWithLockReleaseFlagTokenPool.sol b/contracts/src/v0.8/ccip/pools/USDC/BurnMintWithLockReleaseFlagTokenPool.sol
index 746df9b4e11..6b46dfacca6 100644
--- a/contracts/src/v0.8/ccip/pools/USDC/BurnMintWithLockReleaseFlagTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/USDC/BurnMintWithLockReleaseFlagTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/pools/USDC/HybridLockReleaseUSDCTokenPool.sol b/contracts/src/v0.8/ccip/pools/USDC/HybridLockReleaseUSDCTokenPool.sol
index 264b1230c7c..89e609fcc5e 100644
--- a/contracts/src/v0.8/ccip/pools/USDC/HybridLockReleaseUSDCTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/USDC/HybridLockReleaseUSDCTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ILiquidityContainer} from "../../../liquiditymanager/interfaces/ILiquidityContainer.sol";
import {ITokenMessenger} from "../USDC/ITokenMessenger.sol";
diff --git a/contracts/src/v0.8/ccip/pools/USDC/USDCBridgeMigrator.sol b/contracts/src/v0.8/ccip/pools/USDC/USDCBridgeMigrator.sol
index 1dcecac8b2f..a8ad7052110 100644
--- a/contracts/src/v0.8/ccip/pools/USDC/USDCBridgeMigrator.sol
+++ b/contracts/src/v0.8/ccip/pools/USDC/USDCBridgeMigrator.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2StepMsgSender} from "../../../shared/access/Ownable2StepMsgSender.sol";
import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol b/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol
index 5998e52f156..524f8f47f70 100644
--- a/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol";
import {IMessageTransmitter} from "./IMessageTransmitter.sol";
diff --git a/contracts/src/v0.8/ccip/rmn/RMNHome.sol b/contracts/src/v0.8/ccip/rmn/RMNHome.sol
index 92aab25ae8e..4fd01a7115b 100644
--- a/contracts/src/v0.8/ccip/rmn/RMNHome.sol
+++ b/contracts/src/v0.8/ccip/rmn/RMNHome.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
diff --git a/contracts/src/v0.8/ccip/rmn/ARMProxy.sol b/contracts/src/v0.8/ccip/rmn/RMNProxy.sol
similarity index 93%
rename from contracts/src/v0.8/ccip/rmn/ARMProxy.sol
rename to contracts/src/v0.8/ccip/rmn/RMNProxy.sol
index 964582686be..7a38e812eeb 100644
--- a/contracts/src/v0.8/ccip/rmn/ARMProxy.sol
+++ b/contracts/src/v0.8/ccip/rmn/RMNProxy.sol
@@ -1,16 +1,16 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol";
-/// @notice The ARMProxy serves to allow CCIP contracts
+/// @notice The RMNProxy serves to allow CCIP contracts
/// to point to a static address for ARM queries, which saves gas
/// since each contract need not store an ARM address in storage. That way
/// we can add ARM queries along many code paths for increased defense in depth
/// with minimal additional cost.
-contract ARMProxy is OwnerIsCreator, ITypeAndVersion {
+contract RMNProxy is OwnerIsCreator, ITypeAndVersion {
error ZeroAddressNotAllowed();
event ARMSet(address arm);
@@ -45,7 +45,7 @@ contract ARMProxy is OwnerIsCreator, ITypeAndVersion {
// We use a fallback function instead of explicit implementations of the functions
// defined in IRMN.sol to preserve compatibility with future additions to the IRMN
- // interface. Calling IRMN interface methods in ARMProxy should be transparent, i.e.
+ // interface. Calling IRMN interface methods in RMNProxy should be transparent, i.e.
// their input/output behaviour should be identical to calling the proxied s_arm
// contract directly. (If s_arm doesn't point to a contract, we always revert.)
// solhint-disable-next-line payable-fallback, no-complex-fallback
diff --git a/contracts/src/v0.8/ccip/rmn/RMNRemote.sol b/contracts/src/v0.8/ccip/rmn/RMNRemote.sol
index 4e7ce766443..4f96e2bc8f2 100644
--- a/contracts/src/v0.8/ccip/rmn/RMNRemote.sol
+++ b/contracts/src/v0.8/ccip/rmn/RMNRemote.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IRMN} from "../interfaces/IRMN.sol";
@@ -9,11 +9,6 @@ import {Ownable2StepMsgSender} from "../../shared/access/Ownable2StepMsgSender.s
import {EnumerableSet} from "../../shared/enumerable/EnumerableSetWithBytes16.sol";
import {Internal} from "../libraries/Internal.sol";
-/// @dev An active curse on this subject will cause isCursed() to return true. Use this subject if there is an issue
-/// with a remote chain, for which there exists a legacy lane contract deployed on the same chain as this RMN contract
-/// is deployed, relying on isCursed().
-bytes16 constant LEGACY_CURSE_SUBJECT = 0x01000000000000000000000000000000;
-
/// @dev An active curse on this subject will cause isCursed() and isCursed(bytes16) to return true. Use this subject
/// for issues affecting all of CCIP chains, or pertaining to the chain that this contract is deployed on, instead of
/// using the local chain selector as a subject.
@@ -99,7 +94,7 @@ contract RMNRemote is Ownable2StepMsgSender, ITypeAndVersion, IRMNRemote, IRMN {
/// @inheritdoc IRMNRemote
function verify(
- address offrampAddress,
+ address offRampAddress,
Internal.MerkleRoot[] calldata merkleRoots,
Signature[] calldata signatures
) external view {
@@ -115,7 +110,7 @@ contract RMNRemote is Ownable2StepMsgSender, ITypeAndVersion, IRMNRemote, IRMN {
destChainId: block.chainid,
destChainSelector: i_localChainSelector,
rmnRemoteContractAddress: address(this),
- offrampAddress: offrampAddress,
+ offrampAddress: offRampAddress,
rmnHomeContractConfigDigest: s_config.rmnHomeContractConfigDigest,
merkleRoots: merkleRoots
})
@@ -256,11 +251,11 @@ contract RMNRemote is Ownable2StepMsgSender, ITypeAndVersion, IRMNRemote, IRMN {
/// @inheritdoc IRMNRemote
function isCursed() external view override(IRMN, IRMNRemote) returns (bool) {
// There are zero curses under normal circumstances, which means it's cheaper to check for the absence of curses.
- // than to check the subject list twice, as we have to check for both the legacy and global curse subjects.
+ // than to check the subject list for the global curse subject.
if (s_cursedSubjects.length() == 0) {
return false;
}
- return s_cursedSubjects.contains(LEGACY_CURSE_SUBJECT) || s_cursedSubjects.contains(GLOBAL_CURSE_SUBJECT);
+ return s_cursedSubjects.contains(GLOBAL_CURSE_SUBJECT);
}
/// @inheritdoc IRMNRemote
diff --git a/contracts/src/v0.8/ccip/test/BaseTest.t.sol b/contracts/src/v0.8/ccip/test/BaseTest.t.sol
index 1e9fcdd2fa5..1d30a8f589f 100644
--- a/contracts/src/v0.8/ccip/test/BaseTest.t.sol
+++ b/contracts/src/v0.8/ccip/test/BaseTest.t.sol
@@ -1,54 +1,39 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
// Imports to any non-library are not allowed due to the significant cascading
// compile time increase they cause when imported into this base test.
-
import {IRMNRemote} from "../interfaces/IRMNRemote.sol";
+
+import {Router} from "../Router.sol";
import {Internal} from "../libraries/Internal.sol";
import {RateLimiter} from "../libraries/RateLimiter.sol";
-import {MockRMN} from "./mocks/MockRMN.sol";
+import {WETH9} from "./WETH9.sol";
+
import {Test} from "forge-std/Test.sol";
contract BaseTest is Test {
- // Addresses
address internal constant OWNER = 0x00007e64E1fB0C487F25dd6D3601ff6aF8d32e4e;
address internal constant STRANGER = address(999999);
- address internal constant USER_1 = address(1);
+ // Timing
+ uint256 internal constant BLOCK_TIME = 1234567890;
+ uint32 internal constant TWELVE_HOURS = 60 * 60 * 12;
// Message info
uint64 internal constant SOURCE_CHAIN_SELECTOR = 1;
uint64 internal constant DEST_CHAIN_SELECTOR = 2;
uint32 internal constant GAS_LIMIT = 200_000;
- // Timing
- uint256 internal constant BLOCK_TIME = 1234567890;
- uint32 internal constant TWELVE_HOURS = 60 * 60 * 12;
-
- // Onramp
- uint96 internal constant MAX_MSG_FEES_JUELS = 1_000e18;
- uint32 internal constant DEST_GAS_OVERHEAD = 300_000;
- 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 = 90_000;
- uint32 internal constant DEFAULT_TOKEN_BYTES_OVERHEAD = 32;
uint8 internal constant DEFAULT_TOKEN_DECIMALS = 18;
+ uint16 internal constant GAS_FOR_CALL_EXACT_CHECK = 5_000;
bool private s_baseTestInitialized;
- // OffRamp
- uint32 internal constant MAX_DATA_SIZE = 30_000;
- uint16 internal constant MAX_TOKENS_LENGTH = 5;
- uint16 internal constant GAS_FOR_CALL_EXACT_CHECK = 5_000;
- uint32 internal constant MAX_GAS_LIMIT = 4_000_000;
-
- MockRMN internal s_mockRMN;
IRMNRemote internal s_mockRMNRemote;
-
- // nonce for pseudo-random number generation, not to be exposed to test suites
- uint256 private s_randNonce;
+ Router internal s_sourceRouter;
+ Router internal s_destRouter;
function setUp() public virtual {
// BaseTest.setUp is often called multiple times from tests' setUp due to inheritance.
@@ -64,19 +49,18 @@ contract BaseTest is Test {
// Set the block time to a constant known value
vm.warp(BLOCK_TIME);
- // setup mock RMN & RMNRemote
- s_mockRMN = new MockRMN();
+ // setup RMNRemote
s_mockRMNRemote = IRMNRemote(makeAddr("MOCK RMN REMOTE"));
vm.etch(address(s_mockRMNRemote), bytes("fake bytecode"));
vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
- _setMockRMNGlobalCurse(false);
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed()"), abi.encode(false));
vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(false)); // no curses by defaule
- }
- function _setMockRMNGlobalCurse(
- bool isCursed
- ) internal {
- vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed()"), abi.encode(isCursed));
+ s_sourceRouter = new Router(address(new WETH9()), address(s_mockRMNRemote));
+ vm.label(address(s_sourceRouter), "sourceRouter");
+ // Deploy a destination router
+ s_destRouter = new Router(address(new WETH9()), address(s_mockRMNRemote));
+ vm.label(address(s_destRouter), "destRouter");
}
function _setMockRMNChainCurse(uint64 chainSelector, bool isCursed) internal {
@@ -108,18 +92,12 @@ contract BaseTest is Test {
return priceUpdates;
}
- /// @dev returns a pseudo-random bytes32
- function _randomBytes32() internal returns (bytes32) {
- return keccak256(abi.encodePacked(++s_randNonce));
- }
-
- /// @dev returns a pseudo-random number
- function _randomNum() internal returns (uint256) {
- return uint256(_randomBytes32());
- }
-
- /// @dev returns a pseudo-random address
- function _randomAddress() internal returns (address) {
- return address(uint160(_randomNum()));
+ function _generateSourceTokenData() internal pure returns (Internal.SourceTokenData memory) {
+ return Internal.SourceTokenData({
+ sourcePoolAddress: abi.encode(address(12312412312)),
+ destTokenAddress: abi.encode(address(9809808909)),
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
+ });
}
}
diff --git a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.applyPreviousRampsUpdates.t.sol b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.applyPreviousRampsUpdates.t.sol
index fe4316423ec..765ab3ad5b1 100644
--- a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.applyPreviousRampsUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.applyPreviousRampsUpdates.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {NonceManager} from "../../NonceManager.sol";
import {OnRampSetup} from "../onRamp/OnRamp/OnRampSetup.t.sol";
contract NonceManager_applyPreviousRampsUpdates is OnRampSetup {
- function test_SingleRampUpdate_success() public {
+ function test_SingleRampUpdate() public {
address prevOnRamp = makeAddr("prevOnRamp");
address prevOffRamp = makeAddr("prevOffRamp");
NonceManager.PreviousRampsArgs[] memory previousRamps = new NonceManager.PreviousRampsArgs[](1);
@@ -80,7 +80,7 @@ contract NonceManager_applyPreviousRampsUpdates is OnRampSetup {
assertEq(vm.getRecordedLogs().length, 0);
}
- function test_applyPreviousRampsUpdates_RevertWhen_PreviousRampAlreadySetOnRamp() public {
+ function test_RevertWhen_applyPreviousRampsUpdatesWhen_PreviousRampAlreadySetOnRamp() public {
NonceManager.PreviousRampsArgs[] memory previousRamps = new NonceManager.PreviousRampsArgs[](1);
address prevOnRamp = makeAddr("prevOnRamp");
previousRamps[0] = NonceManager.PreviousRampsArgs({
@@ -101,7 +101,7 @@ contract NonceManager_applyPreviousRampsUpdates is OnRampSetup {
s_outboundNonceManager.applyPreviousRampsUpdates(previousRamps);
}
- function test_applyPreviousRampsUpdates_RevertWhen_PreviousRampAlreadySetOffRamp() public {
+ function test_RevertWhen_applyPreviousRampsUpdatesWhen_PreviousRampAlreadySetOffRamp() public {
NonceManager.PreviousRampsArgs[] memory previousRamps = new NonceManager.PreviousRampsArgs[](1);
address prevOffRamp = makeAddr("prevOffRamp");
previousRamps[0] = NonceManager.PreviousRampsArgs({
@@ -122,7 +122,7 @@ contract NonceManager_applyPreviousRampsUpdates is OnRampSetup {
s_outboundNonceManager.applyPreviousRampsUpdates(previousRamps);
}
- function test_applyPreviousRampsUpdates_RevertWhen_PreviousRampAlreadySetOnRampAndOffRamp_Revert() public {
+ function test_RevertWhen_applyPreviousRampsUpdatesWhen_PreviousRampAlreadySetOnRampAndOffRamp_Revert() public {
NonceManager.PreviousRampsArgs[] memory previousRamps = new NonceManager.PreviousRampsArgs[](1);
address prevOnRamp = makeAddr("prevOnRamp");
address prevOffRamp = makeAddr("prevOffRamp");
diff --git a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getInboundNonce.t.sol b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getInboundNonce.t.sol
index 4078c3c0d01..d70382bab5a 100644
--- a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getInboundNonce.t.sol
+++ b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getInboundNonce.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {NonceManager} from "../../NonceManager.sol";
import {Internal} from "../../libraries/Internal.sol";
diff --git a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getIncrementedOutboundNonce.t.sol b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getIncrementedOutboundNonce.t.sol
index 1ac25d6c31f..253a756e444 100644
--- a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getIncrementedOutboundNonce.t.sol
+++ b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getIncrementedOutboundNonce.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {NonceManager} from "../../NonceManager.sol";
import {BaseTest} from "../BaseTest.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getOutboundNonce.t.sol b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getOutboundNonce.t.sol
index 2fe02bfb59d..e1e2fe3d41e 100644
--- a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getOutboundNonce.t.sol
+++ b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getOutboundNonce.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IEVM2AnyOnRamp} from "../../interfaces/IEVM2AnyOnRamp.sol";
diff --git a/contracts/src/v0.8/ccip/test/TokenSetup.t.sol b/contracts/src/v0.8/ccip/test/TokenSetup.t.sol
index db6985c9275..f32b0cea940 100644
--- a/contracts/src/v0.8/ccip/test/TokenSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/TokenSetup.t.sol
@@ -1,17 +1,17 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC20} from "../../shared/token/ERC20/BurnMintERC20.sol";
import {BurnMintTokenPool} from "../pools/BurnMintTokenPool.sol";
import {LockReleaseTokenPool} from "../pools/LockReleaseTokenPool.sol";
import {TokenPool} from "../pools/TokenPool.sol";
import {TokenAdminRegistry} from "../tokenAdminRegistry/TokenAdminRegistry.sol";
+import {BaseTest} from "./BaseTest.t.sol";
import {MaybeRevertingBurnMintTokenPool} from "./helpers/MaybeRevertingBurnMintTokenPool.sol";
-import {RouterSetup} from "./router/Router/RouterSetup.t.sol";
import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
-contract TokenSetup is RouterSetup {
+contract TokenSetup is BaseTest {
address[] internal s_sourceTokens;
address[] internal s_destTokens;
@@ -46,7 +46,7 @@ contract TokenSetup is RouterSetup {
}
LockReleaseTokenPool pool = new LockReleaseTokenPool(
- IERC20(token), DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), true, router
+ IERC20(token), DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), true, router
);
if (isSourcePool) {
@@ -64,7 +64,7 @@ contract TokenSetup is RouterSetup {
}
BurnMintTokenPool pool = new MaybeRevertingBurnMintTokenPool(
- BurnMintERC20(token), DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), router
+ BurnMintERC20(token), DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), router
);
BurnMintERC20(token).grantMintAndBurnRoles(address(pool));
@@ -77,7 +77,7 @@ contract TokenSetup is RouterSetup {
}
function setUp() public virtual override {
- RouterSetup.setUp();
+ super.setUp();
bool isSetup = s_sourceTokens.length != 0;
if (isSetup) {
diff --git a/contracts/src/v0.8/ccip/test/WETH9.sol b/contracts/src/v0.8/ccip/test/WETH9.sol
index bfd2b5f022f..0ac79d413dd 100644
--- a/contracts/src/v0.8/ccip/test/WETH9.sol
+++ b/contracts/src/v0.8/ccip/test/WETH9.sol
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
// solhint-disable
contract WETH9 {
diff --git a/contracts/src/v0.8/ccip/test/applications/DefensiveExample/DefensiveExample.t.sol b/contracts/src/v0.8/ccip/test/applications/DefensiveExample/DefensiveExample.t.sol
index ddaadbac801..1817476c134 100644
--- a/contracts/src/v0.8/ccip/test/applications/DefensiveExample/DefensiveExample.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/DefensiveExample/DefensiveExample.t.sol
@@ -68,7 +68,7 @@ contract DefensiveExampleTest is OnRampSetup {
assertEq(IERC20(token).balanceOf(address(s_receiver)), receiverBalancePre - amount);
}
- function test_HappyPath_Success() public {
+ function test_HappyPath() public {
bytes32 messageId = keccak256("messageId");
address token = address(s_destFeeToken);
uint256 amount = 111333333777;
diff --git a/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver/EtherSenderReceiverTest.ccipSend.t.sol b/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver/EtherSenderReceiverTest.ccipSend.t.sol
index dea42f36098..5f91841ab6e 100644
--- a/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver/EtherSenderReceiverTest.ccipSend.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver/EtherSenderReceiverTest.ccipSend.t.sol
@@ -99,7 +99,7 @@ contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTestSetup {
}
}
- function test_ccipSend_reverts_insufficientFee_weth() public {
+ function test_RevertWhen_ccipSends_insufficientFee_weth() public {
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: address(0), // callers may not specify this.
@@ -127,7 +127,7 @@ contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTestSetup {
s_etherSenderReceiver.ccipSend{value: AMOUNT}(DESTINATION_CHAIN_SELECTOR, message);
}
- function test_ccipSend_reverts_insufficientFee_feeToken() public {
+ function test_RevertWhen_ccipSends_insufficientFee_feeToken() public {
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: address(0), // callers may not specify this.
@@ -155,7 +155,7 @@ contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTestSetup {
s_etherSenderReceiver.ccipSend{value: AMOUNT}(DESTINATION_CHAIN_SELECTOR, message);
}
- function test_ccipSend_reverts_insufficientFee_native() public {
+ function test_RevertWhen_ccipSends_insufficientFee_native() public {
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: address(0), // callers may not specify this.
@@ -181,7 +181,7 @@ contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTestSetup {
s_etherSenderReceiver.ccipSend{value: AMOUNT + FEE_WEI - 1}(DESTINATION_CHAIN_SELECTOR, message);
}
- function test_ccipSend_success_nativeExcess() public {
+ function test_ccipSend_nativeExcess() public {
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: address(0), // callers may not specify this.
@@ -218,7 +218,7 @@ contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTestSetup {
assertEq(actualMsgId, expectedMsgId, "message id must be correct");
}
- function test_ccipSend_success_native() public {
+ function test_ccipSend_native() public {
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: address(0), // callers may not specify this.
@@ -251,7 +251,7 @@ contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTestSetup {
assertEq(actualMsgId, expectedMsgId, "message id must be correct");
}
- function test_ccipSend_success_feeToken() public {
+ function test_ccipSend_feeToken() public {
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: address(0), // callers may not specify this.
@@ -287,7 +287,7 @@ contract EtherSenderReceiverTest_ccipSend is EtherSenderReceiverTestSetup {
assertEq(routerAllowance, FEE_JUELS, "router allowance must be feeJuels");
}
- function test_ccipSend_success_weth() public {
+ function test_ccipSend_weth() public {
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
tokenAmounts[0] = Client.EVMTokenAmount({
token: address(0), // callers may not specify this.
diff --git a/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver/EtherSenderReceiverTest.validateFeeToken.t.sol b/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver/EtherSenderReceiverTest.validateFeeToken.t.sol
index ae24ca3deae..29da1a1e068 100644
--- a/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver/EtherSenderReceiverTest.validateFeeToken.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/EtherSenderReceiver/EtherSenderReceiverTest.validateFeeToken.t.sol
@@ -36,7 +36,7 @@ contract EtherSenderReceiverTest_validateFeeToken is EtherSenderReceiverTestSetu
s_etherSenderReceiver.validateFeeToken{value: AMOUNT}(message);
}
- function test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() public {
+ function test_RevertWhen_validateFeeTokens_feeToken_tokenAmountNotEqualToMsgValue() public {
Client.EVMTokenAmount[] memory tokenAmount = new Client.EVMTokenAmount[](1);
tokenAmount[0] = Client.EVMTokenAmount({token: address(s_weth), amount: AMOUNT});
Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
diff --git a/contracts/src/v0.8/ccip/test/applications/ImmutableExample/ImmutableExample.t.sol b/contracts/src/v0.8/ccip/test/applications/ImmutableExample/ImmutableExample.t.sol
index 2eb9b736ad4..8cb2cdd97d9 100644
--- a/contracts/src/v0.8/ccip/test/applications/ImmutableExample/ImmutableExample.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/ImmutableExample/ImmutableExample.t.sol
@@ -11,7 +11,7 @@ import {ERC165Checker} from
"../../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165Checker.sol";
contract CCIPClientExample_sanity is OnRampSetup {
- function test_ImmutableExamples_Success() public {
+ function test_ImmutableExamples() public {
CCIPClientExample exampleContract = new CCIPClientExample(s_sourceRouter, IERC20(s_sourceFeeToken));
deal(address(exampleContract), 100 ether);
deal(s_sourceFeeToken, address(exampleContract), 100 ether);
diff --git a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.ccipReceive.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.ccipReceive.t.sol
index a7559b6dea2..75d642defac 100644
--- a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.ccipReceive.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.ccipReceive.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {PingPongDemo} from "../../../applications/PingPongDemo.sol";
import {Client} from "../../../libraries/Client.sol";
@@ -7,7 +7,7 @@ import {Client} from "../../../libraries/Client.sol";
import {PingPongDappSetup} from "./PingPongDappSetup.t.sol";
contract PingPong_ccipReceive is PingPongDappSetup {
- function test_CcipReceive_Success() public {
+ function test_CcipReceive() public {
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](0);
uint256 pingPongNumber = 5;
diff --git a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpart.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpart.t.sol
index 8db2e75c5d7..e9c4135dead 100644
--- a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpart.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpart.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {PingPongDappSetup} from "./PingPongDappSetup.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpartAddress.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpartAddress.t.sol
index 0e5587dac5f..43f123bbf6c 100644
--- a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpartAddress.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpartAddress.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {PingPongDappSetup} from "./PingPongDappSetup.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpartChainSelector.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpartChainSelector.t.sol
index a7d148089bc..3702c002e73 100644
--- a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpartChainSelector.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setCounterpartChainSelector.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {PingPongDappSetup} from "./PingPongDappSetup.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setOutOfOrderExecution.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setOutOfOrderExecution.t.sol
index 0e09e67f7cb..2929153db8e 100644
--- a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setOutOfOrderExecution.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setOutOfOrderExecution.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {PingPongDemo} from "../../../applications/PingPongDemo.sol";
import {PingPongDappSetup} from "./PingPongDappSetup.t.sol";
contract PingPong_setOutOfOrderExecution is PingPongDappSetup {
- function test_OutOfOrderExecution_Success() public {
+ function test_OutOfOrderExecution() public {
assertFalse(s_pingPong.getOutOfOrderExecution());
vm.expectEmit();
diff --git a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setPaused.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setPaused.t.sol
index 82cd22199ec..645cbe6b81d 100644
--- a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setPaused.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.setPaused.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {PingPongDappSetup} from "./PingPongDappSetup.t.sol";
contract PingPong_setPaused is PingPongDappSetup {
- function test_Pausing_Success() public {
+ function test_Pausing() public {
assertFalse(s_pingPong.isPaused());
s_pingPong.setPaused(true);
diff --git a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.startPingPong.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.startPingPong.t.sol
index d9dfc980154..6dccdca6b38 100644
--- a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.startPingPong.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPong.startPingPong.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {PingPongDemo} from "../../../applications/PingPongDemo.sol";
import {Internal} from "../../../libraries/Internal.sol";
@@ -10,11 +10,11 @@ import {PingPongDappSetup} from "./PingPongDappSetup.t.sol";
contract PingPong_startPingPong is PingPongDappSetup {
uint256 internal s_pingPongNumber = 1;
- function test_StartPingPong_With_Sequenced_Ordered_Success() public {
+ function test_StartPingPong_With_Sequenced_Ordered() public {
_assertPingPongSuccess();
}
- function test_StartPingPong_With_OOO_Success() public {
+ function test_StartPingPong_With_OOO() public {
s_pingPong.setOutOfOrderExecution(true);
_assertPingPongSuccess();
diff --git a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPongDappSetup.t.sol b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPongDappSetup.t.sol
index 8c009a0660d..64f52f16b1c 100644
--- a/contracts/src/v0.8/ccip/test/applications/PingPong/PingPongDappSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/applications/PingPong/PingPongDappSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {PingPongDemo} from "../../../applications/PingPongDemo.sol";
import {OnRampSetup} from "../../onRamp/OnRamp/OnRampSetup.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/attacks/OnRamp/FacadeClient.sol b/contracts/src/v0.8/ccip/test/attacks/OnRamp/FacadeClient.sol
index 8947a27df1d..e8623c74e8a 100644
--- a/contracts/src/v0.8/ccip/test/attacks/OnRamp/FacadeClient.sol
+++ b/contracts/src/v0.8/ccip/test/attacks/OnRamp/FacadeClient.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRouterClient} from "../../../interfaces/IRouterClient.sol";
diff --git a/contracts/src/v0.8/ccip/test/attacks/OnRamp/OnRampTokenPoolReentrancy.t.sol b/contracts/src/v0.8/ccip/test/attacks/OnRamp/OnRampTokenPoolReentrancy.t.sol
index 54e08a2a5ef..271e10e7561 100644
--- a/contracts/src/v0.8/ccip/test/attacks/OnRamp/OnRampTokenPoolReentrancy.t.sol
+++ b/contracts/src/v0.8/ccip/test/attacks/OnRamp/OnRampTokenPoolReentrancy.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Client} from "../../../libraries/Client.sol";
import {OnRamp} from "../../../onRamp/OnRamp.sol";
@@ -29,7 +29,7 @@ contract OnRampTokenPoolReentrancy is OnRampSetup {
new FacadeClient(address(s_sourceRouter), DEST_CHAIN_SELECTOR, s_sourceToken, s_feeToken, i_receiver);
s_maliciousTokenPool = new ReentrantMaliciousTokenPool(
- address(s_facadeClient), s_sourceToken, address(s_mockRMN), address(s_sourceRouter)
+ address(s_facadeClient), s_sourceToken, address(s_mockRMNRemote), address(s_sourceRouter)
);
bytes[] memory remotePoolAddresses = new bytes[](1);
@@ -59,7 +59,7 @@ contract OnRampTokenPoolReentrancy is OnRampSetup {
/// (reenter)-> Facade -> 2nd call to ccipSend
/// In this case, Facade's second call would produce an EVM2Any msg with a lower sequence number.
/// The issue was fixed by implementing a reentrancy guard in OnRamp.
- function test_OnRampTokenPoolReentrancy_Success() public {
+ function test_OnRampTokenPoolReentrancy() public {
uint256 amount = 1;
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
diff --git a/contracts/src/v0.8/ccip/test/attacks/OnRamp/ReentrantMaliciousTokenPool.sol b/contracts/src/v0.8/ccip/test/attacks/OnRamp/ReentrantMaliciousTokenPool.sol
index 39ab239e22f..3a7af8af506 100644
--- a/contracts/src/v0.8/ccip/test/attacks/OnRamp/ReentrantMaliciousTokenPool.sol
+++ b/contracts/src/v0.8/ccip/test/attacks/OnRamp/ReentrantMaliciousTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../libraries/Pool.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.applyChainConfigUpdates.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.applyChainConfigUpdates.t.sol
index 9bf096b9551..2547ac3010d 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.applyChainConfigUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.applyChainConfigUpdates.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {INodeInfoProvider} from "../../../../keystone/interfaces/INodeInfoProvider.sol";
@@ -13,7 +13,7 @@ contract CCIPHome_applyChainConfigUpdates is CCIPHomeTestSetup {
s_ccipHome = new CCIPHomeHelper(CAPABILITIES_REGISTRY);
}
- function test_applyChainConfigUpdates_addChainConfigs_Success() public {
+ function test_applyChainConfigUpdates_addChainConfigs() public {
bytes32[] memory chainReaders = new bytes32[](1);
chainReaders[0] = keccak256(abi.encode(1));
CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2);
@@ -54,7 +54,7 @@ contract CCIPHome_applyChainConfigUpdates is CCIPHomeTestSetup {
assertEq(s_ccipHome.getNumChainConfigurations(), 2, "total chain configs must be 2");
}
- function test_getPaginatedCCIPHomes_Success() public {
+ function test_getPaginatedCCIPHomes() public {
bytes32[] memory chainReaders = new bytes32[](1);
chainReaders[0] = keccak256(abi.encode(1));
CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2);
@@ -106,7 +106,7 @@ contract CCIPHome_applyChainConfigUpdates is CCIPHomeTestSetup {
assertEq(configs.length, 0, "chain configs length must be 0");
}
- function test_applyChainConfigUpdates_removeChainConfigs_Success() public {
+ function test_applyChainConfigUpdates_removeChainConfigs() public {
bytes32[] memory chainReaders = new bytes32[](1);
chainReaders[0] = keccak256(abi.encode(1));
@@ -162,7 +162,7 @@ contract CCIPHome_applyChainConfigUpdates is CCIPHomeTestSetup {
// Reverts.
- function test_applyChainConfigUpdates_selectorNotFound_Reverts() public {
+ function test_RevertWhen_applyChainConfigUpdates_selectorNotFound() public {
uint64[] memory removes = new uint64[](1);
removes[0] = uint64(1);
@@ -170,7 +170,7 @@ contract CCIPHome_applyChainConfigUpdates is CCIPHomeTestSetup {
s_ccipHome.applyChainConfigUpdates(removes, new CCIPHome.ChainConfigArgs[](0));
}
- function test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() public {
+ function test_RevertWhen_applyChainConfigUpdates_nodeNotInRegistry() public {
bytes32[] memory chainReaders = new bytes32[](1);
chainReaders[0] = keccak256(abi.encode(1));
CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](1);
@@ -189,7 +189,7 @@ contract CCIPHome_applyChainConfigUpdates is CCIPHomeTestSetup {
s_ccipHome.applyChainConfigUpdates(new uint64[](0), adds);
}
- function test__applyChainConfigUpdates_FChainNotPositive_Reverts() public {
+ function test_RevertWhen__applyChainConfigUpdates_FChainNotPositive() public {
bytes32[] memory chainReaders = new bytes32[](1);
chainReaders[0] = keccak256(abi.encode(1));
CCIPHome.ChainConfigArgs[] memory adds = new CCIPHome.ChainConfigArgs[](2);
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.beforeCapabilityConfigSet.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.beforeCapabilityConfigSet.t.sol
index 090c8336c48..540c9d71e04 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.beforeCapabilityConfigSet.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.beforeCapabilityConfigSet.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHome} from "../../../capability/CCIPHome.sol";
import {Internal} from "../../../libraries/Internal.sol";
@@ -13,7 +13,7 @@ contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTestSetup {
vm.startPrank(address(CAPABILITIES_REGISTRY));
}
- function test_beforeCapabilityConfigSet_success() public {
+ function test_beforeCapabilityConfigSet() public {
// first set a config
bytes memory callData = abi.encodeCall(
CCIPHome.setCandidate,
@@ -61,7 +61,7 @@ contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTestSetup {
assertEq(activeDigest, newCandidateDigest);
}
- function test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() public {
+ function test_RevertWhen_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall() public {
bytes memory callData = abi.encodeCall(
CCIPHome.setCandidate,
(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, _getBaseConfig(Internal.OCRPluginType.Commit), ZERO_DIGEST)
@@ -74,14 +74,14 @@ contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTestSetup {
s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
}
- function test_beforeCapabilityConfigSet_InvalidSelector_reverts() public {
+ function test_RevertWhen_beforeCapabilityConfigSet_InvalidSelector() public {
bytes memory callData = abi.encodeCall(CCIPHome.getConfigDigests, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE));
vm.expectRevert(abi.encodeWithSelector(CCIPHome.InvalidSelector.selector, CCIPHome.getConfigDigests.selector));
s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, DEFAULT_DON_ID);
}
- function test_beforeCapabilityConfigSet_DONIdMismatch_reverts() public {
+ function test_RevertWhen_beforeCapabilityConfigSet_DONIdMismatch() public {
uint32 wrongDonId = DEFAULT_DON_ID + 1;
bytes memory callData = abi.encodeCall(
@@ -93,7 +93,7 @@ contract CCIPHome_beforeCapabilityConfigSet is CCIPHomeTestSetup {
s_ccipHome.beforeCapabilityConfigSet(new bytes32[](0), callData, 0, wrongDonId);
}
- function test_beforeCapabilityConfigSet_InnerCallReverts_reverts() public {
+ function test_RevertWhen_beforeCapabilityConfigSet_InnerCallReverts() public {
bytes memory callData = abi.encodeCall(CCIPHome.revokeCandidate, (DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, ZERO_DIGEST));
vm.expectRevert(CCIPHome.RevokingZeroDigestNotAllowed.selector);
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.constructor.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.constructor.t.sol
index f4c1a777f3d..18e8c700992 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.constructor.t.sol
@@ -1,17 +1,17 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHome} from "../../../capability/CCIPHome.sol";
import {CCIPHomeTestSetup} from "./CCIPHomeTestSetup.t.sol";
contract CCIPHome_constructor is CCIPHomeTestSetup {
- function test_constructor_success() public {
+ function test_constructor() public {
CCIPHome ccipHome = new CCIPHome(CAPABILITIES_REGISTRY);
assertEq(address(ccipHome.getCapabilityRegistry()), CAPABILITIES_REGISTRY);
}
- function test_constructor_CapabilitiesRegistryAddressZero_reverts() public {
+ function test_RevertWhen_constructor_CapabilitiesRegistryAddressZero() public {
vm.expectRevert(CCIPHome.ZeroAddressNotAllowed.selector);
new CCIPHome(address(0));
}
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getAllConfigs.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getAllConfigs.t.sol
index 277819e1179..c14b54d294e 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getAllConfigs.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getAllConfigs.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHome} from "../../../capability/CCIPHome.sol";
import {Internal} from "../../../libraries/Internal.sol";
import {CCIPHomeTestSetup} from "./CCIPHomeTestSetup.t.sol";
contract CCIPHome_getAllConfigs is CCIPHomeTestSetup {
- function test_getAllConfigs_success() public {
+ function test_getAllConfigs() public {
CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit);
bytes32 firstDigest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getCapabilityConfiguration.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getCapabilityConfiguration.t.sol
index ea65e111f0d..d4a6e150bae 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getCapabilityConfiguration.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getCapabilityConfiguration.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHomeTestSetup} from "./CCIPHomeTestSetup.t.sol";
contract CCIPHome_getCapabilityConfiguration is CCIPHomeTestSetup {
- function test_getCapabilityConfiguration_success() public view {
+ function test_getCapabilityConfiguration() public view {
bytes memory config = s_ccipHome.getCapabilityConfiguration(DEFAULT_DON_ID);
assertEq(config.length, 0);
}
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getConfigDigests.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getConfigDigests.t.sol
index 8cca6b12589..e239d04d341 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getConfigDigests.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.getConfigDigests.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHome} from "../../../capability/CCIPHome.sol";
import {Internal} from "../../../libraries/Internal.sol";
@@ -7,7 +7,7 @@ import {Internal} from "../../../libraries/Internal.sol";
import {CCIPHomeTestSetup} from "./CCIPHomeTestSetup.t.sol";
contract CCIPHome_getConfigDigests is CCIPHomeTestSetup {
- function test_getConfigDigests_success() public {
+ function test_getConfigDigests() public {
(bytes32 activeDigest, bytes32 candidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
assertEq(activeDigest, ZERO_DIGEST);
assertEq(candidateDigest, ZERO_DIGEST);
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.promoteCandidateAndRevokeActive.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.promoteCandidateAndRevokeActive.t.sol
index 09f25750ac3..cfa653754b0 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.promoteCandidateAndRevokeActive.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.promoteCandidateAndRevokeActive.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHome} from "../../../capability/CCIPHome.sol";
import {Internal} from "../../../libraries/Internal.sol";
@@ -7,7 +7,7 @@ import {Internal} from "../../../libraries/Internal.sol";
import {CCIPHomeTestSetup} from "./CCIPHomeTestSetup.t.sol";
contract CCIPHome_promoteCandidateAndRevokeActive is CCIPHomeTestSetup {
- function test_promoteCandidateAndRevokeActive_multiplePlugins_success() public {
+ function test_promoteCandidateAndRevokeActive_multiplePlugins() public {
promoteCandidateAndRevokeActive(Internal.OCRPluginType.Commit);
promoteCandidateAndRevokeActive(Internal.OCRPluginType.Execution);
@@ -57,12 +57,12 @@ contract CCIPHome_promoteCandidateAndRevokeActive is CCIPHomeTestSetup {
assertEq(keccak256(abi.encode(activeConfig.config)), keccak256(abi.encode(config)));
}
- function test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() public {
+ function test_RevertWhen_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed() public {
vm.expectRevert(CCIPHome.NoOpStateTransitionNotAllowed.selector);
s_ccipHome.promoteCandidateAndRevokeActive(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, ZERO_DIGEST, ZERO_DIGEST);
}
- function test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() public {
+ function test_RevertWhen_promoteCandidateAndRevokeActive_ConfigDigestMismatch() public {
(bytes32 priorActiveDigest, bytes32 priorCandidateDigest) =
s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
bytes32 wrongActiveDigest = keccak256("wrongActiveDigest");
@@ -84,7 +84,7 @@ contract CCIPHome_promoteCandidateAndRevokeActive is CCIPHomeTestSetup {
);
}
- function test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() public {
+ function test_RevertWhen_promoteCandidateAndRevokeActive_CanOnlySelfCall() public {
vm.stopPrank();
vm.expectRevert(CCIPHome.CanOnlySelfCall.selector);
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.revokeCandidate.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.revokeCandidate.t.sol
index b2793727d59..719b8989b1c 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.revokeCandidate.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.revokeCandidate.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHome} from "../../../capability/CCIPHome.sol";
import {Internal} from "../../../libraries/Internal.sol";
@@ -18,7 +18,7 @@ contract CCIPHome_revokeCandidate is CCIPHomeTestSetup {
s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
}
- function test_revokeCandidate_success() public {
+ function test_revokeCandidate() public {
(bytes32 priorActiveDigest, bytes32 priorCandidateDigest) =
s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
@@ -42,7 +42,7 @@ contract CCIPHome_revokeCandidate is CCIPHomeTestSetup {
assertTrue(candidateDigest != priorCandidateDigest);
}
- function test_revokeCandidate_ConfigDigestMismatch_reverts() public {
+ function test_RevertWhen_revokeCandidate_ConfigDigestMismatch() public {
(, bytes32 priorCandidateDigest) = s_ccipHome.getConfigDigests(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE);
bytes32 wrongDigest = keccak256("wrong_digest");
@@ -50,12 +50,12 @@ contract CCIPHome_revokeCandidate is CCIPHomeTestSetup {
s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, wrongDigest);
}
- function test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() public {
+ function test_RevertWhen_revokeCandidate_RevokingZeroDigestNotAllowed() public {
vm.expectRevert(CCIPHome.RevokingZeroDigestNotAllowed.selector);
s_ccipHome.revokeCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, ZERO_DIGEST);
}
- function test_revokeCandidate_CanOnlySelfCall_reverts() public {
+ function test_RevertWhen_revokeCandidate_CanOnlySelfCall() public {
vm.startPrank(address(0));
vm.expectRevert(CCIPHome.CanOnlySelfCall.selector);
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.setCandidate.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.setCandidate.t.sol
index 49f365b22cd..be0ae1df243 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.setCandidate.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.setCandidate.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHome} from "../../../capability/CCIPHome.sol";
import {Internal} from "../../../libraries/Internal.sol";
@@ -7,7 +7,7 @@ import {Internal} from "../../../libraries/Internal.sol";
import {CCIPHomeTestSetup} from "./CCIPHomeTestSetup.t.sol";
contract CCIPHome_setCandidate is CCIPHomeTestSetup {
- function test_setCandidate_success() public {
+ function test_setCandidate() public {
CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit);
CCIPHome.VersionedConfig memory versionedConfig =
CCIPHome.VersionedConfig({version: 1, config: config, configDigest: ZERO_DIGEST});
@@ -28,7 +28,7 @@ contract CCIPHome_setCandidate is CCIPHomeTestSetup {
assertEq(keccak256(abi.encode(storedVersionedConfig.config)), keccak256(abi.encode(versionedConfig.config)));
}
- function test_setCandidate_ConfigDigestMismatch_reverts() public {
+ function test_RevertWhen_setCandidate_ConfigDigestMismatch() public {
CCIPHome.OCR3Config memory config = _getBaseConfig(Internal.OCRPluginType.Commit);
bytes32 digest = s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, ZERO_DIGEST);
@@ -42,7 +42,7 @@ contract CCIPHome_setCandidate is CCIPHomeTestSetup {
s_ccipHome.setCandidate(DEFAULT_DON_ID, DEFAULT_PLUGIN_TYPE, config, digest);
}
- function test_setCandidate_CanOnlySelfCall_reverts() public {
+ function test_RevertWhen_setCandidate_CanOnlySelfCall() public {
vm.stopPrank();
vm.expectRevert(CCIPHome.CanOnlySelfCall.selector);
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.supportsInterface.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.supportsInterface.t.sol
index c67f007f735..88cefdadb66 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.supportsInterface.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.supportsInterface.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ICapabilityConfiguration} from "../../../../keystone/interfaces/ICapabilityConfiguration.sol";
@@ -7,7 +7,7 @@ import {IERC165} from "../../../../vendor/openzeppelin-solidity/v5.0.2/contracts
import {CCIPHomeTestSetup} from "./CCIPHomeTestSetup.t.sol";
contract CCIPHome_supportsInterface is CCIPHomeTestSetup {
- function test_supportsInterface_success() public view {
+ function test_supportsInterface() public view {
assertTrue(s_ccipHome.supportsInterface(type(IERC165).interfaceId));
assertTrue(s_ccipHome.supportsInterface(type(ICapabilityConfiguration).interfaceId));
}
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.validateConfig.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.validateConfig.t.sol
index 13c1a0610d7..4591e9b37bc 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.validateConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHome.validateConfig.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {INodeInfoProvider} from "../../../../keystone/interfaces/INodeInfoProvider.sol";
@@ -96,11 +96,11 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
// Successes.
- function test__validateConfig_Success() public {
+ function test__validateConfig() public {
s_ccipHome.validateConfig(_getCorrectOCR3Config());
}
- function test__validateConfigLessTransmittersThanSigners_Success() public {
+ function test__validateConfigLessTransmittersThanSigners() public {
// fChain is 1, so there should be at least 4 transmitters.
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(5, 1);
config.nodes[1].transmitterKey = bytes("");
@@ -108,7 +108,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfigSmallerFChain_Success() public {
+ function test__validateConfigSmallerFChain() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config(11, 3);
// Set fChain to 2
@@ -119,7 +119,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
// Reverts
- function test__validateConfig_ChainSelectorNotSet_Reverts() public {
+ function test_RevertWhen__validateConfig_ChainSelectorNotSet() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.chainSelector = 0; // invalid
@@ -127,7 +127,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_OfframpAddressCannotBeZero_Reverts() public {
+ function test_RevertWhen__validateConfig_OfframpAddressCannotBeZero() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.offrampAddress = ""; // invalid
@@ -135,7 +135,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() public {
+ function test_RevertWhen__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.offrampAddress = abi.encode(address(0)); // invalid
@@ -143,7 +143,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() public {
+ function test_RevertWhen__validateConfig_RMNHomeAddressCannotBeZero() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.rmnHomeAddress = ""; // invalid
@@ -151,7 +151,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() public {
+ function test_RevertWhen__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.rmnHomeAddress = abi.encode(address(0)); // invalid
@@ -159,7 +159,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_ChainSelectorNotFound_Reverts() public {
+ function test_RevertWhen__validateConfig_ChainSelectorNotFound() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.chainSelector = 2; // not set
@@ -167,7 +167,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_NotEnoughTransmitters_Reverts() public {
+ function test_RevertWhen__validateConfig_NotEnoughTransmitters() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
uint256 numberOfTransmitters = 3;
@@ -185,7 +185,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() public {
+ function test_RevertWhen__validateConfig_NotEnoughTransmittersEmptyAddresses() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.nodes[0].transmitterKey = bytes("");
@@ -201,7 +201,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_TooManySigners_Reverts() public {
+ function test_RevertWhen__validateConfig_TooManySigners() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.nodes = new CCIPHome.OCR3Node[](257);
@@ -209,7 +209,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_FChainTooHigh_Reverts() public {
+ function test_RevertWhen__validateConfig_FChainTooHigh() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.FRoleDON = 2; // too low
@@ -220,7 +220,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_FMustBePositive_Reverts() public {
+ function test_RevertWhen__validateConfig_FMustBePositive() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.FRoleDON = 0; // not positive
@@ -228,7 +228,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_FTooHigh_Reverts() public {
+ function test_RevertWhen__validateConfig_FTooHigh() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.FRoleDON = 2; // too high
@@ -236,7 +236,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_ZeroP2PId_Reverts() public {
+ function test_RevertWhen__validateConfig_ZeroP2PId() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.nodes[1].p2pId = bytes32(0);
@@ -244,7 +244,7 @@ contract CCIPHome__validateConfig is CCIPHomeTestSetup {
s_ccipHome.validateConfig(config);
}
- function test__validateConfig_ZeroSignerKey_Reverts() public {
+ function test_RevertWhen__validateConfig_ZeroSignerKey() public {
CCIPHome.OCR3Config memory config = _getCorrectOCR3Config();
config.nodes[2].signerKey = bytes("");
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHomeTestSetup.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHomeTestSetup.t.sol
index a06f50a01cf..33012aa71eb 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHomeTestSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPHome/CCIPHomeTestSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {INodeInfoProvider} from "../../../../keystone/interfaces/INodeInfoProvider.sol";
diff --git a/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol b/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol
index 282784755dd..9851f09e9a5 100644
--- a/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol
+++ b/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol
@@ -1,7 +1,6 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
-import {IRMN} from "../../interfaces/IRMN.sol";
import {IRMNRemote} from "../../interfaces/IRMNRemote.sol";
import {AuthorizedCallers} from "../../../shared/access/AuthorizedCallers.sol";
@@ -45,7 +44,7 @@ contract E2E is OnRampSetup, OffRampSetup {
OffRampSetup.setUp();
// Deploy new source router for the new source chain
- s_sourceRouter2 = new Router(s_sourceRouter.getWrappedNative(), address(s_mockRMN));
+ s_sourceRouter2 = new Router(s_sourceRouter.getWrappedNative(), address(s_mockRMNRemote));
// Deploy new TokenAdminRegistry for the new source chain
s_tokenAdminRegistry2 = new TokenAdminRegistry();
@@ -55,7 +54,12 @@ contract E2E is OnRampSetup, OffRampSetup {
address token = s_sourceTokens[i];
address pool = address(
new LockReleaseTokenPool(
- IERC20(token), DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), true, address(s_sourceRouter2)
+ IERC20(token),
+ DEFAULT_TOKEN_DECIMALS,
+ new address[](0),
+ address(s_mockRMNRemote),
+ true,
+ address(s_sourceRouter2)
)
);
@@ -78,7 +82,7 @@ contract E2E is OnRampSetup, OffRampSetup {
s_nonceManager2 = new NonceManager(new address[](0));
(
- // Deploy the new source chain onramp
+ // Deploy the new source chain onRamp
// Outsource to shared helper function with OnRampSetup
s_onRamp2,
s_metadataHash2
@@ -97,10 +101,10 @@ contract E2E is OnRampSetup, OffRampSetup {
onRampUpdates[0] = Router.OnRamp({destChainSelector: DEST_CHAIN_SELECTOR, onRamp: address(s_onRamp2)});
s_sourceRouter2.applyRampUpdates(onRampUpdates, new Router.OffRamp[](0), new Router.OffRamp[](0));
- // Deploy offramp
+ // Deploy offRamp
_deployOffRamp(s_mockRMNRemote, s_inboundNonceManager);
- // Enable source chains on offramp
+ // Enable source chains on offRamp
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](2);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
@@ -162,7 +166,7 @@ contract E2E is OnRampSetup, OffRampSetup {
merkleRoots[0] = MerkleHelper.getMerkleRoot(hashedMessages1);
merkleRoots[1] = MerkleHelper.getMerkleRoot(hashedMessages2);
- // TODO make these real sigs :)
+ // TODO make these real sigs
IRMNRemote.Signature[] memory rmnSignatures = new IRMNRemote.Signature[](0);
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](2);
@@ -191,9 +195,6 @@ contract E2E is OnRampSetup, OffRampSetup {
// Scoped to RMN and verify to reduce stack pressure
{
- s_mockRMN.setTaggedRootBlessed(IRMN.TaggedRoot({commitStore: address(s_offRamp), root: merkleRoots[0]}), true);
- s_mockRMN.setTaggedRootBlessed(IRMN.TaggedRoot({commitStore: address(s_offRamp), root: merkleRoots[1]}), true);
-
bytes32[] memory proofs = new bytes32[](0);
bytes32[] memory hashedLeaves = new bytes32[](1);
hashedLeaves[0] = merkleRoots[0];
@@ -264,16 +265,7 @@ contract E2E is OnRampSetup, OffRampSetup {
message.receiver = abi.encode(address(s_receiver));
Internal.EVM2AnyRampMessage memory msgEvent = _messageToEvent(
- message,
- sourceChainSelector,
- DEST_CHAIN_SELECTOR,
- expectedSeqNum,
- nonce,
- feeAmount,
- feeAmount,
- OWNER,
- metadataHash,
- tokenAdminRegistry
+ message, sourceChainSelector, expectedSeqNum, nonce, feeAmount, feeAmount, OWNER, metadataHash, tokenAdminRegistry
);
vm.expectEmit();
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyDestChainConfigUpdates.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyDestChainConfigUpdates.t.sol
index b663151a96c..c598eedc0d1 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyDestChainConfigUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyDestChainConfigUpdates.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Internal} from "../../libraries/Internal.sol";
@@ -38,7 +38,7 @@ contract FeeQuoter_applyDestChainConfigUpdates is FeeQuoterSetup {
);
}
- function test_applyDestChainConfigUpdates_Success() public {
+ function test_applyDestChainConfigUpdates() public {
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = new FeeQuoter.DestChainConfigArgs[](2);
destChainConfigArgs[0] = _generateFeeQuoterDestChainConfigArgs()[0];
destChainConfigArgs[0].destChainConfig.isEnabled = false;
@@ -61,7 +61,7 @@ contract FeeQuoter_applyDestChainConfigUpdates is FeeQuoterSetup {
_assertFeeQuoterDestChainConfigsEqual(destChainConfigArgs[1].destChainConfig, gotDestChainConfig1);
}
- function test_applyDestChainConfigUpdatesZeroInput_Success() public {
+ function test_applyDestChainConfigUpdatesZeroInput() public {
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = new FeeQuoter.DestChainConfigArgs[](0);
vm.recordLogs();
@@ -72,7 +72,7 @@ contract FeeQuoter_applyDestChainConfigUpdates is FeeQuoterSetup {
// Reverts
- function test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() public {
+ function test_RevertWhen_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero() public {
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs();
FeeQuoter.DestChainConfigArgs memory destChainConfigArg = destChainConfigArgs[0];
@@ -83,7 +83,7 @@ contract FeeQuoter_applyDestChainConfigUpdates is FeeQuoterSetup {
s_feeQuoter.applyDestChainConfigUpdates(destChainConfigArgs);
}
- function test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() public {
+ function test_RevertWhen_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit() public {
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs();
FeeQuoter.DestChainConfigArgs memory destChainConfigArg = destChainConfigArgs[0];
@@ -99,7 +99,7 @@ contract FeeQuoter_applyDestChainConfigUpdates is FeeQuoterSetup {
s_feeQuoter.applyDestChainConfigUpdates(destChainConfigArgs);
}
- function test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() public {
+ function test_RevertWhen_InvalidDestChainConfigDestChainSelectorEqZero() public {
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs();
FeeQuoter.DestChainConfigArgs memory destChainConfigArg = destChainConfigArgs[0];
@@ -110,7 +110,7 @@ contract FeeQuoter_applyDestChainConfigUpdates is FeeQuoterSetup {
s_feeQuoter.applyDestChainConfigUpdates(destChainConfigArgs);
}
- function test_InvalidChainFamilySelector_Revert() public {
+ function test_RevertWhen_InvalidChainFamilySelector() public {
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs();
FeeQuoter.DestChainConfigArgs memory destChainConfigArg = destChainConfigArgs[0];
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyFeeTokensUpdates.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyFeeTokensUpdates.t.sol
index a32e50bb3e4..b2412df3d6b 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyFeeTokensUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyFeeTokensUpdates.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../shared/access/Ownable2Step.sol";
import {FeeQuoter} from "../../FeeQuoter.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_applyFeeTokensUpdates is FeeQuoterSetup {
- function test_ApplyFeeTokensUpdates_Success() public {
+ function test_ApplyFeeTokensUpdates() public {
address[] memory feeTokens = new address[](1);
feeTokens[0] = s_sourceTokens[1];
@@ -48,7 +48,7 @@ contract FeeQuoter_applyFeeTokensUpdates is FeeQuoterSetup {
s_feeQuoter.applyFeeTokensUpdates(feeTokens, feeTokens);
}
- function test_OnlyCallableByOwner_Revert() public {
+ function test_RevertWhen_OnlyCallableByOwner() public {
vm.startPrank(STRANGER);
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyPremiumMultiplierWeiPerEthUpdates.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyPremiumMultiplierWeiPerEthUpdates.t.sol
index 67b1ed9ae92..3eaa8436932 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyPremiumMultiplierWeiPerEthUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyPremiumMultiplierWeiPerEthUpdates.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../shared/access/Ownable2Step.sol";
import {FeeQuoter} from "../../FeeQuoter.sol";
@@ -26,7 +26,7 @@ contract FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates is FeeQuoterSetup {
);
}
- function test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() public {
+ function test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken() public {
FeeQuoter.PremiumMultiplierWeiPerEthArgs[] memory premiumMultiplierWeiPerEthArgs =
new FeeQuoter.PremiumMultiplierWeiPerEthArgs[](1);
premiumMultiplierWeiPerEthArgs[0] = s_feeQuoterPremiumMultiplierWeiPerEthArgs[0];
@@ -45,7 +45,7 @@ contract FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates is FeeQuoterSetup {
);
}
- function test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() public {
+ function test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens() public {
FeeQuoter.PremiumMultiplierWeiPerEthArgs[] memory premiumMultiplierWeiPerEthArgs =
new FeeQuoter.PremiumMultiplierWeiPerEthArgs[](2);
premiumMultiplierWeiPerEthArgs[0] = s_feeQuoterPremiumMultiplierWeiPerEthArgs[0];
@@ -82,7 +82,7 @@ contract FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates is FeeQuoterSetup {
// Reverts
- function test_OnlyCallableByOwnerOrAdmin_Revert() public {
+ function test_RevertWhen_OnlyCallableByOwnerOrAdmin() public {
FeeQuoter.PremiumMultiplierWeiPerEthArgs[] memory premiumMultiplierWeiPerEthArgs;
vm.startPrank(STRANGER);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyTokenTransferFeeConfigUpdates.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyTokenTransferFeeConfigUpdates.t.sol
index 711374a2441..2acdd1ed0d0 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyTokenTransferFeeConfigUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.applyTokenTransferFeeConfigUpdates.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../shared/access/Ownable2Step.sol";
import {FeeQuoter} from "../../FeeQuoter.sol";
@@ -59,7 +59,7 @@ contract FeeQuoter_applyTokenTransferFeeConfigUpdates is FeeQuoterSetup {
}
}
- function test_ApplyTokenTransferFeeConfig_Success() public {
+ function test_ApplyTokenTransferFeeConfig() public {
FeeQuoter.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs = _generateTokenTransferFeeConfigArgs(1, 2);
tokenTransferFeeConfigArgs[0].destChainSelector = DEST_CHAIN_SELECTOR;
tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].token = address(5);
@@ -152,7 +152,7 @@ contract FeeQuoter_applyTokenTransferFeeConfigUpdates is FeeQuoterSetup {
// Reverts
- function test_OnlyCallableByOwnerOrAdmin_Revert() public {
+ function test_RevertWhen_OnlyCallableByOwnerOrAdmin() public {
vm.startPrank(STRANGER);
FeeQuoter.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs;
@@ -163,7 +163,7 @@ contract FeeQuoter_applyTokenTransferFeeConfigUpdates is FeeQuoterSetup {
);
}
- function test_InvalidDestBytesOverhead_Revert() public {
+ function test_RevertWhen_InvalidDestBytesOverhead() public {
FeeQuoter.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs = _generateTokenTransferFeeConfigArgs(1, 1);
tokenTransferFeeConfigArgs[0].destChainSelector = DEST_CHAIN_SELECTOR;
tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].token = address(5);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.constructor.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.constructor.t.sol
index c2d36bee96d..e77e52dd25e 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.constructor.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {FeeQuoterHelper} from "../helpers/FeeQuoterHelper.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_constructor is FeeQuoterSetup {
- function test_Setup_Success() public virtual {
+ function test_Setup() public virtual {
address[] memory priceUpdaters = new address[](2);
priceUpdaters[0] = STRANGER;
priceUpdaters[1] = OWNER;
@@ -78,7 +78,7 @@ contract FeeQuoter_constructor is FeeQuoterSetup {
}
}
- function test_InvalidStalenessThreshold_Revert() public {
+ function test_RevertWhen_InvalidStalenessThreshold() public {
FeeQuoter.StaticConfig memory staticConfig = FeeQuoter.StaticConfig({
linkToken: s_sourceTokens[0],
maxFeeJuelsPerMsg: MAX_MSG_FEES_JUELS,
@@ -98,7 +98,7 @@ contract FeeQuoter_constructor is FeeQuoterSetup {
);
}
- function test_InvalidLinkTokenEqZeroAddress_Revert() public {
+ function test_RevertWhen_InvalidLinkTokenEqZeroAddress() public {
FeeQuoter.StaticConfig memory staticConfig = FeeQuoter.StaticConfig({
linkToken: address(0),
maxFeeJuelsPerMsg: MAX_MSG_FEES_JUELS,
@@ -118,7 +118,7 @@ contract FeeQuoter_constructor is FeeQuoterSetup {
);
}
- function test_InvalidMaxFeeJuelsPerMsg_Revert() public {
+ function test_RevertWhen_InvalidMaxFeeJuelsPerMsg() public {
FeeQuoter.StaticConfig memory staticConfig = FeeQuoter.StaticConfig({
linkToken: s_sourceTokens[0],
maxFeeJuelsPerMsg: 0,
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.convertTokenAmount.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.convertTokenAmount.t.sol
index 33e941cfbe3..2d6864b4957 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.convertTokenAmount.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.convertTokenAmount.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Internal} from "../../libraries/Internal.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_convertTokenAmount is FeeQuoterSetup {
- function test_ConvertTokenAmount_Success() public view {
+ function test_ConvertTokenAmount() public view {
Internal.PriceUpdates memory initialPriceUpdates = abi.decode(s_encodedInitialPriceUpdates, (Internal.PriceUpdates));
uint256 amount = 3e16;
uint256 conversionRate = (uint256(initialPriceUpdates.tokenPriceUpdates[2].usdPerToken) * 1e18)
@@ -50,7 +50,7 @@ contract FeeQuoter_convertTokenAmount is FeeQuoterSetup {
// Reverts
- function test_LinkTokenNotSupported_Revert() public {
+ function test_RevertWhen_LinkTokenNotSupported() public {
vm.expectRevert(abi.encodeWithSelector(FeeQuoter.TokenNotSupported.selector, DUMMY_CONTRACT_ADDRESS));
s_feeQuoter.convertTokenAmount(DUMMY_CONTRACT_ADDRESS, 3e16, s_sourceTokens[0]);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getDataAvailabilityCost.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getDataAvailabilityCost.t.sol
index 6f2566ac754..1d28e8ed756 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getDataAvailabilityCost.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getDataAvailabilityCost.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Internal} from "../../libraries/Internal.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_getDataAvailabilityCost is FeeQuoterSetup {
- function test_EmptyMessageCalculatesDataAvailabilityCost_Success() public {
+ function test_EmptyMessageCalculatesDataAvailabilityCost() public {
uint256 dataAvailabilityCostUSD =
s_feeQuoter.getDataAvailabilityCost(DEST_CHAIN_SELECTOR, USD_PER_DATA_AVAILABILITY_GAS, 0, 0, 0);
@@ -42,7 +42,7 @@ contract FeeQuoter_getDataAvailabilityCost is FeeQuoterSetup {
assertFalse(dataAvailabilityCostUSD == dataAvailabilityCostUSD2);
}
- function test_SimpleMessageCalculatesDataAvailabilityCost_Success() public view {
+ function test_SimpleMessageCalculatesDataAvailabilityCost() public view {
uint256 dataAvailabilityCostUSD =
s_feeQuoter.getDataAvailabilityCost(DEST_CHAIN_SELECTOR, USD_PER_DATA_AVAILABILITY_GAS, 100, 5, 50);
@@ -58,7 +58,7 @@ contract FeeQuoter_getDataAvailabilityCost is FeeQuoterSetup {
assertEq(expectedDataAvailabilityCostUSD, dataAvailabilityCostUSD);
}
- function test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() public view {
+ function test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector() public view {
uint256 dataAvailabilityCostUSD = s_feeQuoter.getDataAvailabilityCost(0, USD_PER_DATA_AVAILABILITY_GAS, 100, 5, 50);
assertEq(dataAvailabilityCostUSD, 0);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenAndGasPrices.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenAndGasPrices.t.sol
index 18ccf5efa79..d7919293759 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenAndGasPrices.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenAndGasPrices.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Internal} from "../../libraries/Internal.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_getTokenAndGasPrices is FeeQuoterSetup {
- function test_GetFeeTokenAndGasPrices_Success() public view {
+ function test_GetFeeTokenAndGasPrices() public view {
(uint224 feeTokenPrice, uint224 gasPrice) = s_feeQuoter.getTokenAndGasPrices(s_sourceFeeToken, DEST_CHAIN_SELECTOR);
Internal.PriceUpdates memory priceUpdates = abi.decode(s_encodedInitialPriceUpdates, (Internal.PriceUpdates));
@@ -15,7 +15,7 @@ contract FeeQuoter_getTokenAndGasPrices is FeeQuoterSetup {
assertEq(gasPrice, priceUpdates.gasPriceUpdates[0].usdPerUnitGas);
}
- function test_StalenessCheckDisabled_Success() public {
+ function test_StalenessCheckDisabled() public {
uint64 neverStaleChainSelector = 345678;
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs();
destChainConfigArgs[0].destChainSelector = neverStaleChainSelector;
@@ -38,7 +38,7 @@ contract FeeQuoter_getTokenAndGasPrices is FeeQuoterSetup {
assertEq(gasPrice, 999);
}
- function test_ZeroGasPrice_Success() public {
+ function test_ZeroGasPrice() public {
uint64 zeroGasDestChainSelector = 345678;
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs();
destChainConfigArgs[0].destChainSelector = zeroGasDestChainSelector;
@@ -56,12 +56,12 @@ contract FeeQuoter_getTokenAndGasPrices is FeeQuoterSetup {
assertEq(gasPrice, 0);
}
- function test_UnsupportedChain_Revert() public {
+ function test_RevertWhen_UnsupportedChain() public {
vm.expectRevert(abi.encodeWithSelector(FeeQuoter.DestinationChainNotEnabled.selector, DEST_CHAIN_SELECTOR + 1));
s_feeQuoter.getTokenAndGasPrices(s_sourceTokens[0], DEST_CHAIN_SELECTOR + 1);
}
- function test_StaleGasPrice_Revert() public {
+ function test_RevertWhen_StaleGasPrice() public {
uint256 diff = TWELVE_HOURS + 1;
vm.warp(block.timestamp + diff);
vm.expectRevert(abi.encodeWithSelector(FeeQuoter.StaleGasPrice.selector, DEST_CHAIN_SELECTOR, TWELVE_HOURS, diff));
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenPrice.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenPrice.t.sol
index c00e750d27f..a06e4cbebf8 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenPrice.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenPrice.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MockV3Aggregator} from "../../../tests/MockV3Aggregator.sol";
import {FeeQuoter} from "../../FeeQuoter.sol";
@@ -7,8 +7,8 @@ import {Internal} from "../../libraries/Internal.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_getTokenPrice is FeeQuoterSetup {
- function test_GetTokenPriceFromFeed_Success() public {
- uint256 originalTimestampValue = block.timestamp;
+ function test_GetTokenPriceFromFeed() public {
+ uint32 originalTimestampValue = uint32(block.timestamp);
// Above staleness threshold
vm.warp(originalTimestampValue + s_feeQuoter.getStaticConfig().tokenPriceStalenessThreshold + 1);
@@ -24,16 +24,16 @@ contract FeeQuoter_getTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer.timestamp, uint32(originalTimestampValue));
}
- function test_GetTokenPrice_LocalMoreRecent_Success() public {
- uint256 originalTimestampValue = block.timestamp;
+ function test_GetTokenPrice_LocalMoreRecent() public {
+ uint32 originalTimestampValue = uint32(block.timestamp);
+ uint224 usdPerToken = 1e18;
Internal.PriceUpdates memory update = Internal.PriceUpdates({
tokenPriceUpdates: new Internal.TokenPriceUpdate[](1),
gasPriceUpdates: new Internal.GasPriceUpdate[](0)
});
- update.tokenPriceUpdates[0] =
- Internal.TokenPriceUpdate({sourceToken: s_sourceTokens[0], usdPerToken: uint32(originalTimestampValue + 5)});
+ update.tokenPriceUpdates[0] = Internal.TokenPriceUpdate({sourceToken: s_sourceTokens[0], usdPerToken: usdPerToken});
vm.expectEmit();
emit FeeQuoter.UsdPerTokenUpdated(
@@ -48,6 +48,6 @@ contract FeeQuoter_getTokenPrice is FeeQuoterSetup {
//Assert that the returned price is the local price, not the oracle price
assertEq(tokenPriceAnswer.value, update.tokenPriceUpdates[0].usdPerToken);
- assertEq(tokenPriceAnswer.timestamp, uint32(originalTimestampValue));
+ assertEq(tokenPriceAnswer.timestamp, originalTimestampValue);
}
}
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenPrices.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenPrices.t.sol
index 63f936332fd..89edbddee38 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenPrices.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenPrices.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../libraries/Internal.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_getTokenPrices is FeeQuoterSetup {
- function test_GetTokenPrices_Success() public view {
+ function test_GetTokenPrices() public view {
Internal.PriceUpdates memory priceUpdates = abi.decode(s_encodedInitialPriceUpdates, (Internal.PriceUpdates));
address[] memory tokens = new address[](3);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenTransferCost.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenTransferCost.t.sol
index 9f0aa9440b8..76298b7c838 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenTransferCost.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getTokenTransferCost.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Client} from "../../libraries/Client.sol";
@@ -12,7 +12,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
address internal s_selfServeTokenDefaultPricing = makeAddr("self-serve-token-default-pricing");
- function test_NoTokenTransferChargesZeroFee_Success() public view {
+ function test_NoTokenTransferChargesZeroFee() public view {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
(uint256 feeUSDWei, uint32 destGasOverhead, uint32 destBytesOverhead) =
s_feeQuoter.getTokenTransferCost(DEST_CHAIN_SELECTOR, message.feeToken, s_feeTokenPrice, message.tokenAmounts);
@@ -22,7 +22,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
assertEq(0, destBytesOverhead);
}
- function test_getTokenTransferCost_selfServeUsesDefaults_Success() public view {
+ function test_getTokenTransferCost_selfServeUsesDefaults() public view {
Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_selfServeTokenDefaultPricing, 1000);
// Get config to assert it isn't set
@@ -40,7 +40,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
assertEq(DEFAULT_TOKEN_BYTES_OVERHEAD, destBytesOverhead);
}
- function test_SmallTokenTransferChargesMinFeeAndGas_Success() public view {
+ function test_SmallTokenTransferChargesMinFeeAndGas() public view {
Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1000);
FeeQuoter.TokenTransferFeeConfig memory transferFeeConfig =
s_feeQuoter.getTokenTransferFeeConfig(DEST_CHAIN_SELECTOR, message.tokenAmounts[0].token);
@@ -53,7 +53,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead);
}
- function test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() public view {
+ function test_ZeroAmountTokenTransferChargesMinFeeAndGas() public view {
Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 0);
FeeQuoter.TokenTransferFeeConfig memory transferFeeConfig =
s_feeQuoter.getTokenTransferFeeConfig(DEST_CHAIN_SELECTOR, message.tokenAmounts[0].token);
@@ -66,7 +66,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead);
}
- function test_LargeTokenTransferChargesMaxFeeAndGas_Success() public view {
+ function test_LargeTokenTransferChargesMaxFeeAndGas() public view {
Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1e36);
FeeQuoter.TokenTransferFeeConfig memory transferFeeConfig =
s_feeQuoter.getTokenTransferFeeConfig(DEST_CHAIN_SELECTOR, message.tokenAmounts[0].token);
@@ -79,7 +79,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead);
}
- function test_FeeTokenBpsFee_Success() public view {
+ function test_FeeTokenBpsFee() public view {
uint256 tokenAmount = 10000e18;
Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, tokenAmount);
@@ -99,7 +99,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead);
}
- function test_CustomTokenBpsFee_Success() public view {
+ function test_CustomTokenBpsFee() public view {
uint256 tokenAmount = 200000e18;
Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
@@ -127,7 +127,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead);
}
- function test_ZeroFeeConfigChargesMinFee_Success() public {
+ function test_ZeroFeeConfigChargesMinFee() public {
FeeQuoter.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs = _generateTokenTransferFeeConfigArgs(1, 1);
tokenTransferFeeConfigArgs[0].destChainSelector = DEST_CHAIN_SELECTOR;
tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].token = s_sourceFeeToken;
@@ -185,7 +185,7 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup {
assertEq(bytesOverheadMultiple, bytesOverheadSingle * transfers);
}
- function test_MixedTokenTransferFee_Success() public view {
+ function test_MixedTokenTransferFee() public view {
address[3] memory testTokens = [s_sourceFeeToken, s_sourceRouter.getWrappedNative(), CUSTOM_TOKEN];
uint224[3] memory tokenPrices = [s_feeTokenPrice, s_wrappedTokenPrice, CUSTOM_TOKEN_PRICE];
FeeQuoter.TokenTransferFeeConfig[3] memory tokenTransferFeeConfigs = [
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedFee.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedFee.t.sol
index 1f76f3120ae..54832a30783 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedFee.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedFee.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Client} from "../../libraries/Client.sol";
@@ -11,7 +11,7 @@ import {FeeQuoterFeeSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
using USDPriceWith18Decimals for uint224;
- function test_EmptyMessage_Success() public view {
+ function test_EmptyMessage() public view {
address[2] memory testTokens = [s_sourceFeeToken, s_sourceRouter.getWrappedNative()];
uint224[2] memory feeTokenPrices = [s_feeTokenPrice, s_wrappedTokenPrice];
@@ -35,7 +35,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
}
}
- function test_ZeroDataAvailabilityMultiplier_Success() public {
+ function test_ZeroDataAvailabilityMultiplier() public {
FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = new FeeQuoter.DestChainConfigArgs[](1);
FeeQuoter.DestChainConfig memory destChainConfig = s_feeQuoter.getDestChainConfig(DEST_CHAIN_SELECTOR);
destChainConfigArgs[0] =
@@ -56,7 +56,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
assertEq(totalPriceInFeeToken, feeAmount);
}
- function test_HighGasMessage_Success() public view {
+ function test_HighGasMessage() public view {
address[2] memory testTokens = [s_sourceFeeToken, s_sourceRouter.getWrappedNative()];
uint224[2] memory feeTokenPrices = [s_feeTokenPrice, s_wrappedTokenPrice];
@@ -87,7 +87,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
}
}
- function test_SingleTokenMessage_Success() public view {
+ function test_SingleTokenMessage() public view {
address[2] memory testTokens = [s_sourceFeeToken, s_sourceRouter.getWrappedNative()];
uint224[2] memory feeTokenPrices = [s_feeTokenPrice, s_wrappedTokenPrice];
@@ -103,7 +103,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
uint256 feeAmount = s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message);
- uint256 gasUsed = GAS_LIMIT + DEST_GAS_OVERHEAD
+ uint256 gasUsed = GAS_LIMIT + DEST_GAS_OVERHEAD + tokenBytesOverhead * DEST_GAS_PER_PAYLOAD_BYTE
+ s_feeQuoter.getTokenTransferFeeConfig(DEST_CHAIN_SELECTOR, message.tokenAmounts[0].token).destGasOverhead;
uint256 gasFeeUSD = (gasUsed * destChainConfig.gasMultiplierWeiPerEth * USD_PER_GAS);
(uint256 transferFeeUSD,,) =
@@ -122,7 +122,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
}
}
- function test_MessageWithDataAndTokenTransfer_Success() public view {
+ function test_MessageWithDataAndTokenTransfer() public view {
address[2] memory testTokens = [s_sourceFeeToken, s_sourceRouter.getWrappedNative()];
uint224[2] memory feeTokenPrices = [s_feeTokenPrice, s_wrappedTokenPrice];
@@ -152,12 +152,20 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
tokenBytesOverhead += destBytesOverhead == 0 ? uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) : destBytesOverhead;
}
- uint256 gasUsed =
- customGasLimit + DEST_GAS_OVERHEAD + message.data.length * DEST_GAS_PER_PAYLOAD_BYTE + tokenGasOverhead;
- uint256 gasFeeUSD = (gasUsed * destChainConfig.gasMultiplierWeiPerEth * USD_PER_GAS);
- (uint256 transferFeeUSD,,) =
+ (uint256 transferFeeUSD,, uint256 tokenTransferBytesOverhead) =
s_feeQuoter.getTokenTransferCost(DEST_CHAIN_SELECTOR, message.feeToken, feeTokenPrices[i], message.tokenAmounts);
+
+ uint256 gasFeeUSD;
+
+ {
+ uint256 gasUsed = customGasLimit + DEST_GAS_OVERHEAD
+ + (message.data.length + tokenTransferBytesOverhead) * DEST_GAS_PER_PAYLOAD_BYTE + tokenGasOverhead;
+
+ gasFeeUSD = (gasUsed * destChainConfig.gasMultiplierWeiPerEth * USD_PER_GAS);
+ }
+
uint256 messageFeeUSD = (transferFeeUSD * premiumMultiplierWeiPerEth);
+
uint256 dataAvailabilityFeeUSD = s_feeQuoter.getDataAvailabilityCost(
DEST_CHAIN_SELECTOR,
USD_PER_DATA_AVAILABILITY_GAS,
@@ -195,12 +203,12 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
// Reverts
- function test_DestinationChainNotEnabled_Revert() public {
+ function test_RevertWhen_DestinationChainNotEnabled() public {
vm.expectRevert(abi.encodeWithSelector(FeeQuoter.DestinationChainNotEnabled.selector, DEST_CHAIN_SELECTOR + 1));
s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR + 1, _generateEmptyMessage());
}
- function test_EnforceOutOfOrder_Revert() public {
+ function test_RevertWhen_EnforceOutOfOrder() public {
// Update config to enforce allowOutOfOrderExecution = true.
vm.stopPrank();
vm.startPrank(OWNER);
@@ -218,7 +226,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message);
}
- function test_MessageTooLarge_Revert() public {
+ function test_RevertWhen_MessageTooLarge() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.data = new bytes(MAX_DATA_SIZE + 1);
vm.expectRevert(abi.encodeWithSelector(FeeQuoter.MessageTooLarge.selector, MAX_DATA_SIZE, message.data.length));
@@ -226,7 +234,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message);
}
- function test_TooManyTokens_Revert() public {
+ function test_RevertWhen_TooManyTokens() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
uint256 tooMany = MAX_TOKENS_LENGTH + 1;
message.tokenAmounts = new Client.EVMTokenAmount[](tooMany);
@@ -235,14 +243,14 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
}
// Asserts gasLimit must be <=maxGasLimit
- function test_MessageGasLimitTooHigh_Revert() public {
+ function test_RevertWhen_MessageGasLimitTooHigh() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.extraArgs = Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: MAX_GAS_LIMIT + 1}));
vm.expectRevert(abi.encodeWithSelector(FeeQuoter.MessageGasLimitTooHigh.selector));
s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message);
}
- function test_NotAFeeToken_Revert() public {
+ function test_RevertWhen_NotAFeeToken() public {
address notAFeeToken = address(0x111111);
Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(notAFeeToken, 1);
message.feeToken = notAFeeToken;
@@ -252,7 +260,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup {
s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message);
}
- function test_InvalidEVMAddress_Revert() public {
+ function test_RevertWhen_InvalidEVMAddress() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.receiver = abi.encode(type(uint208).max);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedTokenPrice.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedTokenPrice.t.sol
index 6d508bc9116..d43cc5a6799 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedTokenPrice.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedTokenPrice.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MockV3Aggregator} from "../../../tests/MockV3Aggregator.sol";
import {FeeQuoter} from "../../FeeQuoter.sol";
@@ -7,7 +7,7 @@ import {Internal} from "../../libraries/Internal.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
- function test_GetValidatedTokenPrice_Success() public view {
+ function test_GetValidatedTokenPrice() public view {
Internal.PriceUpdates memory priceUpdates = abi.decode(s_encodedInitialPriceUpdates, (Internal.PriceUpdates));
address token = priceUpdates.tokenPriceUpdates[0].sourceToken;
@@ -16,7 +16,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(priceUpdates.tokenPriceUpdates[0].usdPerToken, tokenPrice);
}
- function test_GetValidatedTokenPriceFromFeed_Success() public {
+ function test_GetValidatedTokenPriceFromFeed() public {
uint256 originalTimestampValue = block.timestamp;
// Right below staleness threshold
@@ -29,7 +29,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer, uint224(1e18));
}
- function test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() public {
+ function test_GetValidatedTokenPriceFromFeedOverStalenessPeriod() public {
uint256 originalTimestampValue = block.timestamp;
// Right above staleness threshold
@@ -42,7 +42,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer, uint224(1e18));
}
- function test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() public {
+ function test_GetValidatedTokenPriceFromFeedMaxInt224Value() public {
address tokenAddress = _deploySourceToken("testToken", 0, 18);
address feedAddress = _deployTokenPriceDataFeed(tokenAddress, 18, int256(uint256(type(uint224).max)));
@@ -56,7 +56,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer, uint224(type(uint224).max));
}
- function test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() public {
+ function test_GetValidatedTokenPriceFromFeedErc20Below18Decimals() public {
address tokenAddress = _deploySourceToken("testToken", 0, 6);
address feedAddress = _deployTokenPriceDataFeed(tokenAddress, 8, 1e8);
@@ -70,7 +70,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer, uint224(1e30));
}
- function test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() public {
+ function test_GetValidatedTokenPriceFromFeedErc20Above18Decimals() public {
address tokenAddress = _deploySourceToken("testToken", 0, 24);
address feedAddress = _deployTokenPriceDataFeed(tokenAddress, 8, 1e8);
@@ -84,7 +84,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer, uint224(1e12));
}
- function test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() public {
+ function test_GetValidatedTokenPriceFromFeedFeedAt18Decimals() public {
address tokenAddress = _deploySourceToken("testToken", 0, 18);
address feedAddress = _deployTokenPriceDataFeed(tokenAddress, 18, 1e18);
@@ -98,7 +98,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer, uint224(1e18));
}
- function test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() public {
+ function test_GetValidatedTokenPriceFromFeedFeedAt0Decimals() public {
address tokenAddress = _deploySourceToken("testToken", 0, 0);
address feedAddress = _deployTokenPriceDataFeed(tokenAddress, 0, 1e31);
@@ -112,7 +112,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer, uint224(1e67));
}
- function test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() public {
+ function test_GetValidatedTokenPriceFromFeedFlippedDecimals() public {
address tokenAddress = _deploySourceToken("testToken", 0, 20);
address feedAddress = _deployTokenPriceDataFeed(tokenAddress, 20, 1e18);
@@ -126,7 +126,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
assertEq(tokenPriceAnswer, uint224(1e14));
}
- function test_StaleFeeToken_Success() public {
+ function test_StaleFeeToken() public {
vm.warp(block.timestamp + TWELVE_HOURS + 1);
Internal.PriceUpdates memory priceUpdates = abi.decode(s_encodedInitialPriceUpdates, (Internal.PriceUpdates));
@@ -139,7 +139,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
// Reverts
- function test_OverflowFeedPrice_Revert() public {
+ function test_RevertWhen_OverflowFeedPrice() public {
address tokenAddress = _deploySourceToken("testToken", 0, 18);
address feedAddress = _deployTokenPriceDataFeed(tokenAddress, 18, int256(uint256(type(uint224).max) + 1));
@@ -151,7 +151,7 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
s_feeQuoter.getValidatedTokenPrice(tokenAddress);
}
- function test_UnderflowFeedPrice_Revert() public {
+ function test_RevertWhen_UnderflowFeedPrice() public {
address tokenAddress = _deploySourceToken("testToken", 0, 18);
address feedAddress = _deployTokenPriceDataFeed(tokenAddress, 18, -1);
@@ -163,12 +163,12 @@ contract FeeQuoter_getValidatedTokenPrice is FeeQuoterSetup {
s_feeQuoter.getValidatedTokenPrice(tokenAddress);
}
- function test_TokenNotSupported_Revert() public {
+ function test_RevertWhen_TokenNotSupported() public {
vm.expectRevert(abi.encodeWithSelector(FeeQuoter.TokenNotSupported.selector, DUMMY_CONTRACT_ADDRESS));
s_feeQuoter.getValidatedTokenPrice(DUMMY_CONTRACT_ADDRESS);
}
- function test_TokenNotSupportedFeed_Revert() public {
+ function test_RevertWhen_TokenNotSupportedFeed() public {
address sourceToken = _initialiseSingleTokenPriceFeed();
MockV3Aggregator(s_dataFeedByToken[sourceToken]).updateAnswer(0);
Internal.PriceUpdates memory priceUpdates = Internal.PriceUpdates({
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.onReport.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.onReport.t.sol
index ebd800b7d48..dd132e43b22 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.onReport.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.onReport.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {KeystoneFeedsPermissionHandler} from "../../../keystone/KeystoneFeedsPermissionHandler.sol";
@@ -132,7 +132,7 @@ contract FeeQuoter_onReport is FeeQuoterSetup {
assertEq(vm.getRecordedLogs().length, 0);
}
- function test_onReport_RevertWhen_TokenNotSupported() public {
+ function test_RevertWhen_onReportWhen_TokenNotSupported() public {
FeeQuoter.ReceivedCCIPFeedReport[] memory report = new FeeQuoter.ReceivedCCIPFeedReport[](1);
report[0] =
FeeQuoter.ReceivedCCIPFeedReport({token: s_sourceTokens[1], price: 4e18, timestamp: uint32(block.timestamp)});
@@ -143,7 +143,7 @@ contract FeeQuoter_onReport is FeeQuoterSetup {
s_feeQuoter.onReport(encodedPermissionsMetadata, abi.encode(report));
}
- function test_onReport_RevertWhen_InvalidForwarder() public {
+ function test_RevertWhen_onReportWhen_InvalidForwarder() public {
FeeQuoter.ReceivedCCIPFeedReport[] memory report = new FeeQuoter.ReceivedCCIPFeedReport[](1);
report[0] =
FeeQuoter.ReceivedCCIPFeedReport({token: s_sourceTokens[0], price: 4e18, timestamp: uint32(block.timestamp)});
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.parseEVMExtraArgsFromBytes.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.parseEVMExtraArgsFromBytes.t.sol
index 8f4e3f954ca..874bd20cbf8 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.parseEVMExtraArgsFromBytes.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.parseEVMExtraArgsFromBytes.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Client} from "../../libraries/Client.sol";
@@ -13,7 +13,7 @@ contract FeeQuoter_parseEVMExtraArgsFromBytes is FeeQuoterSetup {
s_destChainConfig = _generateFeeQuoterDestChainConfigArgs()[0].destChainConfig;
}
- function test_EVMExtraArgsV1_Success() public view {
+ function test_EVMExtraArgsV1() public view {
Client.EVMExtraArgsV1 memory inputArgs = Client.EVMExtraArgsV1({gasLimit: GAS_LIMIT});
bytes memory inputExtraArgs = Client._argsToBytes(inputArgs);
Client.EVMExtraArgsV2 memory expectedOutputArgs =
@@ -25,7 +25,7 @@ contract FeeQuoter_parseEVMExtraArgsFromBytes is FeeQuoterSetup {
);
}
- function test_EVMExtraArgsV2_Success() public view {
+ function test_EVMExtraArgsV2() public view {
Client.EVMExtraArgsV2 memory inputArgs =
Client.EVMExtraArgsV2({gasLimit: GAS_LIMIT, allowOutOfOrderExecution: true});
bytes memory inputExtraArgs = Client._argsToBytes(inputArgs);
@@ -35,7 +35,7 @@ contract FeeQuoter_parseEVMExtraArgsFromBytes is FeeQuoterSetup {
);
}
- function test_EVMExtraArgsDefault_Success() public view {
+ function test_EVMExtraArgsDefault() public view {
Client.EVMExtraArgsV2 memory expectedOutputArgs =
Client.EVMExtraArgsV2({gasLimit: s_destChainConfig.defaultTxGasLimit, allowOutOfOrderExecution: false});
@@ -46,7 +46,7 @@ contract FeeQuoter_parseEVMExtraArgsFromBytes is FeeQuoterSetup {
// Reverts
- function test_EVMExtraArgsInvalidExtraArgsTag_Revert() public {
+ function test_RevertWhen_EVMExtraArgsInvalidExtraArgsTag() public {
Client.EVMExtraArgsV2 memory inputArgs =
Client.EVMExtraArgsV2({gasLimit: GAS_LIMIT, allowOutOfOrderExecution: true});
bytes memory inputExtraArgs = Client._argsToBytes(inputArgs);
@@ -57,7 +57,7 @@ contract FeeQuoter_parseEVMExtraArgsFromBytes is FeeQuoterSetup {
s_feeQuoter.parseEVMExtraArgsFromBytes(inputExtraArgs, s_destChainConfig);
}
- function test_EVMExtraArgsEnforceOutOfOrder_Revert() public {
+ function test_RevertWhen_EVMExtraArgsEnforceOutOfOrder() public {
Client.EVMExtraArgsV2 memory inputArgs =
Client.EVMExtraArgsV2({gasLimit: GAS_LIMIT, allowOutOfOrderExecution: false});
bytes memory inputExtraArgs = Client._argsToBytes(inputArgs);
@@ -67,7 +67,7 @@ contract FeeQuoter_parseEVMExtraArgsFromBytes is FeeQuoterSetup {
s_feeQuoter.parseEVMExtraArgsFromBytes(inputExtraArgs, s_destChainConfig);
}
- function test_EVMExtraArgsGasLimitTooHigh_Revert() public {
+ function test_RevertWhen_EVMExtraArgsGasLimitTooHigh() public {
Client.EVMExtraArgsV2 memory inputArgs =
Client.EVMExtraArgsV2({gasLimit: s_destChainConfig.maxPerMsgGasLimit + 1, allowOutOfOrderExecution: true});
bytes memory inputExtraArgs = Client._argsToBytes(inputArgs);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.processMessageArgs.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.processMessageArgs.t.sol
index 65baa576ead..5041ddef667 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.processMessageArgs.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.processMessageArgs.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Client} from "../../libraries/Client.sol";
@@ -15,7 +15,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
super.setUp();
}
- function test_processMessageArgs_WithLinkTokenAmount_Success() public view {
+ function test_processMessageArgs_WithLinkTokenAmount() public view {
(
uint256 msgFeeJuels,
/* bool isOutOfOrderExecution */
@@ -36,7 +36,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
assertEq(msgFeeJuels, MAX_MSG_FEES_JUELS);
}
- function test_processMessageArgs_WithConvertedTokenAmount_Success() public view {
+ function test_processMessageArgs_WithConvertedTokenAmount() public view {
address feeToken = s_sourceTokens[1];
uint256 feeTokenAmount = 10_000 gwei;
uint256 expectedConvertedAmount = s_feeQuoter.convertTokenAmount(feeToken, feeTokenAmount, s_sourceTokens[0]);
@@ -60,7 +60,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
assertEq(msgFeeJuels, expectedConvertedAmount);
}
- function test_processMessageArgs_WithEmptyEVMExtraArgs_Success() public view {
+ function test_processMessageArgs_WithEmptyEVMExtraArgs() public view {
(
/* uint256 msgFeeJuels */
,
@@ -80,7 +80,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
assertEq(convertedExtraArgs, Client._argsToBytes(s_feeQuoter.parseEVMExtraArgsFromBytes("", DEST_CHAIN_SELECTOR)));
}
- function test_processMessageArgs_WithEVMExtraArgsV1_Success() public view {
+ function test_processMessageArgs_WithEVMExtraArgsV1() public view {
bytes memory extraArgs = Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 1000}));
(
@@ -104,7 +104,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
);
}
- function test_processMessageArgs_WitEVMExtraArgsV2_Success() public view {
+ function test_processMessageArgs_WitEVMExtraArgsV2() public view {
bytes memory extraArgs = Client._argsToBytes(Client.EVMExtraArgsV2({gasLimit: 0, allowOutOfOrderExecution: true}));
(
@@ -130,7 +130,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
// Reverts
- function test_processMessageArgs_MessageFeeTooHigh_Revert() public {
+ function test_RevertWhen_processMessageArgs_MessageFeeTooHigh() public {
vm.expectRevert(
abi.encodeWithSelector(FeeQuoter.MessageFeeTooHigh.selector, MAX_MSG_FEES_JUELS + 1, MAX_MSG_FEES_JUELS)
);
@@ -145,7 +145,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
);
}
- function test_processMessageArgs_InvalidExtraArgs_Revert() public {
+ function test_RevertWhen_processMessageArgs_InvalidExtraArgs() public {
vm.expectRevert(FeeQuoter.InvalidExtraArgsTag.selector);
s_feeQuoter.processMessageArgs(
@@ -158,7 +158,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
);
}
- function test_processMessageArgs_MalformedEVMExtraArgs_Revert() public {
+ function test_RevertWhen_processMessageArgs_MalformedEVMExtraArgs() public {
// abi.decode error
vm.expectRevert();
@@ -172,7 +172,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
);
}
- function test_processMessageArgs_WithCorrectPoolReturnData_Success() public view {
+ function test_processMessageArgs_WithCorrectPoolReturnData() public view {
Client.EVMTokenAmount[] memory sourceTokenAmounts = new Client.EVMTokenAmount[](2);
sourceTokenAmounts[0].amount = 1e18;
sourceTokenAmounts[0].token = s_sourceTokens[0];
@@ -199,7 +199,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
}
}
- function test_processMessageArgs_TokenAmountArraysMismatching_Revert() public {
+ function test_RevertWhen_processMessageArgs_TokenAmountArraysMismatching() public {
Client.EVMTokenAmount[] memory sourceTokenAmounts = new Client.EVMTokenAmount[](2);
sourceTokenAmounts[0].amount = 1e18;
sourceTokenAmounts[0].token = s_sourceTokens[0];
@@ -220,7 +220,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
);
}
- function test_applyTokensTransferFeeConfigUpdates_InvalidFeeRange_Revert() public {
+ function test_RevertWhen_applyTokensTransferFeeConfigUpdates_InvalidFeeRange() public {
address sourceETH = s_sourceTokens[1];
// Set token config to allow larger data
@@ -243,7 +243,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
);
}
- function test_processMessageArgs_SourceTokenDataTooLarge_Revert() public {
+ function test_RevertWhen_processMessageArgs_SourceTokenDataTooLarge() public {
address sourceETH = s_sourceTokens[1];
Client.EVMTokenAmount[] memory sourceTokenAmounts = new Client.EVMTokenAmount[](1);
@@ -300,7 +300,7 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup {
);
}
- function test_processMessageArgs_InvalidEVMAddressDestToken_Revert() public {
+ function test_RevertWhen_processMessageArgs_InvalidEVMAddressDestToken() public {
bytes memory nonEvmAddress = abi.encode(type(uint208).max);
Client.EVMTokenAmount[] memory sourceTokenAmounts = new Client.EVMTokenAmount[](1);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.supportsInterface.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.supportsInterface.t.sol
index a9352392301..35712d9bfcf 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.supportsInterface.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.supportsInterface.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IReceiver} from "../../../keystone/interfaces/IReceiver.sol";
import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol";
@@ -9,7 +9,7 @@ import {IFeeQuoter} from "../../interfaces/IFeeQuoter.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_supportsInterface is FeeQuoterSetup {
- function test_SupportsInterface_Success() public view {
+ function test_SupportsInterface() public view {
assertTrue(s_feeQuoter.supportsInterface(type(IReceiver).interfaceId));
assertTrue(s_feeQuoter.supportsInterface(type(ITypeAndVersion).interfaceId));
assertTrue(s_feeQuoter.supportsInterface(type(IFeeQuoter).interfaceId));
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.updatePrices.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.updatePrices.t.sol
index d40ac7d33ad..6f463af248b 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.updatePrices.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.updatePrices.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {AuthorizedCallers} from "../../../shared/access/AuthorizedCallers.sol";
import {FeeQuoter} from "../../FeeQuoter.sol";
@@ -7,7 +7,7 @@ import {Internal} from "../../libraries/Internal.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_updatePrices is FeeQuoterSetup {
- function test_OnlyTokenPrice_Success() public {
+ function test_OnlyTokenPrice() public {
Internal.PriceUpdates memory update = Internal.PriceUpdates({
tokenPriceUpdates: new Internal.TokenPriceUpdate[](1),
gasPriceUpdates: new Internal.GasPriceUpdate[](0)
@@ -24,7 +24,7 @@ contract FeeQuoter_updatePrices is FeeQuoterSetup {
assertEq(s_feeQuoter.getTokenPrice(s_sourceTokens[0]).value, update.tokenPriceUpdates[0].usdPerToken);
}
- function test_OnlyGasPrice_Success() public {
+ function test_OnlyGasPrice() public {
Internal.PriceUpdates memory update = Internal.PriceUpdates({
tokenPriceUpdates: new Internal.TokenPriceUpdate[](0),
gasPriceUpdates: new Internal.GasPriceUpdate[](1)
@@ -44,7 +44,7 @@ contract FeeQuoter_updatePrices is FeeQuoterSetup {
);
}
- function test_UpdateMultiplePrices_Success() public {
+ function test_UpdateMultiplePrices() public {
Internal.TokenPriceUpdate[] memory tokenPriceUpdates = new Internal.TokenPriceUpdate[](3);
tokenPriceUpdates[0] = Internal.TokenPriceUpdate({sourceToken: s_sourceTokens[0], usdPerToken: 4e18});
tokenPriceUpdates[1] = Internal.TokenPriceUpdate({sourceToken: s_sourceTokens[1], usdPerToken: 1800e18});
@@ -86,7 +86,7 @@ contract FeeQuoter_updatePrices is FeeQuoterSetup {
}
}
- function test_UpdatableByAuthorizedCaller_Success() public {
+ function test_UpdatableByAuthorizedCaller() public {
Internal.PriceUpdates memory priceUpdates = Internal.PriceUpdates({
tokenPriceUpdates: new Internal.TokenPriceUpdate[](1),
gasPriceUpdates: new Internal.GasPriceUpdate[](0)
@@ -127,7 +127,7 @@ contract FeeQuoter_updatePrices is FeeQuoterSetup {
// Reverts
- function test_OnlyCallableByUpdater_Revert() public {
+ function test_RevertWhen_OnlyCallableByUpdater() public {
Internal.PriceUpdates memory priceUpdates = Internal.PriceUpdates({
tokenPriceUpdates: new Internal.TokenPriceUpdate[](0),
gasPriceUpdates: new Internal.GasPriceUpdate[](0)
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.updateTokenPriceFeeds.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.updateTokenPriceFeeds.t.sol
index 9341fab121b..2ee95e4f513 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.updateTokenPriceFeeds.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.updateTokenPriceFeeds.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../shared/access/Ownable2Step.sol";
import {FeeQuoter} from "../../FeeQuoter.sol";
@@ -9,7 +9,7 @@ import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
import {Vm} from "forge-std/Vm.sol";
contract FeeQuoter_updateTokenPriceFeeds is FeeQuoterSetup {
- function test_ZeroFeeds_Success() public {
+ function test_ZeroFeeds() public {
Vm.Log[] memory logEntries = vm.getRecordedLogs();
FeeQuoter.TokenPriceFeedUpdate[] memory tokenPriceFeedUpdates = new FeeQuoter.TokenPriceFeedUpdate[](0);
@@ -20,7 +20,7 @@ contract FeeQuoter_updateTokenPriceFeeds is FeeQuoterSetup {
assertEq(logEntries.length, 0);
}
- function test_SingleFeedUpdate_Success() public {
+ function test_SingleFeedUpdate() public {
FeeQuoter.TokenPriceFeedUpdate[] memory tokenPriceFeedUpdates = new FeeQuoter.TokenPriceFeedUpdate[](1);
tokenPriceFeedUpdates[0] =
_getSingleTokenPriceFeedUpdateStruct(s_sourceTokens[0], s_dataFeedByToken[s_sourceTokens[0]], 18);
@@ -37,7 +37,7 @@ contract FeeQuoter_updateTokenPriceFeeds is FeeQuoterSetup {
);
}
- function test_MultipleFeedUpdate_Success() public {
+ function test_MultipleFeedUpdate() public {
FeeQuoter.TokenPriceFeedUpdate[] memory tokenPriceFeedUpdates = new FeeQuoter.TokenPriceFeedUpdate[](2);
for (uint256 i = 0; i < 2; ++i) {
@@ -62,7 +62,7 @@ contract FeeQuoter_updateTokenPriceFeeds is FeeQuoterSetup {
);
}
- function test_FeedUnset_Success() public {
+ function test_FeedUnset() public {
Internal.TimestampedPackedUint224 memory priceQueryInitial = s_feeQuoter.getTokenPrice(s_sourceTokens[0]);
assertFalse(priceQueryInitial.value == 0);
assertFalse(priceQueryInitial.timestamp == 0);
@@ -106,7 +106,7 @@ contract FeeQuoter_updateTokenPriceFeeds is FeeQuoterSetup {
// Reverts
- function test_FeedUpdatedByNonOwner_Revert() public {
+ function test_RevertWhen_FeedUpdatedByNonOwner() public {
FeeQuoter.TokenPriceFeedUpdate[] memory tokenPriceFeedUpdates = new FeeQuoter.TokenPriceFeedUpdate[](1);
tokenPriceFeedUpdates[0] =
_getSingleTokenPriceFeedUpdateStruct(s_sourceTokens[0], s_dataFeedByToken[s_sourceTokens[0]], 18);
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.validateDestFamilyAddress.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.validateDestFamilyAddress.t.sol
index 761cb7546a9..d11d8baddef 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.validateDestFamilyAddress.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.validateDestFamilyAddress.t.sol
@@ -1,34 +1,34 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../libraries/Internal.sol";
import {FeeQuoterSetup} from "./FeeQuoterSetup.t.sol";
contract FeeQuoter_validateDestFamilyAddress is FeeQuoterSetup {
- function test_ValidEVMAddress_Success() public view {
+ function test_ValidEVMAddress() public view {
bytes memory encodedAddress = abi.encode(address(10000));
s_feeQuoter.validateDestFamilyAddress(Internal.CHAIN_FAMILY_SELECTOR_EVM, encodedAddress);
}
- function test_ValidNonEVMAddress_Success() public view {
+ function test_ValidNonEVMAddress() public view {
s_feeQuoter.validateDestFamilyAddress(bytes4(uint32(1)), abi.encode(type(uint208).max));
}
// Reverts
- function test_InvalidEVMAddress_Revert() public {
+ function test_RevertWhen_InvalidEVMAddress() public {
bytes memory invalidAddress = abi.encode(type(uint208).max);
vm.expectRevert(abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, invalidAddress));
s_feeQuoter.validateDestFamilyAddress(Internal.CHAIN_FAMILY_SELECTOR_EVM, invalidAddress);
}
- function test_InvalidEVMAddressEncodePacked_Revert() public {
+ function test_RevertWhen_InvalidEVMAddressEncodePacked() public {
bytes memory invalidAddress = abi.encodePacked(address(234));
vm.expectRevert(abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, invalidAddress));
s_feeQuoter.validateDestFamilyAddress(Internal.CHAIN_FAMILY_SELECTOR_EVM, invalidAddress);
}
- function test_InvalidEVMAddressPrecompiles_Revert() public {
+ function test_RevertWhen_InvalidEVMAddressPrecompiles() public {
for (uint160 i = 0; i < Internal.PRECOMPILE_SPACE; ++i) {
bytes memory invalidAddress = abi.encode(address(i));
vm.expectRevert(abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, invalidAddress));
diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol
index 92c2b3fe309..7864d4080a2 100644
--- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoterSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MockV3Aggregator} from "../../../tests/MockV3Aggregator.sol";
import {FeeQuoter} from "../../FeeQuoter.sol";
@@ -17,6 +17,18 @@ contract FeeQuoterSetup is TokenSetup {
address internal constant CUSTOM_TOKEN = address(12345);
address internal constant CUSTOM_TOKEN_2 = address(bytes20(keccak256("CUSTOM_TOKEN_2")));
+ uint32 internal constant MAX_DATA_SIZE = 30_000;
+ uint16 internal constant MAX_TOKENS_LENGTH = 5;
+ uint32 internal constant MAX_GAS_LIMIT = 4_000_000;
+
+ // OnRamp
+ uint96 internal constant MAX_MSG_FEES_JUELS = 1_000e18;
+ uint32 internal constant DEST_GAS_OVERHEAD = 300_000;
+ uint16 internal constant DEST_GAS_PER_PAYLOAD_BYTE = 16;
+
+ uint16 internal constant DEFAULT_TOKEN_FEE_USD_CENTS = 50;
+ uint32 internal constant DEFAULT_TOKEN_BYTES_OVERHEAD = 32;
+
// Use 16 gas per data availability byte in our tests.
// This is an overestimation in OP stack, it ignores 4 gas per 0 byte rule.
// Arbitrum on the other hand, does always use 16 gas per data availability byte.
diff --git a/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol b/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol
index c3f95a7e067..7775b777cf5 100644
--- a/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC677} from "../../../shared/token/ERC677/BurnMintERC677.sol";
import {IGetCCIPAdmin} from "../../interfaces/IGetCCIPAdmin.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/BurnMintMultiTokenPool.sol b/contracts/src/v0.8/ccip/test/helpers/BurnMintMultiTokenPool.sol
index bb1d4c9af36..6b842ede7f2 100644
--- a/contracts/src/v0.8/ccip/test/helpers/BurnMintMultiTokenPool.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/BurnMintMultiTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol b/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol
index 0bc97c7aa5b..3f8dc595f4d 100644
--- a/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/CCIPHomeHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPHome} from "../../capability/CCIPHome.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol b/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol
index d3567c6027d..236797f87f0 100644
--- a/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../libraries/Internal.sol";
import {OffRamp} from "../../offRamp/OffRamp.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/ERC20RebasingHelper.sol b/contracts/src/v0.8/ccip/test/helpers/ERC20RebasingHelper.sol
index 617d39af5c4..874a84ad127 100644
--- a/contracts/src/v0.8/ccip/test/helpers/ERC20RebasingHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/ERC20RebasingHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol
index 9f4ca68d84a..079cf36c4a3 100644
--- a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
contract EVM2EVMOffRampHelper {
uint64 public s_nonce;
diff --git a/contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol b/contracts/src/v0.8/ccip/test/helpers/EncodingUtils.sol
similarity index 94%
rename from contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol
rename to contracts/src/v0.8/ccip/test/helpers/EncodingUtils.sol
index c8a976eda87..b44672335ce 100644
--- a/contracts/src/v0.8/ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/EncodingUtils.sol
@@ -2,14 +2,14 @@
pragma solidity ^0.8.0;
import {CCIPHome} from "../../capability/CCIPHome.sol";
-
import {OffRamp} from "../../offRamp/OffRamp.sol";
import {RMNRemote} from "../../rmn/RMNRemote.sol";
/// @dev this file exposes structs that are otherwise internal to the CCIP codebase.
/// doing this allows those structs to be encoded and decoded with type safety in offchain code.
/// and tests because generated wrappers are available.
-interface ICCIPEncodingUtils {
+// solhint-disable-next-line
+interface EncodingUtils {
/// @dev the RMN Report struct is used in integration / E2E tests.
function exposeRmnReport(bytes32 rmnReportVersion, RMNRemote.Report memory rmnReport) external;
diff --git a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol
index e357645bcb2..197b262671f 100644
--- a/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/EtherSenderReceiverHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {EtherSenderReceiver} from "../../applications/EtherSenderReceiver.sol";
import {Client} from "../../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/FeeQuoterHelper.sol b/contracts/src/v0.8/ccip/test/helpers/FeeQuoterHelper.sol
index e392ba05589..ff8f9b6c042 100644
--- a/contracts/src/v0.8/ccip/test/helpers/FeeQuoterHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/FeeQuoterHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../FeeQuoter.sol";
import {Client} from "../../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/IgnoreContractSize.sol b/contracts/src/v0.8/ccip/test/helpers/IgnoreContractSize.sol
index b30124069f2..d9fca95b696 100644
--- a/contracts/src/v0.8/ccip/test/helpers/IgnoreContractSize.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/IgnoreContractSize.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
contract IgnoreContractSize {
// test contracts are excluded from forge build --sizes by default
diff --git a/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol b/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol
index 9def7688147..058398e4c08 100644
--- a/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/MaybeRevertingBurnMintTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/MerkleHelper.sol b/contracts/src/v0.8/ccip/test/helpers/MerkleHelper.sol
index 3893d082b6a..e6854e42187 100644
--- a/contracts/src/v0.8/ccip/test/helpers/MerkleHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/MerkleHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MerkleMultiProof} from "../../libraries/MerkleMultiProof.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/MessageInterceptorHelper.sol b/contracts/src/v0.8/ccip/test/helpers/MessageInterceptorHelper.sol
index 80cdf61602b..049e1fdb676 100644
--- a/contracts/src/v0.8/ccip/test/helpers/MessageInterceptorHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/MessageInterceptorHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IMessageInterceptor} from "../../interfaces/IMessageInterceptor.sol";
import {Client} from "../../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/MultiAggregateRateLimiterHelper.sol b/contracts/src/v0.8/ccip/test/helpers/MultiAggregateRateLimiterHelper.sol
index 7c2e6cc8c24..fc7040fbe1e 100644
--- a/contracts/src/v0.8/ccip/test/helpers/MultiAggregateRateLimiterHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/MultiAggregateRateLimiterHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiAggregateRateLimiter} from "../../MultiAggregateRateLimiter.sol";
import {Client} from "../../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/MultiOCR3Helper.sol b/contracts/src/v0.8/ccip/test/helpers/MultiOCR3Helper.sol
index 68347d153fa..6fbd5295c39 100644
--- a/contracts/src/v0.8/ccip/test/helpers/MultiOCR3Helper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/MultiOCR3Helper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiOCR3Base} from "../../ocr/MultiOCR3Base.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol b/contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol
index c8243d50bd7..697d490b288 100644
--- a/contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/MultiTokenPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IPoolV1} from "../../interfaces/IPool.sol";
import {IRMN} from "../../interfaces/IRMN.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol
index 40f7ccb5914..c315c2e53d4 100644
--- a/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/structs/EnumerableSet.sol";
import {Client} from "../../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/OnRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/OnRampHelper.sol
index d315a58fc5d..d9f049718df 100644
--- a/contracts/src/v0.8/ccip/test/helpers/OnRampHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/OnRampHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {OnRamp} from "../../onRamp/OnRamp.sol";
import {IgnoreContractSize} from "./IgnoreContractSize.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/RateLimiterHelper.sol b/contracts/src/v0.8/ccip/test/helpers/RateLimiterHelper.sol
index 6cd1c18705a..9cf4d467416 100644
--- a/contracts/src/v0.8/ccip/test/helpers/RateLimiterHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/RateLimiterHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RateLimiter} from "../../libraries/RateLimiter.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol b/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol
index 41e4a95b060..b29cd28b1d5 100644
--- a/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/ReportCodec.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../libraries/Internal.sol";
import {OffRamp} from "../../offRamp/OffRamp.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/TokenPoolHelper.sol b/contracts/src/v0.8/ccip/test/helpers/TokenPoolHelper.sol
index c067b220fc0..d6a34608136 100644
--- a/contracts/src/v0.8/ccip/test/helpers/TokenPoolHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/TokenPoolHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../libraries/Pool.sol";
import {TokenPool} from "../../pools/TokenPool.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/USDCReaderTester.sol b/contracts/src/v0.8/ccip/test/helpers/USDCReaderTester.sol
index d1baa22de1b..f958f1fbf8b 100644
--- a/contracts/src/v0.8/ccip/test/helpers/USDCReaderTester.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/USDCReaderTester.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
contract USDCReaderTester {
event MessageSent(bytes);
diff --git a/contracts/src/v0.8/ccip/test/helpers/USDCTokenPoolHelper.sol b/contracts/src/v0.8/ccip/test/helpers/USDCTokenPoolHelper.sol
index 7a3400588a8..0996fb5bd7b 100644
--- a/contracts/src/v0.8/ccip/test/helpers/USDCTokenPoolHelper.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/USDCTokenPoolHelper.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol
index d4102da0752..3fee88c6b5e 100644
--- a/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ConformingReceiver.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPReceiver} from "../../../applications/CCIPReceiver.sol";
import {Client} from "../../../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/MaybeRevertMessageReceiver.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/MaybeRevertMessageReceiver.sol
index b40b2c34431..91a697ac318 100644
--- a/contracts/src/v0.8/ccip/test/helpers/receivers/MaybeRevertMessageReceiver.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/receivers/MaybeRevertMessageReceiver.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IAny2EVMMessageReceiver} from "../../../interfaces/IAny2EVMMessageReceiver.sol";
import {Client} from "../../../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/MaybeRevertMessageReceiverNo165.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/MaybeRevertMessageReceiverNo165.sol
index 07e5ac8544f..9f5030666af 100644
--- a/contracts/src/v0.8/ccip/test/helpers/receivers/MaybeRevertMessageReceiverNo165.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/receivers/MaybeRevertMessageReceiverNo165.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IAny2EVMMessageReceiver} from "../../../interfaces/IAny2EVMMessageReceiver.sol";
diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol
index b8aeeb027ae..64f14632c26 100644
--- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol
+++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CCIPReceiver} from "../../../applications/CCIPReceiver.sol";
import {Client} from "../../../libraries/Client.sol";
diff --git a/contracts/src/v0.8/ccip/test/libraries/ERC165CheckerReverting.supportsInterfaceReverting.t.sol b/contracts/src/v0.8/ccip/test/libraries/ERC165CheckerReverting.supportsInterfaceReverting.t.sol
new file mode 100644
index 00000000000..9a63e37ef86
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/libraries/ERC165CheckerReverting.supportsInterfaceReverting.t.sol
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.24;
+
+import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol";
+
+import {ERC165CheckerReverting} from "../../libraries/ERC165CheckerReverting.sol";
+import {MaybeRevertMessageReceiver} from "../helpers/receivers/MaybeRevertMessageReceiver.sol";
+
+import {Test} from "forge-std/Test.sol";
+
+contract ERC165CheckerReverting_supportsInterfaceReverting is Test {
+ using ERC165CheckerReverting for address;
+
+ address internal s_receiver;
+
+ bytes4 internal constant EXAMPLE_INTERFACE_ID = 0xdeadbeef;
+
+ error InsufficientGasForStaticCall();
+
+ constructor() {
+ s_receiver = address(new MaybeRevertMessageReceiver(false));
+ }
+
+ function test__supportsInterfaceReverting() public view {
+ assertTrue(s_receiver._supportsInterfaceReverting(type(IAny2EVMMessageReceiver).interfaceId));
+ }
+
+ // Reverts
+
+ function test__supportsInterfaceReverting_RevertWhen_NotEnoughGasForSupportsInterface() public {
+ vm.expectRevert(InsufficientGasForStaticCall.selector);
+
+ // Library calls cannot be called with gas limit overrides, so a public function must be exposed
+ // instead which can proxy the call to the library.
+
+ // The gas limit was chosen so that after overhead, <31k would remain to trigger the error.
+ this.invokeERC165Checker{gas: 33_000}();
+ }
+
+ // Meant to test the call with a manual gas limit override
+ function invokeERC165Checker() external view {
+ s_receiver._supportsInterfaceReverting(EXAMPLE_INTERFACE_ID);
+ }
+}
diff --git a/contracts/src/v0.8/ccip/test/libraries/MerkleMultiProof.t.sol b/contracts/src/v0.8/ccip/test/libraries/MerkleMultiProof.t.sol
index 4f03f3e6f55..6a287ce7369 100644
--- a/contracts/src/v0.8/ccip/test/libraries/MerkleMultiProof.t.sol
+++ b/contracts/src/v0.8/ccip/test/libraries/MerkleMultiProof.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MerkleMultiProof} from "../../libraries/MerkleMultiProof.sol";
import {MerkleHelper} from "../helpers/MerkleHelper.sol";
@@ -160,14 +160,14 @@ contract MerkleMultiProofTest is Test {
assertEq(MerkleMultiProof._merkleRoot(leaves, proofs, 7), finalResult);
}
- function test_MerkleRootSingleLeaf_Success() public pure {
+ function test_MerkleRootSingleLeaf() public pure {
bytes32[] memory leaves = new bytes32[](1);
leaves[0] = "root";
bytes32[] memory proofs = new bytes32[](0);
assertEq(MerkleMultiProof._merkleRoot(leaves, proofs, 0), leaves[0]);
}
- function test_EmptyLeaf_Revert() public {
+ function test_RevertWhen_EmptyLeaf() public {
bytes32[] memory leaves = new bytes32[](0);
bytes32[] memory proofs = new bytes32[](0);
diff --git a/contracts/src/v0.8/ccip/test/libraries/RateLimiter.t.sol b/contracts/src/v0.8/ccip/test/libraries/RateLimiter.t.sol
index da6a6f9ada7..24ffaa72b26 100644
--- a/contracts/src/v0.8/ccip/test/libraries/RateLimiter.t.sol
+++ b/contracts/src/v0.8/ccip/test/libraries/RateLimiter.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RateLimiter} from "../../libraries/RateLimiter.sol";
import {RateLimiterHelper} from "../helpers/RateLimiterHelper.sol";
@@ -18,7 +18,7 @@ contract RateLimiterSetup is Test {
}
contract RateLimiter_constructor is RateLimiterSetup {
- function test_Constructor_Success() public view {
+ function test_Constructor() public view {
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
assertEq(s_config.rate, rateLimiter.rate);
assertEq(s_config.capacity, rateLimiter.capacity);
@@ -29,7 +29,7 @@ contract RateLimiter_constructor is RateLimiterSetup {
}
contract RateLimiter_setTokenBucketConfig is RateLimiterSetup {
- function test_SetRateLimiterConfig_Success() public {
+ function test_SetRateLimiterConfig() public {
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
assertEq(s_config.rate, rateLimiter.rate);
assertEq(s_config.capacity, rateLimiter.capacity);
@@ -52,7 +52,7 @@ contract RateLimiter_setTokenBucketConfig is RateLimiterSetup {
}
contract RateLimiter_currentTokenBucketState is RateLimiterSetup {
- function test_CurrentTokenBucketState_Success() public {
+ function test_CurrentTokenBucketState() public {
RateLimiter.TokenBucket memory bucket = s_helper.currentTokenBucketState();
assertEq(s_config.rate, bucket.rate);
assertEq(s_config.capacity, bucket.capacity);
@@ -72,7 +72,7 @@ contract RateLimiter_currentTokenBucketState is RateLimiterSetup {
assertEq(BLOCK_TIME, bucket.lastUpdated);
}
- function test_Refill_Success() public {
+ function test_Refill() public {
RateLimiter.TokenBucket memory bucket = s_helper.currentTokenBucketState();
assertEq(s_config.rate, bucket.rate);
assertEq(s_config.capacity, bucket.capacity);
@@ -109,7 +109,7 @@ contract RateLimiter_currentTokenBucketState is RateLimiterSetup {
contract RateLimiter_consume is RateLimiterSetup {
address internal s_token = address(100);
- function test_ConsumeAggregateValue_Success() public {
+ function test_ConsumeAggregateValue() public {
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
assertEq(s_config.rate, rateLimiter.rate);
assertEq(s_config.capacity, rateLimiter.capacity);
@@ -132,7 +132,7 @@ contract RateLimiter_consume is RateLimiterSetup {
assertEq(BLOCK_TIME, rateLimiter.lastUpdated);
}
- function test_ConsumeTokens_Success() public {
+ function test_ConsumeTokens() public {
uint256 requestTokens = 50;
vm.expectEmit();
@@ -141,7 +141,7 @@ contract RateLimiter_consume is RateLimiterSetup {
s_helper.consume(requestTokens, s_token);
}
- function test_Refill_Success() public {
+ function test_Refill() public {
uint256 requestTokens = 50;
vm.expectEmit();
@@ -172,7 +172,7 @@ contract RateLimiter_consume is RateLimiterSetup {
assertEq(BLOCK_TIME + warpTime, rateLimiter.lastUpdated);
}
- function test_ConsumeUnlimited_Success() public {
+ function test_ConsumeUnlimited() public {
s_helper.consume(0, address(0));
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
@@ -204,7 +204,7 @@ contract RateLimiter_consume is RateLimiterSetup {
// Reverts
- function test_AggregateValueMaxCapacityExceeded_Revert() public {
+ function test_RevertWhen_AggregateValueMaxCapacityExceeded() public {
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
vm.expectRevert(
@@ -215,7 +215,7 @@ contract RateLimiter_consume is RateLimiterSetup {
s_helper.consume(rateLimiter.capacity + 1, address(0));
}
- function test_TokenMaxCapacityExceeded_Revert() public {
+ function test_RevertWhen_TokenMaxCapacityExceeded() public {
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
vm.expectRevert(
@@ -226,7 +226,7 @@ contract RateLimiter_consume is RateLimiterSetup {
s_helper.consume(rateLimiter.capacity + 1, s_token);
}
- function test_ConsumingMoreThanUint128_Revert() public {
+ function test_RevertWhen_ConsumingMoreThanUint128() public {
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
uint256 request = uint256(type(uint128).max) + 1;
@@ -237,7 +237,7 @@ contract RateLimiter_consume is RateLimiterSetup {
s_helper.consume(request, address(0));
}
- function test_AggregateValueRateLimitReached_Revert() public {
+ function test_RevertWhen_AggregateValueRateLimitReached() public {
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
uint256 overLimit = 20;
@@ -256,7 +256,7 @@ contract RateLimiter_consume is RateLimiterSetup {
s_helper.consume(requestTokens2, address(0));
}
- function test_TokenRateLimitReached_Revert() public {
+ function test_RevertWhen_TokenRateLimitReached() public {
RateLimiter.TokenBucket memory rateLimiter = s_helper.getRateLimiter();
uint256 overLimit = 20;
@@ -275,7 +275,7 @@ contract RateLimiter_consume is RateLimiterSetup {
s_helper.consume(requestTokens2, s_token);
}
- function test_RateLimitReachedOverConsecutiveBlocks_Revert() public {
+ function test_RevertWhen_RateLimitReachedOverConsecutiveBlocks() public {
uint256 initBlockTime = BLOCK_TIME + 10000;
vm.warp(initBlockTime);
diff --git a/contracts/src/v0.8/ccip/test/mocks/MockE2EUSDCTokenMessenger.sol b/contracts/src/v0.8/ccip/test/mocks/MockE2EUSDCTokenMessenger.sol
index c142cb89477..dc814a3578e 100644
--- a/contracts/src/v0.8/ccip/test/mocks/MockE2EUSDCTokenMessenger.sol
+++ b/contracts/src/v0.8/ccip/test/mocks/MockE2EUSDCTokenMessenger.sol
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
import {ITokenMessenger} from "../../pools/USDC/ITokenMessenger.sol";
diff --git a/contracts/src/v0.8/ccip/test/mocks/MockRMN.sol b/contracts/src/v0.8/ccip/test/mocks/MockRMN.sol
deleted file mode 100644
index 435c6697632..00000000000
--- a/contracts/src/v0.8/ccip/test/mocks/MockRMN.sol
+++ /dev/null
@@ -1,61 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
-
-import {IRMN} from "../../interfaces/IRMN.sol";
-
-/// @notice WARNING: This contract is to be only used for testing, all methods are unprotected.
-contract MockRMN is IRMN {
- error CustomError(bytes err);
-
- bytes private s_isCursedRevert;
-
- bool private s_globalCursed;
- mapping(bytes16 subject => bool cursed) private s_cursedBySubject;
- mapping(address commitStore => mapping(bytes32 root => bool blessed)) private s_blessedByRoot;
-
- function setTaggedRootBlessed(IRMN.TaggedRoot calldata taggedRoot, bool blessed) external {
- s_blessedByRoot[taggedRoot.commitStore][taggedRoot.root] = blessed;
- }
-
- function setGlobalCursed(
- bool cursed
- ) external {
- s_globalCursed = cursed;
- }
-
- function setChainCursed(uint64 chainSelector, bool cursed) external {
- s_cursedBySubject[bytes16(uint128(chainSelector))] = cursed;
- }
-
- /// @notice Setting a revert error with length of 0 will disable reverts
- /// @dev Useful to test revert handling of ARMProxy
- function setIsCursedRevert(
- bytes calldata revertErr
- ) external {
- s_isCursedRevert = revertErr;
- }
-
- // IRMN implementation follows
-
- function isCursed() external view returns (bool) {
- if (s_isCursedRevert.length > 0) {
- revert CustomError(s_isCursedRevert);
- }
- return s_globalCursed;
- }
-
- function isCursed(
- bytes16 subject
- ) external view returns (bool) {
- if (s_isCursedRevert.length > 0) {
- revert CustomError(s_isCursedRevert);
- }
- return s_globalCursed || s_cursedBySubject[subject];
- }
-
- function isBlessed(
- IRMN.TaggedRoot calldata taggedRoot
- ) external view returns (bool) {
- return s_blessedByRoot[taggedRoot.commitStore][taggedRoot.root];
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/mocks/MockUSDCTokenMessenger.sol b/contracts/src/v0.8/ccip/test/mocks/MockUSDCTokenMessenger.sol
index 562a9f467ff..f198835c236 100644
--- a/contracts/src/v0.8/ccip/test/mocks/MockUSDCTokenMessenger.sol
+++ b/contracts/src/v0.8/ccip/test/mocks/MockUSDCTokenMessenger.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol";
import {ITokenMessenger} from "../../pools/USDC/ITokenMessenger.sol";
diff --git a/contracts/src/v0.8/ccip/test/mocks/test/MockRouterTest.t.sol b/contracts/src/v0.8/ccip/test/mocks/test/MockRouterTest.t.sol
index 549d6b8f843..11371d71f95 100644
--- a/contracts/src/v0.8/ccip/test/mocks/test/MockRouterTest.t.sol
+++ b/contracts/src/v0.8/ccip/test/mocks/test/MockRouterTest.t.sol
@@ -1,7 +1,6 @@
pragma solidity ^0.8.0;
import {Client} from "../../../libraries/Client.sol";
-
import {TokenSetup} from "../../TokenSetup.t.sol";
import {IRouterClient, MockCCIPRouter} from "../MockRouter.sol";
@@ -31,32 +30,32 @@ contract MockRouterTest is TokenSetup {
s_sourceFeeToken = _deploySourceToken("sLINK", type(uint256).max, 18);
}
- function test_ccipSendWithInsufficientNativeTokens_Revert() public {
+ function test_RevertWhen_ccipSendWithInsufficientNativeTokens() public {
//Should revert because did not include sufficient eth to pay for fees
vm.expectRevert(IRouterClient.InsufficientFeeTokenAmount.selector);
mockRouter.ccipSend(MOCK_CHAIN_SELECTOR, message);
}
- function test_ccipSendWithSufficientNativeFeeTokens_Success() public {
+ function test_ccipSendWithSufficientNativeFeeTokens() public {
//ccipSend with sufficient native tokens for fees
mockRouter.ccipSend{value: 0.1 ether}(MOCK_CHAIN_SELECTOR, message);
}
- function test_ccipSendWithInvalidMsgValue_Revert() public {
+ function test_RevertWhen_ccipSendWithInvalidMsgValue() public {
message.feeToken = address(1); //Set to non native-token fees
vm.expectRevert(IRouterClient.InvalidMsgValue.selector);
mockRouter.ccipSend{value: 0.1 ether}(MOCK_CHAIN_SELECTOR, message);
}
- function test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() public {
+ function test_RevertWhen_ccipSendWithLinkFeeTokenbutInsufficientAllowance() public {
message.feeToken = s_sourceFeeToken;
vm.expectRevert(bytes("ERC20: insufficient allowance"));
mockRouter.ccipSend(MOCK_CHAIN_SELECTOR, message);
}
- function test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() public {
+ function test_ccipSendWithLinkFeeTokenAndValidMsgValue() public {
message.feeToken = s_sourceFeeToken;
vm.startPrank(OWNER, OWNER);
@@ -66,19 +65,19 @@ contract MockRouterTest is TokenSetup {
mockRouter.ccipSend(MOCK_CHAIN_SELECTOR, message);
}
- function test_ccipSendWithEVMExtraArgsV1_Success() public {
+ function test_ccipSendWithEVMExtraArgsV1() public {
Client.EVMExtraArgsV1 memory extraArgs = Client.EVMExtraArgsV1({gasLimit: 500_000});
message.extraArgs = Client._argsToBytes(extraArgs);
mockRouter.ccipSend{value: 0.1 ether}(MOCK_CHAIN_SELECTOR, message);
}
- function test_ccipSendWithEVMExtraArgsV2_Success() public {
+ function test_ccipSendWithEVMExtraArgsV2() public {
Client.EVMExtraArgsV2 memory extraArgs = Client.EVMExtraArgsV2({gasLimit: 500_000, allowOutOfOrderExecution: true});
message.extraArgs = Client._argsToBytes(extraArgs);
mockRouter.ccipSend{value: 0.1 ether}(MOCK_CHAIN_SELECTOR, message);
}
- function test_ccipSendWithInvalidEVMExtraArgs_Revert() public {
+ function test_RevertWhen_ccipSendWithInvalidEVMExtraArgs() public {
uint256 gasLimit = 500_000;
bytes4 invalidExtraArgsTag = bytes4(keccak256("CCIP EVMExtraArgsInvalid"));
message.extraArgs = abi.encodeWithSelector(invalidExtraArgsTag, gasLimit);
diff --git a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3Base.setOCR3Configs.t.sol b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3Base.setOCR3Configs.t.sol
index c70a8666654..36593790409 100644
--- a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3Base.setOCR3Configs.t.sol
+++ b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3Base.setOCR3Configs.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiOCR3Base} from "../../../ocr/MultiOCR3Base.sol";
import {MultiOCR3Helper} from "../../helpers/MultiOCR3Helper.sol";
@@ -8,7 +8,7 @@ import {MultiOCR3BaseSetup} from "./MultiOCR3BaseSetup.t.sol";
import {Vm} from "forge-std/Vm.sol";
contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
- function test_SetConfigsZeroInput_Success() public {
+ function test_SetConfigsZeroInput() public {
vm.recordLogs();
s_multiOCR3.setOCR3Configs(new MultiOCR3Base.OCRConfigArgs[](0));
@@ -17,7 +17,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
assertEq(logEntries.length, 0);
}
- function test_SetConfigWithSigners_Success() public {
+ function test_SetConfigWithSigners() public {
uint8 F = 2;
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0));
@@ -59,7 +59,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
_assertOCRConfigEquality(s_multiOCR3.latestConfigDetails(0), expectedConfig);
}
- function test_SetConfigWithSignersMismatchingTransmitters_Success() public {
+ function test_SetConfigWithSignersMismatchingTransmitters() public {
uint8 F = 2;
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0));
@@ -101,7 +101,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
_assertOCRConfigEquality(s_multiOCR3.latestConfigDetails(0), expectedConfig);
}
- function test_SetConfigWithoutSigners_Success() public {
+ function test_SetConfigWithoutSigners() public {
uint8 F = 1;
address[] memory signers = new address[](0);
@@ -144,7 +144,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
_assertOCRConfigEquality(s_multiOCR3.latestConfigDetails(0), expectedConfig);
}
- function test_SetConfigIgnoreSigners_Success() public {
+ function test_SetConfigIgnoreSigners() public {
uint8 F = 1;
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0));
@@ -192,7 +192,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
}
}
- function test_SetMultipleConfigs_Success() public {
+ function test_SetMultipleConfigs() public {
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0));
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(1));
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(2));
@@ -321,7 +321,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
_assertOCRConfigEquality(s_multiOCR3.latestConfigDetails(ocrConfig.ocrPluginType), expectedConfig);
}
- function test_UpdateConfigTransmittersWithoutSigners_Success() public {
+ function test_UpdateConfigTransmittersWithoutSigners() public {
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0));
MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1);
@@ -380,7 +380,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
}
}
- function test_UpdateConfigSigners_Success() public {
+ function test_UpdateConfigSigners() public {
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0));
MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1);
@@ -450,7 +450,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
// Reverts
- function test_RepeatTransmitterAddress_Revert() public {
+ function test_RevertWhen_RepeatTransmitterAddress() public {
address[] memory signers = s_validSigners;
address[] memory transmitters = s_validTransmitters;
transmitters[0] = signers[0];
@@ -473,7 +473,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_RepeatSignerAddress_Revert() public {
+ function test_RevertWhen_RepeatSignerAddress() public {
address[] memory signers = s_validSigners;
address[] memory transmitters = s_validTransmitters;
signers[1] = signers[0];
@@ -496,7 +496,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_SignerCannotBeZeroAddress_Revert() public {
+ function test_RevertWhen_SignerCannotBeZeroAddress() public {
uint8 F = 1;
address[] memory signers = new address[](3 * F + 1);
address[] memory transmitters = new address[](3 * F + 1);
@@ -521,7 +521,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_TransmitterCannotBeZeroAddress_Revert() public {
+ function test_RevertWhen_TransmitterCannotBeZeroAddress() public {
uint8 F = 1;
address[] memory signers = new address[](3 * F + 1);
address[] memory transmitters = new address[](3 * F + 1);
@@ -546,7 +546,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_StaticConfigChange_Revert() public {
+ function test_RevertWhen_StaticConfigChange() public {
uint8 F = 1;
_assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0));
@@ -569,7 +569,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_FTooHigh_Revert() public {
+ function test_RevertWhen_FTooHigh() public {
address[] memory signers = new address[](0);
address[] memory transmitters = new address[](1);
@@ -589,7 +589,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_FMustBePositive_Revert() public {
+ function test_RevertWhen_FMustBePositive() public {
MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1);
ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({
ocrPluginType: 0,
@@ -608,7 +608,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_NoTransmitters_Revert() public {
+ function test_RevertWhen_NoTransmitters() public {
address[] memory signers = new address[](0);
address[] memory transmitters = new address[](0);
@@ -628,7 +628,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_TooManyTransmitters_Revert() public {
+ function test_RevertWhen_TooManyTransmitters() public {
address[] memory signers = new address[](0);
address[] memory transmitters = new address[](257);
@@ -650,7 +650,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_TooManySigners_Revert() public {
+ function test_RevertWhen_TooManySigners() public {
address[] memory signers = new address[](257);
MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1);
@@ -671,7 +671,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_MoreTransmittersThanSigners_Revert() public {
+ function test_RevertWhen_MoreTransmittersThanSigners() public {
MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1);
ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({
ocrPluginType: 0,
diff --git a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3Base.transmit.t.sol b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3Base.transmit.t.sol
index 2855b47eeea..ef75fdaf807 100644
--- a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3Base.transmit.t.sol
+++ b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3Base.transmit.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiOCR3Base} from "../../../ocr/MultiOCR3Base.sol";
import {MultiOCR3BaseSetup} from "./MultiOCR3BaseSetup.t.sol";
@@ -45,7 +45,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.setOCR3Configs(ocrConfigs);
}
- function test_TransmitSigners_gas_Success() public {
+ function test_TransmitSigners_gas() public {
vm.pauseGasMetering();
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
@@ -63,7 +63,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, rs, ss, rawVs);
}
- function test_TransmitWithoutSignatureVerification_gas_Success() public {
+ function test_TransmitWithoutSignatureVerification_gas() public {
vm.pauseGasMetering();
bytes32[2] memory reportContext = [s_configDigest3, s_configDigest3];
@@ -137,7 +137,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
}
// Reverts
- function test_ForkedChain_Revert() public {
+ function test_RevertWhen_ForkedChain() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
(bytes32[] memory rs, bytes32[] memory ss,, bytes32 rawVs) =
@@ -145,7 +145,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.setTransmitOcrPluginType(0);
- uint256 chain1 = block.chainid;
+ uint256 chain1 = uint200(block.chainid);
uint256 chain2 = chain1 + 1;
vm.chainId(chain2);
vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.ForkedChain.selector, chain1, chain2));
@@ -154,7 +154,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, rs, ss, rawVs);
}
- function test_ZeroSignatures_Revert() public {
+ function test_RevertWhen_ZeroSignatures() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
s_multiOCR3.setTransmitOcrPluginType(0);
@@ -164,7 +164,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, new bytes32[](0), new bytes32[](0), bytes32(""));
}
- function test_TooManySignatures_Revert() public {
+ function test_RevertWhen_TooManySignatures() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
// 1 signature too many
@@ -178,7 +178,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, rs, ss, rawVs);
}
- function test_InsufficientSignatures_Revert() public {
+ function test_RevertWhen_InsufficientSignatures() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
// Missing 1 signature for unique report
@@ -192,7 +192,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, rs, ss, rawVs);
}
- function test_ConfigDigestMismatch_Revert() public {
+ function test_RevertWhen_ConfigDigestMismatch() public {
bytes32 configDigest;
bytes32[2] memory reportContext = [configDigest, configDigest];
@@ -204,7 +204,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, new bytes32[](0), new bytes32[](0), rawVs);
}
- function test_SignatureOutOfRegistration_Revert() public {
+ function test_RevertWhen_SignatureOutOfRegistration() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
bytes32[] memory rs = new bytes32[](2);
@@ -217,7 +217,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, rs, ss, bytes32(""));
}
- function test_UnAuthorizedTransmitter_Revert() public {
+ function test_RevertWhen_UnAuthorizedTransmitter() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
bytes32[] memory rs = new bytes32[](2);
bytes32[] memory ss = new bytes32[](2);
@@ -228,7 +228,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, rs, ss, bytes32(""));
}
- function test_NonUniqueSignature_Revert() public {
+ function test_RevertWhen_NonUniqueSignature() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
(bytes32[] memory rs, bytes32[] memory ss, uint8[] memory vs, bytes32 rawVs) =
@@ -246,7 +246,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, rs, ss, rawVs);
}
- function test_UnauthorizedSigner_Revert() public {
+ function test_RevertWhen_UnauthorizedSigner() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
(bytes32[] memory rs, bytes32[] memory ss,, bytes32 rawVs) =
@@ -262,7 +262,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithSignatures(reportContext, REPORT, rs, ss, rawVs);
}
- function test_UnconfiguredPlugin_Revert() public {
+ function test_RevertWhen_UnconfiguredPlugin() public {
bytes32 configDigest;
bytes32[2] memory reportContext = [configDigest, configDigest];
@@ -272,7 +272,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithoutSignatures(reportContext, REPORT);
}
- function test_TransmitWithLessCalldataArgs_Revert() public {
+ function test_RevertWhen_TransmitWithLessCalldataArgs() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
s_multiOCR3.setTransmitOcrPluginType(0);
@@ -293,7 +293,7 @@ contract MultiOCR3Base_transmit is MultiOCR3BaseSetup {
s_multiOCR3.transmitWithoutSignatures(reportContext, REPORT);
}
- function test_TransmitWithExtraCalldataArgs_Revert() public {
+ function test_RevertWhen_TransmitWithExtraCalldataArgs() public {
bytes32[2] memory reportContext = [s_configDigest1, s_configDigest1];
bytes32[] memory rs = new bytes32[](2);
bytes32[] memory ss = new bytes32[](2);
diff --git a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3BaseSetup.t.sol b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3BaseSetup.t.sol
index 8418aa54cf1..d6325e27806 100644
--- a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3BaseSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base/MultiOCR3BaseSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiOCR3Base} from "../../../ocr/MultiOCR3Base.sol";
import {BaseTest} from "../../BaseTest.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.afterOC3ConfigSet.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.afterOC3ConfigSet.t.sol
index d2edb7a261a..9d610473277 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.afterOC3ConfigSet.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.afterOC3ConfigSet.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../../libraries/Internal.sol";
import {MultiOCR3Base} from "../../../ocr/MultiOCR3Base.sol";
@@ -8,7 +8,7 @@ import {OffRampHelper} from "../../helpers/OffRampHelper.sol";
import {OffRampSetup} from "./OffRampSetup.t.sol";
contract OffRamp_afterOC3ConfigSet is OffRampSetup {
- function test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() public {
+ function test_RevertWhen_afterOCR3ConfigSet_SignatureVerificationDisabled() public {
s_offRamp = new OffRampHelper(
OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.applySourceChainConfigUpdates.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.applySourceChainConfigUpdates.t.sol
index 84c522108ae..c2e1ddbce3f 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.applySourceChainConfigUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.applySourceChainConfigUpdates.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRouter} from "../../../interfaces/IRouter.sol";
@@ -10,7 +10,7 @@ import {OffRampSetup} from "./OffRampSetup.t.sol";
import {Vm} from "forge-std/Vm.sol";
contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
- function test_ApplyZeroUpdates_Success() public {
+ function test_ApplyZeroUpdates() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](0);
vm.recordLogs();
@@ -23,7 +23,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
assertEq(s_offRamp.getSourceChainSelectors().length, 0);
}
- function test_AddNewChain_Success() public {
+ function test_AddNewChain() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
@@ -46,7 +46,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
_assertSourceChainConfigEquality(s_offRamp.getSourceChainConfig(SOURCE_CHAIN_SELECTOR_1), expectedSourceChainConfig);
}
- function test_ReplaceExistingChain_Success() public {
+ function test_ReplaceExistingChain() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
@@ -77,7 +77,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
assertEq(resultSourceChainSelectors.length, 1);
}
- function test_AddMultipleChains_Success() public {
+ function test_AddMultipleChains() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](3);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
@@ -171,7 +171,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
);
}
- function test_ReplaceExistingChainOnRamp_Success() public {
+ function test_ReplaceExistingChainOnRamp() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
@@ -192,7 +192,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs);
}
- function test_allowNonOnRampUpdateAfterLaneIsUsed_success() public {
+ function test_allowNonOnRampUpdateAfterLaneIsUsed() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
@@ -233,7 +233,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
// Reverts
- function test_ZeroOnRampAddress_Revert() public {
+ function test_RevertWhen_ZeroOnRampAddress() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
@@ -250,7 +250,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs);
}
- function test_RouterAddress_Revert() public {
+ function test_RevertWhen_RouterAddress() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: IRouter(address(0)),
@@ -263,7 +263,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs);
}
- function test_ZeroSourceChainSelector_Revert() public {
+ function test_RevertWhen_ZeroSourceChainSelector() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
@@ -276,7 +276,7 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup {
s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs);
}
- function test_InvalidOnRampUpdate_Revert() public {
+ function test_RevertWhen_InvalidOnRampUpdate() public {
OffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new OffRamp.SourceChainConfigArgs[](1);
sourceChainConfigs[0] = OffRamp.SourceChainConfigArgs({
router: s_destRouter,
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.batchExecute.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.batchExecute.t.sol
index aef54612945..a170b21623c 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.batchExecute.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.batchExecute.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../../libraries/Internal.sol";
import {OffRamp} from "../../../offRamp/OffRamp.sol";
@@ -15,7 +15,7 @@ contract OffRamp_batchExecute is OffRampSetup {
s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_3, 1);
}
- function test_SingleReport_Success() public {
+ function test_SingleReport() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -37,7 +37,7 @@ contract OffRamp_batchExecute is OffRampSetup {
assertGt(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender), nonceBefore);
}
- function test_MultipleReportsSameChain_Success() public {
+ function test_MultipleReportsSameChain() public {
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](2);
Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](1);
@@ -87,7 +87,7 @@ contract OffRamp_batchExecute is OffRampSetup {
assertGt(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages1[0].sender), nonceBefore);
}
- function test_MultipleReportsDifferentChains_Success() public {
+ function test_MultipleReportsDifferentChains() public {
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](2);
Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](1);
@@ -143,7 +143,7 @@ contract OffRamp_batchExecute is OffRampSetup {
assertGt(nonceChain3, 0);
}
- function test_MultipleReportsDifferentChainsSkipCursedChain_Success() public {
+ function test_MultipleReportsDifferentChainsSkipCursedChain() public {
_setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, true);
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](2);
@@ -182,7 +182,7 @@ contract OffRamp_batchExecute is OffRampSetup {
}
}
- function test_MultipleReportsSkipDuplicate_Success() public {
+ function test_MultipleReportsSkipDuplicate() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -205,7 +205,7 @@ contract OffRamp_batchExecute is OffRampSetup {
);
}
- function test_Unhealthy_Success() public {
+ function test_Unhealthy() public {
_setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, true);
vm.expectEmit();
emit OffRamp.SkippedReportExecution(SOURCE_CHAIN_SELECTOR_1);
@@ -230,12 +230,12 @@ contract OffRamp_batchExecute is OffRampSetup {
}
// Reverts
- function test_ZeroReports_Revert() public {
+ function test_RevertWhen_ZeroReports() public {
vm.expectRevert(OffRamp.EmptyBatch.selector);
s_offRamp.batchExecute(new Internal.ExecutionReport[](0), new OffRamp.GasLimitOverride[][](1));
}
- function test_OutOfBoundsGasLimitsAccess_Revert() public {
+ function test_RevertWhen_OutOfBoundsGasLimitsAccess() public {
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](2);
Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](1);
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.ccipReceive.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.ccipReceive.t.sol
index c05d8ec476a..320193f78a2 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.ccipReceive.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.ccipReceive.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Client} from "../../../libraries/Client.sol";
import {OffRampSetup} from "./OffRampSetup.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.commit.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.commit.t.sol
index 7cfb9cd36b7..f0611f8c5fc 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.commit.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.commit.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IFeeQuoter} from "../../../interfaces/IFeeQuoter.sol";
import {IRMNRemote} from "../../../interfaces/IRMNRemote.sol";
@@ -20,7 +20,7 @@ contract OffRamp_commit is OffRampSetup {
s_latestSequenceNumber = uint64(uint256(s_configDigestCommit));
}
- function test_ReportAndPriceUpdate_Success() public {
+ function test_ReportAndPriceUpdate() public {
OffRamp.CommitReport memory commitReport = _constructCommitReport();
vm.expectEmit();
@@ -64,7 +64,7 @@ contract OffRamp_commit is OffRampSetup {
assertEq(block.timestamp, s_offRamp.getMerkleRoot(SOURCE_CHAIN_SELECTOR_1, root));
}
- function test_RootWithRMNDisabled_success() public {
+ function test_RootWithRMNDisabled() public {
// force RMN verification to fail
vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
@@ -101,7 +101,7 @@ contract OffRamp_commit is OffRampSetup {
assertEq(block.timestamp, s_offRamp.getMerkleRoot(SOURCE_CHAIN_SELECTOR_1, root));
}
- function test_StaleReportWithRoot_Success() public {
+ function test_StaleReportWithRoot() public {
uint64 maxSeq = 12;
uint224 tokenStartPrice = IFeeQuoter(s_offRamp.getDynamicConfig().feeQuoter).getTokenPrice(s_sourceFeeToken).value;
@@ -144,7 +144,7 @@ contract OffRamp_commit is OffRampSetup {
assertEq(tokenStartPrice, IFeeQuoter(s_offRamp.getDynamicConfig().feeQuoter).getTokenPrice(s_sourceFeeToken).value);
}
- function test_OnlyTokenPriceUpdates_Success() public {
+ function test_OnlyTokenPriceUpdates() public {
// force RMN verification to fail
vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
@@ -166,7 +166,7 @@ contract OffRamp_commit is OffRampSetup {
assertEq(s_latestSequenceNumber, s_offRamp.getLatestPriceSequenceNumber());
}
- function test_OnlyGasPriceUpdates_Success() public {
+ function test_OnlyGasPriceUpdates() public {
// force RMN verification to fail
vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
@@ -187,7 +187,7 @@ contract OffRamp_commit is OffRampSetup {
assertEq(s_latestSequenceNumber, s_offRamp.getLatestPriceSequenceNumber());
}
- function test_PriceSequenceNumberCleared_Success() public {
+ function test_PriceSequenceNumberCleared() public {
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0);
OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({
priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18),
@@ -236,7 +236,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, s_latestSequenceNumber);
}
- function test_ValidPriceUpdateThenStaleReportWithRoot_Success() public {
+ function test_ValidPriceUpdateThenStaleReportWithRoot() public {
uint64 maxSeq = 12;
uint224 tokenPrice1 = 4e18;
uint224 tokenPrice2 = 5e18;
@@ -282,7 +282,7 @@ contract OffRamp_commit is OffRampSetup {
// Reverts
- function test_UnauthorizedTransmitter_Revert() public {
+ function test_RevertWhen_UnauthorizedTransmitter() public {
OffRamp.CommitReport memory commitReport = _constructCommitReport();
bytes32[2] memory reportContext = [s_configDigestCommit, bytes32(uint256(s_latestSequenceNumber))];
@@ -294,7 +294,7 @@ contract OffRamp_commit is OffRampSetup {
s_offRamp.commit(reportContext, abi.encode(commitReport), rs, ss, rawVs);
}
- function test_NoConfig_Revert() public {
+ function test_RevertWhen_NoConfig() public {
_redeployOffRampWithNoOCRConfigs();
OffRamp.CommitReport memory commitReport = _constructCommitReport();
@@ -308,7 +308,7 @@ contract OffRamp_commit is OffRampSetup {
s_offRamp.commit(reportContext, abi.encode(commitReport), rs, ss, rawVs);
}
- function test_NoConfigWithOtherConfigPresent_Revert() public {
+ function test_RevertWhen_NoConfigWithOtherConfigPresent() public {
_redeployOffRampWithNoOCRConfigs();
MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1);
@@ -333,7 +333,7 @@ contract OffRamp_commit is OffRampSetup {
s_offRamp.commit(reportContext, abi.encode(commitReport), rs, ss, rawVs);
}
- function test_FailedRMNVerification_Reverts() public {
+ function test_RevertWhen_FailedRMNVerifications() public {
// force RMN verification to fail
vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes(""));
@@ -342,7 +342,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, s_latestSequenceNumber);
}
- function test_Unhealthy_Revert() public {
+ function test_RevertWhen_Unhealthy() public {
_setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, true);
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1);
roots[0] = Internal.MerkleRoot({
@@ -360,7 +360,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, s_latestSequenceNumber);
}
- function test_InvalidRootRevert() public {
+ function test_RevertWhen_InvalidRoot() public {
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1);
roots[0] = Internal.MerkleRoot({
sourceChainSelector: SOURCE_CHAIN_SELECTOR_1,
@@ -376,7 +376,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, s_latestSequenceNumber);
}
- function test_InvalidInterval_Revert() public {
+ function test_RevertWhen_InvalidInterval() public {
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1);
roots[0] = Internal.MerkleRoot({
sourceChainSelector: SOURCE_CHAIN_SELECTOR_1,
@@ -396,7 +396,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, s_latestSequenceNumber);
}
- function test_InvalidIntervalMinLargerThanMax_Revert() public {
+ function test_RevertWhen_InvalidIntervalMinLargerThanMax() public {
s_offRamp.getSourceChainConfig(SOURCE_CHAIN_SELECTOR);
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1);
roots[0] = Internal.MerkleRoot({
@@ -417,7 +417,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, s_latestSequenceNumber);
}
- function test_ZeroEpochAndRound_Revert() public {
+ function test_RevertWhen_ZeroEpochAndRound() public {
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0);
OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({
priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18),
@@ -429,7 +429,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, 0);
}
- function test_OnlyPriceUpdateStaleReport_Revert() public {
+ function test_RevertWhen_OnlyPriceUpdateStaleReport() public {
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0);
OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({
priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18),
@@ -445,7 +445,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, s_latestSequenceNumber);
}
- function test_SourceChainNotEnabled_Revert() public {
+ function test_RevertWhen_SourceChainNotEnabled() public {
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1);
roots[0] = Internal.MerkleRoot({
sourceChainSelector: 0,
@@ -462,7 +462,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, s_latestSequenceNumber);
}
- function test_RootAlreadyCommitted_Revert() public {
+ function test_RevertWhen_RootAlreadyCommitted() public {
Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1);
roots[0] = Internal.MerkleRoot({
sourceChainSelector: SOURCE_CHAIN_SELECTOR_1,
@@ -484,7 +484,7 @@ contract OffRamp_commit is OffRampSetup {
_commit(commitReport, ++s_latestSequenceNumber);
}
- function test_CommitOnRampMismatch_Revert() public {
+ function test_RevertWhen_CommitOnRampMismatch() public {
OffRamp.CommitReport memory commitReport = _constructCommitReport();
commitReport.merkleRoots[0].onRampAddress = ON_RAMP_ADDRESS_2;
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol
index d31b7939d9c..49ba54dab7e 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRMNRemote} from "../../../interfaces/IRMNRemote.sol";
@@ -10,7 +10,7 @@ import {OffRampHelper} from "../../helpers/OffRampHelper.sol";
import {OffRampSetup} from "./OffRampSetup.t.sol";
contract OffRamp_constructor is OffRampSetup {
- function test_Constructor_Success() public {
+ function test_Constructor() public {
OffRamp.StaticConfig memory staticConfig = OffRamp.StaticConfig({
chainSelector: DEST_CHAIN_SELECTOR,
gasForCallExactCheck: GAS_FOR_CALL_EXACT_CHECK,
@@ -126,7 +126,7 @@ contract OffRamp_constructor is OffRampSetup {
}
// Revert
- function test_ZeroOnRampAddress_Revert() public {
+ function test_RevertWhen_ZeroOnRampAddress() public {
uint64[] memory sourceChainSelectors = new uint64[](1);
sourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1;
@@ -153,7 +153,7 @@ contract OffRamp_constructor is OffRampSetup {
);
}
- function test_SourceChainSelector_Revert() public {
+ function test_RevertWhen_SourceChainSelector() public {
uint64[] memory sourceChainSelectors = new uint64[](1);
sourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1;
@@ -180,7 +180,7 @@ contract OffRamp_constructor is OffRampSetup {
);
}
- function test_ZeroRMNRemote_Revert() public {
+ function test_RevertWhen_ZeroRMNRemote() public {
uint64[] memory sourceChainSelectors = new uint64[](1);
sourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1;
@@ -201,7 +201,7 @@ contract OffRamp_constructor is OffRampSetup {
);
}
- function test_ZeroChainSelector_Revert() public {
+ function test_RevertWhen_ZeroChainSelector() public {
uint64[] memory sourceChainSelectors = new uint64[](1);
sourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1;
@@ -222,7 +222,7 @@ contract OffRamp_constructor is OffRampSetup {
);
}
- function test_ZeroTokenAdminRegistry_Revert() public {
+ function test_RevertWhen_ZeroTokenAdminRegistry() public {
uint64[] memory sourceChainSelectors = new uint64[](1);
sourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1;
@@ -243,7 +243,7 @@ contract OffRamp_constructor is OffRampSetup {
);
}
- function test_ZeroNonceManager_Revert() public {
+ function test_RevertWhen_ZeroNonceManager() public {
uint64[] memory sourceChainSelectors = new uint64[](1);
sourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1;
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.execute.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.execute.t.sol
index f12ca7b4609..8d9b91143bb 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.execute.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.execute.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IMessageInterceptor} from "../../../interfaces/IMessageInterceptor.sol";
@@ -18,7 +18,7 @@ contract OffRamp_execute is OffRampSetup {
}
// Asserts that execute completes
- function test_SingleReport_Success() public {
+ function test_SingleReport() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
Internal.ExecutionReport[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages);
@@ -42,7 +42,7 @@ contract OffRamp_execute is OffRampSetup {
);
}
- function test_MultipleReports_Success() public {
+ function test_MultipleReports() public {
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](2);
Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](1);
@@ -95,7 +95,7 @@ contract OffRamp_execute is OffRampSetup {
);
}
- function test_LargeBatch_Success() public {
+ function test_LargeBatch() public {
Internal.ExecutionReport[] memory reports = new Internal.ExecutionReport[](10);
for (uint64 i = 0; i < reports.length; ++i) {
Internal.Any2EVMRampMessage[] memory messages = new Internal.Any2EVMRampMessage[](3);
@@ -131,7 +131,7 @@ contract OffRamp_execute is OffRampSetup {
}
}
- function test_MultipleReportsWithPartialValidationFailures_Success() public {
+ function test_MultipleReportsWithPartialValidationFailures() public {
_enableInboundMessageInterceptor();
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](2);
@@ -197,7 +197,7 @@ contract OffRamp_execute is OffRampSetup {
// Reverts
- function test_UnauthorizedTransmitter_Revert() public {
+ function test_RevertWhen_UnauthorizedTransmitter() public {
bytes32[2] memory reportContext = [s_configDigestExec, s_configDigestExec];
Internal.Any2EVMRampMessage[] memory messages =
@@ -208,7 +208,7 @@ contract OffRamp_execute is OffRampSetup {
s_offRamp.execute(reportContext, abi.encode(reports));
}
- function test_NoConfig_Revert() public {
+ function test_RevertWhen_NoConfig() public {
_redeployOffRampWithNoOCRConfigs();
s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_1, 1);
@@ -223,7 +223,7 @@ contract OffRamp_execute is OffRampSetup {
s_offRamp.execute(reportContext, abi.encode(reports));
}
- function test_NoConfigWithOtherConfigPresent_Revert() public {
+ function test_RevertWhen_NoConfigWithOtherConfigPresent() public {
_redeployOffRampWithNoOCRConfigs();
s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_1, 1);
@@ -249,7 +249,7 @@ contract OffRamp_execute is OffRampSetup {
s_offRamp.execute(reportContext, abi.encode(reports));
}
- function test_WrongConfigWithSigners_Revert() public {
+ function test_RevertWhen_WrongConfigWithSigners() public {
_redeployOffRampWithNoOCRConfigs();
s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_1, 1);
@@ -269,14 +269,14 @@ contract OffRamp_execute is OffRampSetup {
s_offRamp.setOCR3Configs(ocrConfigs);
}
- function test_ZeroReports_Revert() public {
+ function test_RevertWhen_ZeroReports() public {
Internal.ExecutionReport[] memory reports = new Internal.ExecutionReport[](0);
vm.expectRevert(OffRamp.EmptyBatch.selector);
_execute(reports);
}
- function test_IncorrectArrayType_Revert() public {
+ function test_RevertWhen_IncorrectArrayType() public {
bytes32[2] memory reportContext = [s_configDigestExec, s_configDigestExec];
uint256[] memory wrongData = new uint256[](2);
@@ -287,7 +287,7 @@ contract OffRamp_execute is OffRampSetup {
s_offRamp.execute(reportContext, abi.encode(wrongData));
}
- function test_NonArray_Revert() public {
+ function test_RevertWhen_NonArray() public {
bytes32[2] memory reportContext = [s_configDigestExec, s_configDigestExec];
Internal.Any2EVMRampMessage[] memory messages =
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleMessage.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleMessage.t.sol
index 20b711f529e..40535ad4f7f 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleMessage.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleMessage.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IMessageInterceptor} from "../../../interfaces/IMessageInterceptor.sol";
import {IRouter} from "../../../interfaces/IRouter.sol";
@@ -106,7 +106,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup {
// Reverts
- function test_executeSingleMessage_RevertWhen_TokenHandlingError() public {
+ function test_RevertWhen_executeSingleMessageWhen_TokenHandlingError() public {
Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageWithMaybeRevertingSingleToken(1, 50);
address destPool = s_destPoolByToken[message.tokenAmounts[0].destTokenAddress];
@@ -119,7 +119,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup {
s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0));
}
- function test_executeSingleMessage_RevertWhen_ZeroGasDONExecution() public {
+ function test_RevertWhen_executeSingleMessageWhen_ZeroGasDONExecution() public {
Internal.Any2EVMRampMessage memory message =
_generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1);
message.gasLimit = 0;
@@ -129,7 +129,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup {
s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0));
}
- function test_executeSingleMessage_RevertWhen_MessageSender() public {
+ function test_RevertWhen_executeSingleMessageWhen_MessageSender() public {
vm.stopPrank();
Internal.Any2EVMRampMessage memory message =
_generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1);
@@ -137,7 +137,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup {
s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0));
}
- function test_executeSingleMessage_RevertWhen_MessageValidationError() public {
+ function test_RevertWhen_executeSingleMessageWhen_MessageValidationError() public {
vm.stopPrank();
vm.startPrank(OWNER);
_enableInboundMessageInterceptor();
@@ -154,7 +154,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup {
s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0));
}
- function test_executeSingleMessage_RevertWhen_WithFailingValidationNoRouterCall() public {
+ function test_RevertWhen_executeSingleMessageWhen_WithFailingValidationNoRouterCall() public {
vm.stopPrank();
vm.startPrank(OWNER);
_enableInboundMessageInterceptor();
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleReport.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleReport.t.sol
index 7facff30cc4..d5bb32a8a12 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleReport.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleReport.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CallWithExactGas} from "../../../../shared/call/CallWithExactGas.sol";
import {NonceManager} from "../../../NonceManager.sol";
@@ -22,7 +22,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_3, 1);
}
- function test_SingleMessageNoTokens_Success() public {
+ function test_SingleMessageNoTokens() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -59,7 +59,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
assertGt(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender), nonceBefore);
}
- function test_SingleMessageNoTokensUnordered_Success() public {
+ function test_SingleMessageNoTokensUnordered() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
messages[0].header.nonce = 0;
@@ -110,7 +110,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_SingleMessageNoTokensOtherChain_Success() public {
+ function test_SingleMessageNoTokensOtherChain() public {
Internal.Any2EVMRampMessage[] memory messagesChain1 =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
s_offRamp.executeSingleReport(
@@ -133,7 +133,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
assertEq(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messagesChain1[0].sender), nonceChain1);
}
- function test_ReceiverError_Success() public {
+ function test_ReceiverError() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -165,7 +165,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
assertEq(uint64(1), s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, abi.encode(OWNER)));
}
- function test_SkippedIncorrectNonce_Success() public {
+ function test_SkippedIncorrectNonce() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -182,7 +182,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_SkippedIncorrectNonceStillExecutes_Success() public {
+ function test_SkippedIncorrectNonceStillExecutes() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -206,7 +206,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test__execute_SkippedAlreadyExecutedMessage_Success() public {
+ function test__execute_SkippedAlreadyExecutedMessage() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -231,7 +231,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test__execute_SkippedAlreadyExecutedMessageUnordered_Success() public {
+ function test__execute_SkippedAlreadyExecutedMessageUnordered() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
messages[0].header.nonce = 0;
@@ -260,7 +260,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
// Send a message to a contract that does not implement the CCIPReceiver interface
// This should execute successfully.
- function test_SingleMessageToNonCCIPReceiver_Success() public {
+ function test_SingleMessageToNonCCIPReceiver() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true);
@@ -337,7 +337,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_TwoMessagesWithTokensAndGE_Success() public {
+ function test_TwoMessagesWithTokensAndGE() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
// Set message 1 to use another receiver to simulate more fair gas costs
@@ -456,7 +456,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_WithCurseOnAnotherSourceChain_Success() public {
+ function test_WithCurseOnAnotherSourceChain() public {
_setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_2, true);
s_offRamp.executeSingleReport(
_generateReportFromMessages(
@@ -466,7 +466,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_Unhealthy_Success() public {
+ function test_Unhealthy() public {
_setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, true);
vm.expectEmit();
@@ -492,7 +492,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
// Reverts
- function test_MismatchingDestChainSelector_Revert() public {
+ function test_RevertWhen_MismatchingDestChainSelector() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3);
messages[0].header.destChainSelector = DEST_CHAIN_SELECTOR + 1;
@@ -505,7 +505,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
s_offRamp.executeSingleReport(executionReport, new OffRamp.GasLimitOverride[](0));
}
- function test_UnhealthySingleChainCurse_Revert() public {
+ function test_RevertWhen_UnhealthySingleChainCurse() public {
_setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, true);
vm.expectEmit();
emit OffRamp.SkippedReportExecution(SOURCE_CHAIN_SELECTOR_1);
@@ -527,7 +527,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
_assertNoEmit(OffRamp.SkippedReportExecution.selector);
}
- function test_UnexpectedTokenData_Revert() public {
+ function test_RevertWhen_UnexpectedTokenData() public {
Internal.ExecutionReport memory report = _generateReportFromMessages(
SOURCE_CHAIN_SELECTOR_1, _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)
);
@@ -538,7 +538,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0));
}
- function test_EmptyReport_Revert() public {
+ function test_RevertWhen_EmptyReport() public {
vm.expectRevert(abi.encodeWithSelector(OffRamp.EmptyReport.selector, SOURCE_CHAIN_SELECTOR_1));
s_offRamp.executeSingleReport(
@@ -553,7 +553,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_RootNotCommitted_Revert() public {
+ function test_RevertWhen_RootNotCommitted() public {
s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_1, 0);
vm.expectRevert(abi.encodeWithSelector(OffRamp.RootNotCommitted.selector, SOURCE_CHAIN_SELECTOR_1));
@@ -564,7 +564,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_ManualExecutionNotYetEnabled_Revert() public {
+ function test_RevertWhen_ManualExecutionNotYetEnabled() public {
s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_1, BLOCK_TIME);
vm.expectRevert(abi.encodeWithSelector(OffRamp.ManualExecutionNotYetEnabled.selector, SOURCE_CHAIN_SELECTOR_1));
@@ -576,7 +576,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_NonExistingSourceChain_Revert() public {
+ function test_RevertWhen_NonExistingSourceChain() public {
uint64 newSourceChainSelector = SOURCE_CHAIN_SELECTOR_1 + 1;
bytes memory newOnRamp = abi.encode(ON_RAMP_ADDRESS, 1);
@@ -588,7 +588,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_DisabledSourceChain_Revert() public {
+ function test_RevertWhen_DisabledSourceChain() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2);
@@ -598,7 +598,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_TokenDataMismatch_Revert() public {
+ function test_RevertWhen_TokenDataMismatch() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
Internal.ExecutionReport memory report = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages);
@@ -613,7 +613,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0));
}
- function test_RouterYULCall_Revert() public {
+ function test_RevertWhen_RouterYULCall() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -636,7 +636,7 @@ contract OffRamp_executeSingleReport is OffRampSetup {
);
}
- function test_RetryFailedMessageWithoutManualExecution_Revert() public {
+ function test_RevertWhen_RetryFailedMessageWithoutManualExecution() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.getExecutionState.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.getExecutionState.t.sol
index ac9cfe86cd9..96261f5f0b3 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.getExecutionState.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.getExecutionState.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../../libraries/Internal.sol";
import {OffRampSetup} from "./OffRampSetup.t.sol";
@@ -32,7 +32,7 @@ contract OffRamp_getExecutionState is OffRampSetup {
}
}
- function test_GetExecutionState_Success() public {
+ function test_GetExecutionState() public {
s_offRamp.setExecutionStateHelper(SOURCE_CHAIN_SELECTOR_1, 0, Internal.MessageExecutionState.FAILURE);
assertEq(s_offRamp.getExecutionStateBitMap(SOURCE_CHAIN_SELECTOR_1, 0), 3);
@@ -72,7 +72,7 @@ contract OffRamp_getExecutionState is OffRampSetup {
);
}
- function test_GetDifferentChainExecutionState_Success() public {
+ function test_GetDifferentChainExecutionState() public {
s_offRamp.setExecutionStateHelper(SOURCE_CHAIN_SELECTOR_1, 0, Internal.MessageExecutionState.FAILURE);
assertEq(s_offRamp.getExecutionStateBitMap(SOURCE_CHAIN_SELECTOR_1, 0), 3);
assertEq(s_offRamp.getExecutionStateBitMap(SOURCE_CHAIN_SELECTOR_1 + 1, 0), 0);
@@ -119,7 +119,7 @@ contract OffRamp_getExecutionState is OffRampSetup {
);
}
- function test_FillExecutionState_Success() public {
+ function test_FillExecutionState() public {
for (uint64 i = 0; i < 384; ++i) {
s_offRamp.setExecutionStateHelper(SOURCE_CHAIN_SELECTOR_1, i, Internal.MessageExecutionState.FAILURE);
}
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.manuallyExecute.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.manuallyExecute.t.sol
index 0422053bdd7..d2406a0e40b 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.manuallyExecute.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.manuallyExecute.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../../libraries/Internal.sol";
import {MultiOCR3Base} from "../../../ocr/MultiOCR3Base.sol";
@@ -23,7 +23,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_3, 1);
}
- function test_manuallyExecute_Success() public {
+ function test_manuallyExecute() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
messages[0].receiver = address(s_reverting_receiver);
@@ -49,7 +49,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
);
}
- function test_manuallyExecute_WithGasOverride_Success() public {
+ function test_manuallyExecute_WithGasOverride() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
messages[0].receiver = address(s_reverting_receiver);
@@ -75,7 +75,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
);
}
- function test_manuallyExecute_DoesNotRevertIfUntouched_Success() public {
+ function test_manuallyExecute_DoesNotRevertIfUntouched() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
messages[0].receiver = address(s_reverting_receiver);
@@ -108,7 +108,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
);
}
- function test_manuallyExecute_WithMultiReportGasOverride_Success() public {
+ function test_manuallyExecute_WithMultiReportGasOverride() public {
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](3);
Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](2);
@@ -174,7 +174,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
}
}
- function test_manuallyExecute_WithPartialMessages_Success() public {
+ function test_manuallyExecute_WithPartialMessages() public {
Internal.Any2EVMRampMessage[] memory messages = new Internal.Any2EVMRampMessage[](3);
for (uint64 i = 0; i < 3; ++i) {
@@ -246,7 +246,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
);
}
- function test_manuallyExecute_LowGasLimit_Success() public {
+ function test_manuallyExecute_LowGasLimit() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
messages[0].gasLimit = 1;
@@ -287,12 +287,12 @@ contract OffRamp_manuallyExecute is OffRampSetup {
// Reverts
- function test_manuallyExecute_ForkedChain_Revert() public {
+ function test_RevertWhen_manuallyExecute_ForkedChain() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
Internal.ExecutionReport[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages);
- uint256 chain1 = block.chainid;
+ uint256 chain1 = uint200(block.chainid);
uint256 chain2 = chain1 + 1;
vm.chainId(chain2);
vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.ForkedChain.selector, chain1, chain2));
@@ -303,7 +303,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.manuallyExecute(reports, gasLimitOverrides);
}
- function test_ManualExecGasLimitMismatchSingleReport_Revert() public {
+ function test_RevertWhen_ManualExecGasLimitMismatchSingleReport() public {
Internal.Any2EVMRampMessage[] memory messages = new Internal.Any2EVMRampMessage[](2);
messages[0] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1);
messages[1] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 2);
@@ -333,7 +333,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.manuallyExecute(reports, gasLimitOverrides);
}
- function test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() public {
+ function test_RevertWhen_manuallyExecute_GasLimitMismatchMultipleReports() public {
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](2);
Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](1);
@@ -376,7 +376,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.manuallyExecute(reports, gasLimitOverrides);
}
- function test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() public {
+ function test_RevertWhen_manuallyExecute_InvalidReceiverExecutionGasLimit() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -395,7 +395,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides);
}
- function test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() public {
+ function test_RevertWhen_manuallyExecute_DestinationGasAmountCountMismatch() public {
uint256[] memory amounts = new uint256[](2);
amounts[0] = 1000;
amounts[1] = 1000;
@@ -418,7 +418,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides);
}
- function test_manuallyExecute_InvalidTokenGasOverride_Revert() public {
+ function test_RevertWhen_manuallyExecute_InvalidTokenGasOverride() public {
uint256[] memory amounts = new uint256[](2);
amounts[0] = 1000;
amounts[1] = 1000;
@@ -444,7 +444,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides);
}
- function test_manuallyExecute_FailedTx_Revert() public {
+ function test_RevertWhen_manuallyExecute_FailedTx() public {
Internal.Any2EVMRampMessage[] memory messages =
_generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1);
@@ -473,7 +473,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides);
}
- function test_manuallyExecute_ReentrancyFails_Success() public {
+ function test_manuallyExecute_ReentrancyFails() public {
uint256 tokenAmount = 1e9;
IERC20 tokenToAbuse = IERC20(s_destFeeToken);
@@ -531,7 +531,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
assertEq(tokenToAbuse.balanceOf(address(receiver)), balancePre + tokenAmount);
}
- function test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() public {
+ function test_RevertWhen_manuallyExecute_MultipleReportsWithSingleCursedLane() public {
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](3);
Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](2);
@@ -562,7 +562,7 @@ contract OffRamp_manuallyExecute is OffRampSetup {
s_offRamp.manuallyExecute(reports, gasLimitOverrides);
}
- function test_manuallyExecute_SourceChainSelectorMismatch_Revert() public {
+ function test_RevertWhen_manuallyExecute_SourceChainSelectorMismatch() public {
Internal.Any2EVMRampMessage[] memory messages1 = new Internal.Any2EVMRampMessage[](1);
Internal.Any2EVMRampMessage[] memory messages2 = new Internal.Any2EVMRampMessage[](1);
messages1[0] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1);
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.releaseOrMintSingleToken.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.releaseOrMintSingleToken.t.sol
index f35db67abf6..c30cdeb4d93 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.releaseOrMintSingleToken.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.releaseOrMintSingleToken.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITokenAdminRegistry} from "../../../interfaces/ITokenAdminRegistry.sol";
@@ -17,7 +17,7 @@ contract OffRamp_releaseOrMintSingleToken is OffRampSetup {
_setupMultipleOffRamps();
}
- function test__releaseOrMintSingleToken_Success() public {
+ function test__releaseOrMintSingleToken() public {
uint256 amount = 123123;
address token = s_sourceTokens[0];
bytes memory originalSender = abi.encode(OWNER);
@@ -56,7 +56,7 @@ contract OffRamp_releaseOrMintSingleToken is OffRampSetup {
assertEq(startingBalance + amount, dstToken1.balanceOf(OWNER));
}
- function test_releaseOrMintToken_InvalidDataLength_Revert() public {
+ function test_RevertWhen_releaseOrMintToken_InvalidDataLength() public {
uint256 amount = 123123;
address token = s_sourceTokens[0];
@@ -78,7 +78,7 @@ contract OffRamp_releaseOrMintSingleToken is OffRampSetup {
s_offRamp.releaseOrMintSingleToken(tokenAmount, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR, "");
}
- function test_releaseOrMintToken_RevertWhen_TokenHandlingError_BalanceOf() public {
+ function test_RevertWhen_releaseOrMintTokenWhen_TokenHandlingError_BalanceOf() public {
uint256 amount = 123123;
address token = s_sourceTokens[0];
address destTokenAddress = s_destTokenBySourceToken[token];
@@ -101,7 +101,7 @@ contract OffRamp_releaseOrMintSingleToken is OffRampSetup {
s_offRamp.releaseOrMintSingleToken(tokenAmount, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR, "");
}
- function test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() public {
+ function test_RevertWhen_releaseOrMintToken_ReleaseOrMintBalanceMismatch() public {
uint256 amount = 123123;
address token = s_sourceTokens[0];
uint256 mockedStaticBalance = 50000;
@@ -129,7 +129,7 @@ contract OffRamp_releaseOrMintSingleToken is OffRampSetup {
s_offRamp.releaseOrMintSingleToken(tokenAmount, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR, "");
}
- function test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() public {
+ function test_RevertWhen_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool() public {
uint256 amount = 123123;
address token = s_sourceTokens[0];
uint256 mockedStaticBalance = 50000;
@@ -154,7 +154,7 @@ contract OffRamp_releaseOrMintSingleToken is OffRampSetup {
);
}
- function test__releaseOrMintSingleToken_NotACompatiblePool_Revert() public {
+ function test_RevertWhen__releaseOrMintSingleToken_NotACompatiblePool() public {
uint256 amount = 123123;
address token = s_sourceTokens[0];
address destToken = s_destTokenBySourceToken[token];
@@ -197,7 +197,7 @@ contract OffRamp_releaseOrMintSingleToken is OffRampSetup {
s_offRamp.releaseOrMintSingleToken(tokenAmount, originalSender, OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData);
}
- function test_releaseOrMintSingleToken_RevertWhen_TokenHandlingError_transfer() public {
+ function test_RevertWhen_releaseOrMintSingleTokenWhen_TokenHandlingError_transfer() public {
address receiver = makeAddr("receiver");
uint256 amount = 123123;
address token = s_sourceTokens[0];
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.releaseOrMintTokens.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.releaseOrMintTokens.t.sol
index d2636ee08c8..07cf730c9d6 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.releaseOrMintTokens.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.releaseOrMintTokens.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {CallWithExactGas} from "../../../../shared/call/CallWithExactGas.sol";
import {Client} from "../../../libraries/Client.sol";
@@ -118,7 +118,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup {
// Revert
- function test_releaseOrMintTokens_RevertWhen_TokenHandlingError() public {
+ function test_RevertWhen_releaseOrMintTokensWhen_TokenHandlingError() public {
Client.EVMTokenAmount[] memory srcTokenAmounts = _getCastedSourceEVMTokenAmountsWithZeroAmounts();
bytes memory unknownError = bytes("unknown error");
@@ -138,7 +138,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup {
);
}
- function test_releaseOrMintTokens_RevertWhenInvalidDataLengthReturnData() public {
+ function test_RevertWhen_releaseOrMintTokensWhenInvalidDataLengthReturnData() public {
uint256 amount = 100;
Client.EVMTokenAmount[] memory srcTokenAmounts = _getCastedSourceEVMTokenAmountsWithZeroAmounts();
srcTokenAmounts[0].amount = amount;
@@ -172,7 +172,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup {
);
}
- function test_releaseOrMintTokens_RevertWhen_PoolIsNotAPool() public {
+ function test_RevertWhen_releaseOrMintTokensWhen_PoolIsNotAPool() public {
// The offRamp is a contract, but not a pool
address fakePoolAddress = address(s_offRamp);
@@ -191,7 +191,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup {
);
}
- function test_releaseOrMintTokens_RevertWhenPoolDoesNotSupportDest() public {
+ function test_RevertWhen_releaseOrMintTokensWhenPoolDoesNotSupportDest() public {
Client.EVMTokenAmount[] memory srcTokenAmounts = _getCastedSourceEVMTokenAmountsWithZeroAmounts();
uint256 amount1 = 100;
srcTokenAmounts[0].amount = amount1;
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.setDynamicConfig.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.setDynamicConfig.t.sol
index 384d9b446aa..93857ecfc07 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.setDynamicConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.setDynamicConfig.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {OffRamp} from "../../../offRamp/OffRamp.sol";
import {OffRampSetup} from "./OffRampSetup.t.sol";
contract OffRamp_setDynamicConfig is OffRampSetup {
- function test_SetDynamicConfig_Success() public {
+ function test_SetDynamicConfig() public {
OffRamp.DynamicConfig memory dynamicConfig = _generateDynamicOffRampConfig(address(s_feeQuoter));
vm.expectEmit();
@@ -18,7 +18,7 @@ contract OffRamp_setDynamicConfig is OffRampSetup {
_assertSameConfig(dynamicConfig, newConfig);
}
- function test_SetDynamicConfigWithInterceptor_Success() public {
+ function test_SetDynamicConfigWithInterceptor() public {
OffRamp.DynamicConfig memory dynamicConfig = _generateDynamicOffRampConfig(address(s_feeQuoter));
dynamicConfig.messageInterceptor = address(s_inboundMessageInterceptor);
@@ -33,7 +33,7 @@ contract OffRamp_setDynamicConfig is OffRampSetup {
// Reverts
- function test_NonOwner_Revert() public {
+ function test_RevertWhen_NonOwner() public {
vm.startPrank(STRANGER);
OffRamp.DynamicConfig memory dynamicConfig = _generateDynamicOffRampConfig(address(s_feeQuoter));
@@ -42,7 +42,7 @@ contract OffRamp_setDynamicConfig is OffRampSetup {
s_offRamp.setDynamicConfig(dynamicConfig);
}
- function test_FeeQuoterZeroAddress_Revert() public {
+ function test_RevertWhen_FeeQuoterZeroAddress() public {
OffRamp.DynamicConfig memory dynamicConfig = _generateDynamicOffRampConfig(address(0));
vm.expectRevert(OffRamp.ZeroAddressNotAllowed.selector);
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.trialExecute.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.trialExecute.t.sol
index 807cea5e268..1acb4c4ee0a 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.trialExecute.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.trialExecute.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../../libraries/Internal.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampSetup.t.sol
index f8b70ebf283..daf496c9d75 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IAny2EVMMessageReceiver} from "../../../interfaces/IAny2EVMMessageReceiver.sol";
import {IRMNRemote} from "../../../interfaces/IRMNRemote.sol";
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.applyDestChainConfigUpdates.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.applyDestChainConfigUpdates.t.sol
index 2b99fd423be..ff385104f9b 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.applyDestChainConfigUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.applyDestChainConfigUpdates.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRouter} from "../../../interfaces/IRouter.sol";
@@ -7,7 +7,7 @@ import {OnRamp} from "../../../onRamp/OnRamp.sol";
import {OnRampSetup} from "./OnRampSetup.t.sol";
contract OnRamp_applyDestChainConfigUpdates is OnRampSetup {
- function test_ApplyDestChainConfigUpdates_Success() external {
+ function test_ApplyDestChainConfigUpdates() external {
OnRamp.DestChainConfigArgs[] memory configArgs = new OnRamp.DestChainConfigArgs[](1);
configArgs[0].destChainSelector = DEST_CHAIN_SELECTOR;
@@ -53,7 +53,7 @@ contract OnRamp_applyDestChainConfigUpdates is OnRampSetup {
assertEq(numLogs, vm.getRecordedLogs().length); // indicates no changes made
}
- function test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() external {
+ function test_RevertWhen_ApplyDestChainConfigUpdates_WithInvalidChainSelector() external {
OnRamp.DestChainConfigArgs[] memory configArgs = new OnRamp.DestChainConfigArgs[](1);
configArgs[0].destChainSelector = 0; // invalid
vm.expectRevert(abi.encodeWithSelector(OnRamp.InvalidDestChainConfig.selector, 0));
@@ -62,7 +62,7 @@ contract OnRamp_applyDestChainConfigUpdates is OnRampSetup {
}
contract OnRamp_applyAllowlistUpdates is OnRampSetup {
- function test_applyAllowlistUpdates_Success() public {
+ function test_applyAllowlistUpdates() public {
OnRamp.DestChainConfigArgs[] memory configArgs = new OnRamp.DestChainConfigArgs[](2);
configArgs[0] = OnRamp.DestChainConfigArgs({
destChainSelector: DEST_CHAIN_SELECTOR,
@@ -162,7 +162,7 @@ contract OnRamp_applyAllowlistUpdates is OnRampSetup {
assertTrue(isActive);
}
- function test_applyAllowlistUpdates_Revert() public {
+ function test_RevertWhen_applyAllowlistUpdates() public {
OnRamp.DestChainConfigArgs[] memory configArgs = new OnRamp.DestChainConfigArgs[](2);
configArgs[0] = OnRamp.DestChainConfigArgs({
destChainSelector: DEST_CHAIN_SELECTOR,
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.constructor.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.constructor.t.sol
index 1e31a2a1377..70153562e54 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.constructor.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRMNRemote} from "../../../interfaces/IRMNRemote.sol";
import {IRouter} from "../../../interfaces/IRouter.sol";
@@ -10,7 +10,7 @@ import {OnRampHelper} from "../../helpers/OnRampHelper.sol";
import {OnRampSetup} from "./OnRampSetup.t.sol";
contract OnRamp_constructor is OnRampSetup {
- function test_Constructor_Success() public {
+ function test_Constructor() public {
OnRamp.StaticConfig memory staticConfig = OnRamp.StaticConfig({
chainSelector: SOURCE_CHAIN_SELECTOR,
rmnRemote: s_mockRMNRemote,
@@ -41,7 +41,7 @@ contract OnRamp_constructor is OnRampSetup {
assertEq(1, s_onRamp.getExpectedNextSequenceNumber(DEST_CHAIN_SELECTOR));
}
- function test_Constructor_EnableAllowList_ForwardFromRouter_Reverts() public {
+ function test_RevertWhen_Constructor_EnableAllowList_ForwardFromRouter() public {
OnRamp.StaticConfig memory staticConfig = OnRamp.StaticConfig({
chainSelector: SOURCE_CHAIN_SELECTOR,
rmnRemote: s_mockRMNRemote,
@@ -74,7 +74,7 @@ contract OnRamp_constructor is OnRampSetup {
tempOnRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
}
- function test_Constructor_InvalidConfigChainSelectorEqZero_Revert() public {
+ function test_RevertWhen_Constructor_InvalidConfigChainSelectorEqZero() public {
vm.expectRevert(OnRamp.InvalidConfig.selector);
new OnRampHelper(
OnRamp.StaticConfig({
@@ -88,7 +88,7 @@ contract OnRamp_constructor is OnRampSetup {
);
}
- function test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() public {
+ function test_RevertWhen_Constructor_InvalidConfigRMNProxyEqAddressZero() public {
vm.expectRevert(OnRamp.InvalidConfig.selector);
s_onRamp = new OnRampHelper(
OnRamp.StaticConfig({
@@ -102,7 +102,7 @@ contract OnRamp_constructor is OnRampSetup {
);
}
- function test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() public {
+ function test_RevertWhen_Constructor_InvalidConfigNonceManagerEqAddressZero() public {
vm.expectRevert(OnRamp.InvalidConfig.selector);
new OnRampHelper(
OnRamp.StaticConfig({
@@ -116,7 +116,7 @@ contract OnRamp_constructor is OnRampSetup {
);
}
- function test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() public {
+ function test_RevertWhen_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero() public {
vm.expectRevert(OnRamp.InvalidConfig.selector);
new OnRampHelper(
OnRamp.StaticConfig({
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.forwardFromRouter.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.forwardFromRouter.t.sol
index 7f53f9c5b3c..8168cff7e1c 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.forwardFromRouter.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.forwardFromRouter.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IMessageInterceptor} from "../../../interfaces/IMessageInterceptor.sol";
import {IRouter} from "../../../interfaces/IRouter.sol";
@@ -68,7 +68,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
- function test_ForwardFromRouter_Success_ConfigurableSourceRouter() public {
+ function test_ForwardFromRouter_ConfigurableSourceRouter() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.extraArgs = Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: GAS_LIMIT * 2}));
uint256 feeAmount = 1234567890;
@@ -117,7 +117,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
- function test_ForwardFromRouter_Success() public {
+ function test_ForwardFromRouter() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
uint256 feeAmount = 1234567890;
@@ -129,7 +129,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
- function test_ForwardFromRouterExtraArgsV2_Success() public {
+ function test_ForwardFromRouterExtraArgsV2() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.extraArgs = abi.encodeWithSelector(
Client.EVM_EXTRA_ARGS_V2_TAG, Client.EVMExtraArgsV2({gasLimit: GAS_LIMIT * 2, allowOutOfOrderExecution: false})
@@ -143,7 +143,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
- function test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() public {
+ function test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.extraArgs = abi.encodeWithSelector(
Client.EVM_EXTRA_ARGS_V2_TAG, Client.EVMExtraArgsV2({gasLimit: GAS_LIMIT * 2, allowOutOfOrderExecution: true})
@@ -157,7 +157,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
- function test_ShouldIncrementSeqNumAndNonce_Success() public {
+ function test_ShouldIncrementSeqNumAndNonce() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
for (uint64 i = 1; i < 4; ++i) {
@@ -176,7 +176,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
}
}
- function test_ShouldIncrementNonceOnlyOnOrdered_Success() public {
+ function test_ShouldIncrementNonceOnlyOnOrdered() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.extraArgs = abi.encodeWithSelector(
Client.EVM_EXTRA_ARGS_V2_TAG, Client.EVMExtraArgsV2({gasLimit: GAS_LIMIT * 2, allowOutOfOrderExecution: true})
@@ -212,32 +212,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_onRamp)), feeAmount);
}
- function test_ShouldStoreNonLinkFees() public {
- Client.EVM2AnyMessage memory message = _generateEmptyMessage();
- message.feeToken = s_sourceTokens[1];
-
- uint256 feeAmount = 1234567890;
- IERC20(s_sourceTokens[1]).transferFrom(OWNER, address(s_onRamp), feeAmount);
-
- // Calculate conversion done by prices contract
- uint256 feeTokenPrice = s_feeQuoter.getTokenPrice(s_sourceTokens[1]).value;
- uint256 linkTokenPrice = s_feeQuoter.getTokenPrice(s_sourceFeeToken).value;
- uint256 conversionRate = (feeTokenPrice * 1e18) / linkTokenPrice;
- uint256 expectedJuels = (feeAmount * conversionRate) / 1e18;
-
- vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, 1, _messageToEvent(message, 1, 1, feeAmount, expectedJuels, OWNER));
-
- s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
-
- assertEq(IERC20(s_sourceTokens[1]).balanceOf(address(s_onRamp)), feeAmount);
- }
-
// Make sure any valid sender, receiver and feeAmount can be handled.
- // @TODO Temporarily setting lower fuzz run as 256 triggers snapshot gas off by 1 error.
- // https://github.com/foundry-rs/foundry/issues/5689
- /// forge-dynamicConfig: default.fuzz.runs = 32
- /// forge-dynamicConfig: ccip.fuzz.runs = 32
function testFuzz_ForwardFromRouter_Success(address originalSender, address receiver, uint96 feeTokenAmount) public {
// To avoid RouterMustSetOriginalSender
vm.assume(originalSender != address(0));
@@ -250,14 +225,13 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
destinationChainSelectors[0] = uint64(DEST_CHAIN_SELECTOR);
address[] memory addAllowedList = new address[](1);
addAllowedList[0] = originalSender;
- OnRamp.AllowlistConfigArgs memory allowlistConfigArgs = OnRamp.AllowlistConfigArgs({
+ OnRamp.AllowlistConfigArgs[] memory applyAllowlistConfigArgsItems = new OnRamp.AllowlistConfigArgs[](1);
+ applyAllowlistConfigArgsItems[0] = OnRamp.AllowlistConfigArgs({
allowlistEnabled: true,
destChainSelector: DEST_CHAIN_SELECTOR,
addedAllowlistedSenders: addAllowedList,
removedAllowlistedSenders: new address[](0)
});
- OnRamp.AllowlistConfigArgs[] memory applyAllowlistConfigArgsItems = new OnRamp.AllowlistConfigArgs[](1);
- applyAllowlistConfigArgsItems[0] = allowlistConfigArgs;
s_onRamp.applyAllowlistUpdates(applyAllowlistConfigArgsItems);
vm.stopPrank();
@@ -271,9 +245,6 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
Internal.EVM2AnyRampMessage memory expectedEvent = _messageToEvent(message, 1, 1, feeTokenAmount, originalSender);
- vm.expectEmit();
- emit OnRamp.CCIPMessageSent(DEST_CHAIN_SELECTOR, expectedEvent.header.sequenceNumber, expectedEvent);
-
// Assert the message Id is correct
assertEq(
expectedEvent.header.messageId,
@@ -281,7 +252,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
);
}
- function test_forwardFromRouter_WithInterception_Success() public {
+ function test_forwardFromRouter_WithInterception() public {
_enableOutboundMessageInterceptor();
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
@@ -301,7 +272,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
// Reverts
- function test_Paused_Revert() public {
+ function test_RevertWhen_Paused() public {
// We pause by disabling the whitelist
vm.stopPrank();
vm.startPrank(OWNER);
@@ -310,7 +281,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, _generateEmptyMessage(), 0, OWNER);
}
- function test_InvalidExtraArgsTag_Revert() public {
+ function test_RevertWhen_InvalidExtraArgsTag() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.extraArgs = bytes("bad args");
@@ -319,26 +290,26 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
}
- function test_Permissions_Revert() public {
+ function test_RevertWhen_Permissions() public {
vm.stopPrank();
vm.startPrank(OWNER);
vm.expectRevert(OnRamp.MustBeCalledByRouter.selector);
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, _generateEmptyMessage(), 0, OWNER);
}
- function test_OriginalSender_Revert() public {
+ function test_RevertWhen_OriginalSender() public {
vm.expectRevert(OnRamp.RouterMustSetOriginalSender.selector);
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, _generateEmptyMessage(), 0, address(0));
}
- function test_UnAllowedOriginalSender_Revert() public {
+ function test_RevertWhen_UnAllowedOriginalSender() public {
vm.stopPrank();
vm.startPrank(STRANGER);
vm.expectRevert(abi.encodeWithSelector(OnRamp.SenderNotAllowed.selector, STRANGER));
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, _generateEmptyMessage(), 0, STRANGER);
}
- function test_MessageInterceptionError_Revert() public {
+ function test_RevertWhen_MessageInterceptionError() public {
_enableOutboundMessageInterceptor();
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
@@ -357,7 +328,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
}
- function test_MultiCannotSendZeroTokens_Revert() public {
+ function test_RevertWhen_MultiCannotSendZeroTokens() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.tokenAmounts = new Client.EVMTokenAmount[](1);
message.tokenAmounts[0].amount = 0;
@@ -366,7 +337,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
}
- function test_UnsupportedToken_Revert() public {
+ function test_RevertWhen_UnsupportedToken() public {
address wrongToken = address(1);
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
@@ -389,7 +360,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
}
- function test_forwardFromRouter_UnsupportedToken_Revert() public {
+ function test_RevertWhen_forwardFromRouter_UnsupportedToken() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.tokenAmounts = new Client.EVMTokenAmount[](1);
message.tokenAmounts[0].amount = 1;
@@ -400,7 +371,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
}
- function test_MesssageFeeTooHigh_Revert() public {
+ function test_RevertWhen_MessageFeeTooHigh() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
vm.expectRevert(
@@ -410,7 +381,7 @@ contract OnRamp_forwardFromRouter is OnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, MAX_MSG_FEES_JUELS + 1, OWNER);
}
- function test_SourceTokenDataTooLarge_Revert() public {
+ function test_RevertWhen_SourceTokenDataTooLarge() public {
address sourceETH = s_sourceTokens[1];
vm.stopPrank();
vm.startPrank(OWNER);
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getFee.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getFee.t.sol
index 63a4c0c322e..33e4a90cd5d 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getFee.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getFee.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FeeQuoter} from "../../../FeeQuoter.sol";
import {Client} from "../../../libraries/Client.sol";
@@ -10,7 +10,7 @@ import {OnRampSetup} from "./OnRampSetup.t.sol";
contract OnRamp_getFee is OnRampSetup {
using USDPriceWith18Decimals for uint224;
- function test_EmptyMessage_Success() public view {
+ function test_EmptyMessage() public view {
address[2] memory testTokens = [s_sourceFeeToken, s_sourceRouter.getWrappedNative()];
uint224[2] memory feeTokenPrices = [s_feeTokenPrice, s_wrappedTokenPrice];
@@ -25,7 +25,7 @@ contract OnRamp_getFee is OnRampSetup {
}
}
- function test_SingleTokenMessage_Success() public view {
+ function test_SingleTokenMessage() public view {
address[2] memory testTokens = [s_sourceFeeToken, s_sourceRouter.getWrappedNative()];
uint224[2] memory feeTokenPrices = [s_feeTokenPrice, s_wrappedTokenPrice];
@@ -41,7 +41,7 @@ contract OnRamp_getFee is OnRampSetup {
}
}
- function test_GetFeeOfZeroForTokenMessage_Success() public {
+ function test_GetFeeOfZeroForTokenMessage() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
uint256 feeAmount = s_onRamp.getFee(DEST_CHAIN_SELECTOR, message);
@@ -63,13 +63,13 @@ contract OnRamp_getFee is OnRampSetup {
// Reverts
- function test_Unhealthy_Revert() public {
+ function test_RevertWhen_Unhealthy() public {
_setMockRMNChainCurse(DEST_CHAIN_SELECTOR, true);
vm.expectRevert(abi.encodeWithSelector(OnRamp.CursedByRMN.selector, DEST_CHAIN_SELECTOR));
s_onRamp.getFee(DEST_CHAIN_SELECTOR, _generateEmptyMessage());
}
- function test_EnforceOutOfOrder_Revert() public {
+ function test_RevertWhen_EnforceOutOfOrder() public {
// Update dynamic config to enforce allowOutOfOrderExecution = true.
vm.stopPrank();
vm.startPrank(OWNER);
@@ -87,7 +87,7 @@ contract OnRamp_getFee is OnRampSetup {
s_onRamp.getFee(DEST_CHAIN_SELECTOR, message);
}
- function test_NotAFeeTokenButPricedToken_Revert() public {
+ function test_RevertWhen_NotAFeeTokenButPricedToken() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.feeToken = s_sourceTokens[1];
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getSupportedTokens.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getSupportedTokens.t.sol
index c04f3cf3d51..551b36a67f7 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getSupportedTokens.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getSupportedTokens.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {OnRamp} from "../../../onRamp/OnRamp.sol";
import {OnRampSetup} from "./OnRampSetup.t.sol";
contract OnRamp_getSupportedTokens is OnRampSetup {
- function test_GetSupportedTokens_Revert() public {
+ function test_RevertWhen_GetSupportedTokens() public {
vm.expectRevert(OnRamp.GetSupportedTokensFunctionalityRemovedCheckAdminRegistry.selector);
s_onRamp.getSupportedTokens(DEST_CHAIN_SELECTOR);
}
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getTokenPool.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getTokenPool.t.sol
index 8612ce86e36..2b3856eea5f 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getTokenPool.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.getTokenPool.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {OnRampSetup} from "./OnRampSetup.t.sol";
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
contract OnRamp_getTokenPool is OnRampSetup {
- function test_GetTokenPool_Success() public view {
+ function test_GetTokenPool() public view {
assertEq(
s_sourcePoolByToken[s_sourceTokens[0]],
address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_SELECTOR, IERC20(s_sourceTokens[0])))
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.setDynamicConfig.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.setDynamicConfig.t.sol
index 057ed0a79dd..10839968dbe 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.setDynamicConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.setDynamicConfig.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {OnRamp} from "../../../onRamp/OnRamp.sol";
import {OnRampSetup} from "./OnRampSetup.t.sol";
contract OnRamp_setDynamicConfig is OnRampSetup {
- function test_setDynamicConfig_Success() public {
+ function test_setDynamicConfig() public {
OnRamp.StaticConfig memory staticConfig = s_onRamp.getStaticConfig();
OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({
feeQuoter: address(23423),
@@ -27,7 +27,7 @@ contract OnRamp_setDynamicConfig is OnRampSetup {
// Reverts
- function test_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZero_Revert() public {
+ function test_RevertWhen_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZero() public {
OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({
feeQuoter: address(0),
reentrancyGuardEntered: false,
@@ -40,7 +40,7 @@ contract OnRamp_setDynamicConfig is OnRampSetup {
s_onRamp.setDynamicConfig(newConfig);
}
- function test_setDynamicConfig_InvalidConfigInvalidConfig_Revert() public {
+ function test_RevertWhen_setDynamicConfig_InvalidConfigInvalidConfig() public {
OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({
feeQuoter: address(23423),
reentrancyGuardEntered: false,
@@ -55,7 +55,7 @@ contract OnRamp_setDynamicConfig is OnRampSetup {
s_onRamp.setDynamicConfig(newConfig);
}
- function test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() public {
+ function test_RevertWhen_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero() public {
OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({
feeQuoter: address(23423),
reentrancyGuardEntered: false,
@@ -68,13 +68,13 @@ contract OnRamp_setDynamicConfig is OnRampSetup {
s_onRamp.setDynamicConfig(newConfig);
}
- function test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() public {
+ function test_RevertWhen_setDynamicConfig_InvalidConfigOnlyOwner() public {
vm.startPrank(STRANGER);
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
s_onRamp.setDynamicConfig(_generateDynamicOnRampConfig(address(2)));
}
- function test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() public {
+ function test_RevertWhen_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue() public {
OnRamp.DynamicConfig memory newConfig = OnRamp.DynamicConfig({
feeQuoter: address(23423),
reentrancyGuardEntered: true,
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.withdrawFeeTokens.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.withdrawFeeTokens.t.sol
index 2af7242150a..16b1246e90c 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.withdrawFeeTokens.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.withdrawFeeTokens.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Client} from "../../../libraries/Client.sol";
import {OnRamp} from "../../../onRamp/OnRamp.sol";
@@ -57,7 +57,7 @@ contract OnRamp_withdrawFeeTokens is OnRampSetup {
}
}
- function test_WithdrawFeeTokens_Success() public {
+ function test_WithdrawFeeTokens() public {
vm.expectEmit();
emit OnRamp.FeeTokenWithdrawn(FEE_AGGREGATOR, s_sourceFeeToken, s_nopFees[s_sourceFeeToken]);
diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRampSetup.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRampSetup.t.sol
index ead9e7088ce..e310a733bc6 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRampSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRouter} from "../../../interfaces/IRouter.sol";
@@ -75,7 +75,6 @@ contract OnRampSetup is FeeQuoterFeeSetup {
return _messageToEvent(
message,
SOURCE_CHAIN_SELECTOR,
- DEST_CHAIN_SELECTOR,
seqNum,
nonce,
feeTokenAmount,
@@ -89,7 +88,6 @@ contract OnRampSetup is FeeQuoterFeeSetup {
function _messageToEvent(
Client.EVM2AnyMessage memory message,
uint64 sourceChainSelector,
- uint64 destChainSelector,
uint64 seqNum,
uint64 nonce,
uint256 feeTokenAmount,
@@ -99,13 +97,13 @@ contract OnRampSetup is FeeQuoterFeeSetup {
TokenAdminRegistry tokenAdminRegistry
) internal view returns (Internal.EVM2AnyRampMessage memory) {
Client.EVMExtraArgsV2 memory extraArgs =
- s_feeQuoter.parseEVMExtraArgsFromBytes(message.extraArgs, destChainSelector);
+ s_feeQuoter.parseEVMExtraArgsFromBytes(message.extraArgs, DEST_CHAIN_SELECTOR);
Internal.EVM2AnyRampMessage memory messageEvent = Internal.EVM2AnyRampMessage({
header: Internal.RampMessageHeader({
messageId: "",
sourceChainSelector: sourceChainSelector,
- destChainSelector: destChainSelector,
+ destChainSelector: DEST_CHAIN_SELECTOR,
sequenceNumber: seqNum,
nonce: extraArgs.allowOutOfOrderExecution ? 0 : nonce
}),
diff --git a/contracts/src/v0.8/ccip/test/pools/BurnFromMintTokenPool/BurnFromMintTokenPool.lockOrBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/BurnFromMintTokenPool/BurnFromMintTokenPool.lockOrBurn.t.sol
index 44a8f2299af..bbdbd6c83ba 100644
--- a/contracts/src/v0.8/ccip/test/pools/BurnFromMintTokenPool/BurnFromMintTokenPool.lockOrBurn.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/BurnFromMintTokenPool/BurnFromMintTokenPool.lockOrBurn.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../libraries/Pool.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
@@ -9,15 +9,15 @@ import {BurnFromMintTokenPoolSetup} from "./BurnFromMintTokenPoolSetup.t.sol";
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
contract BurnFromMintTokenPool_lockOrBurn is BurnFromMintTokenPoolSetup {
- function test_setup_Success() public view {
+ function test_setup() public view {
assertEq(address(s_burnMintERC20), address(s_pool.getToken()));
- assertEq(address(s_mockRMN), s_pool.getRmnProxy());
+ assertEq(address(s_mockRMNRemote), s_pool.getRmnProxy());
assertEq(false, s_pool.getAllowListEnabled());
assertEq(type(uint256).max, s_burnMintERC20.allowance(address(s_pool), address(s_pool)));
assertEq("BurnFromMintTokenPool 1.5.1", s_pool.typeAndVersion());
}
- function test_PoolBurn_Success() public {
+ function test_PoolBurn() public {
uint256 burnAmount = 20_000e18;
deal(address(s_burnMintERC20), address(s_pool), burnAmount);
@@ -51,8 +51,9 @@ contract BurnFromMintTokenPool_lockOrBurn is BurnFromMintTokenPoolSetup {
}
// Should not burn tokens if cursed.
- function test_PoolBurnRevertNotHealthy_Revert() public {
- s_mockRMN.setGlobalCursed(true);
+ function test_RevertWhen_PoolBurnRevertNotHealthy() public {
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(true));
+
uint256 before = s_burnMintERC20.balanceOf(address(s_pool));
vm.startPrank(s_burnMintOnRamp);
@@ -70,7 +71,7 @@ contract BurnFromMintTokenPool_lockOrBurn is BurnFromMintTokenPoolSetup {
assertEq(s_burnMintERC20.balanceOf(address(s_pool)), before);
}
- function test_ChainNotAllowed_Revert() public {
+ function test_RevertWhen_ChainNotAllowed() public {
uint64 wrongChainSelector = 8838833;
vm.expectRevert(abi.encodeWithSelector(TokenPool.ChainNotAllowed.selector, wrongChainSelector));
s_pool.releaseOrMint(
diff --git a/contracts/src/v0.8/ccip/test/pools/BurnFromMintTokenPool/BurnFromMintTokenPoolSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/BurnFromMintTokenPool/BurnFromMintTokenPoolSetup.t.sol
index 98de04ea3fa..cf11f467579 100644
--- a/contracts/src/v0.8/ccip/test/pools/BurnFromMintTokenPool/BurnFromMintTokenPoolSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/BurnFromMintTokenPool/BurnFromMintTokenPoolSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnFromMintTokenPool} from "../../../pools/BurnFromMintTokenPool.sol";
import {BurnMintSetup} from "../BurnMintTokenPool/BurnMintSetup.t.sol";
@@ -11,7 +11,7 @@ contract BurnFromMintTokenPoolSetup is BurnMintSetup {
BurnMintSetup.setUp();
s_pool = new BurnFromMintTokenPool(
- s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
s_burnMintERC20.grantMintAndBurnRoles(address(s_pool));
diff --git a/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintSetup.t.sol
index 6c5d4dd6369..175f5aaece4 100644
--- a/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintSetup.t.sol
@@ -1,13 +1,13 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC20} from "../../../../shared/token/ERC20/BurnMintERC20.sol";
import {Router} from "../../../Router.sol";
import {BurnMintTokenPool} from "../../../pools/BurnMintTokenPool.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
-import {RouterSetup} from "../../router/Router/RouterSetup.t.sol";
+import {BaseTest} from "../../BaseTest.t.sol";
-contract BurnMintSetup is RouterSetup {
+contract BurnMintSetup is BaseTest {
BurnMintERC20 internal s_burnMintERC20;
address internal s_burnMintOffRamp = makeAddr("burn_mint_offRamp");
address internal s_burnMintOnRamp = makeAddr("burn_mint_onRamp");
@@ -16,7 +16,7 @@ contract BurnMintSetup is RouterSetup {
address internal s_remoteToken = makeAddr("remote_token");
function setUp() public virtual override {
- RouterSetup.setUp();
+ super.setUp();
s_burnMintERC20 = new BurnMintERC20("Chainlink Token", "LINK", 18, 0, 0);
}
diff --git a/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintTokenPool.lockOrBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintTokenPool.lockOrBurn.t.sol
index e0bbffa9919..7b19f2881d6 100644
--- a/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintTokenPool.lockOrBurn.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintTokenPool.lockOrBurn.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../libraries/Pool.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
@@ -16,7 +16,7 @@ contract BurnMintTokenPoolSetup is BurnMintSetup {
BurnMintSetup.setUp();
s_pool = new BurnMintTokenPool(
- s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
s_burnMintERC20.grantMintAndBurnRoles(address(s_pool));
@@ -25,14 +25,14 @@ contract BurnMintTokenPoolSetup is BurnMintSetup {
}
contract BurnMintTokenPool_lockOrBurn is BurnMintTokenPoolSetup {
- function test_Setup_Success() public view {
+ function test_Setup() public view {
assertEq(address(s_burnMintERC20), address(s_pool.getToken()));
- assertEq(address(s_mockRMN), s_pool.getRmnProxy());
+ assertEq(address(s_mockRMNRemote), s_pool.getRmnProxy());
assertEq(false, s_pool.getAllowListEnabled());
assertEq("BurnMintTokenPool 1.5.1", s_pool.typeAndVersion());
}
- function test_PoolBurn_Success() public {
+ function test_PoolBurn() public {
uint256 burnAmount = 20_000e18;
deal(address(s_burnMintERC20), address(s_pool), burnAmount);
@@ -66,8 +66,8 @@ contract BurnMintTokenPool_lockOrBurn is BurnMintTokenPoolSetup {
}
// Should not burn tokens if cursed.
- function test_PoolBurnRevertNotHealthy_Revert() public {
- s_mockRMN.setGlobalCursed(true);
+ function test_RevertWhen_PoolBurnRevertNotHealthy() public {
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(true));
uint256 before = s_burnMintERC20.balanceOf(address(s_pool));
vm.startPrank(s_burnMintOnRamp);
@@ -85,7 +85,7 @@ contract BurnMintTokenPool_lockOrBurn is BurnMintTokenPoolSetup {
assertEq(s_burnMintERC20.balanceOf(address(s_pool)), before);
}
- function test_ChainNotAllowed_Revert() public {
+ function test_RevertWhen_ChainNotAllowed() public {
uint64 wrongChainSelector = 8838833;
vm.expectRevert(abi.encodeWithSelector(TokenPool.ChainNotAllowed.selector, wrongChainSelector));
diff --git a/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintTokenPool.releaseOrMint.t.sol b/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintTokenPool.releaseOrMint.t.sol
index e950b079889..88b96b1fef7 100644
--- a/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintTokenPool.releaseOrMint.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/BurnMintTokenPool/BurnMintTokenPool.releaseOrMint.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../libraries/Pool.sol";
import {BurnMintTokenPool} from "../../../pools/BurnMintTokenPool.sol";
@@ -15,7 +15,7 @@ contract BurnMintTokenPoolSetup is BurnMintSetup {
BurnMintSetup.setUp();
s_pool = new BurnMintTokenPool(
- s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
s_burnMintERC20.grantMintAndBurnRoles(address(s_pool));
@@ -24,7 +24,7 @@ contract BurnMintTokenPoolSetup is BurnMintSetup {
}
contract BurnMintTokenPool_releaseOrMint is BurnMintTokenPoolSetup {
- function test_PoolMint_Success() public {
+ function test_PoolMint() public {
uint256 amount = 1e19;
address receiver = makeAddr("receiver_address");
@@ -49,9 +49,9 @@ contract BurnMintTokenPool_releaseOrMint is BurnMintTokenPoolSetup {
assertEq(s_burnMintERC20.balanceOf(receiver), amount);
}
- function test_PoolMintNotHealthy_Revert() public {
+ function test_RevertWhen_PoolMintNotHealthy() public {
// Should not mint tokens if cursed.
- s_mockRMN.setGlobalCursed(true);
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(true));
uint256 before = s_burnMintERC20.balanceOf(OWNER);
vm.startPrank(s_burnMintOffRamp);
@@ -72,7 +72,7 @@ contract BurnMintTokenPool_releaseOrMint is BurnMintTokenPoolSetup {
assertEq(s_burnMintERC20.balanceOf(OWNER), before);
}
- function test_ChainNotAllowed_Revert() public {
+ function test_RevertWhen_ChainNotAllowed() public {
uint64 wrongChainSelector = 8838833;
vm.expectRevert(abi.encodeWithSelector(TokenPool.ChainNotAllowed.selector, wrongChainSelector));
diff --git a/contracts/src/v0.8/ccip/test/pools/BurnMintWithLockReleaseFlagTokenPool/BurnMintWithLockReleaseFlagTokenPool.lockOrBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/BurnMintWithLockReleaseFlagTokenPool/BurnMintWithLockReleaseFlagTokenPool.lockOrBurn.t.sol
index bb58afd254a..bc8de71d209 100644
--- a/contracts/src/v0.8/ccip/test/pools/BurnMintWithLockReleaseFlagTokenPool/BurnMintWithLockReleaseFlagTokenPool.lockOrBurn.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/BurnMintWithLockReleaseFlagTokenPool/BurnMintWithLockReleaseFlagTokenPool.lockOrBurn.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../libraries/Pool.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
@@ -18,7 +18,7 @@ contract BurnMintWithLockReleaseFlagTokenPoolSetup is BurnMintSetup {
BurnMintSetup.setUp();
s_pool = new BurnMintWithLockReleaseFlagTokenPool(
- s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
s_burnMintERC20.grantMintAndBurnRoles(address(s_pool));
@@ -27,7 +27,7 @@ contract BurnMintWithLockReleaseFlagTokenPoolSetup is BurnMintSetup {
}
contract BurnMintWithLockReleaseFlagTokenPool_lockOrBurn is BurnMintWithLockReleaseFlagTokenPoolSetup {
- function test_LockOrBurn_CorrectReturnData_Success() public {
+ function test_LockOrBurn_CorrectReturnData() public {
uint256 burnAmount = 20_000e18;
deal(address(s_burnMintERC20), address(s_pool), burnAmount);
diff --git a/contracts/src/v0.8/ccip/test/pools/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.lockOrBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.lockOrBurn.t.sol
index b96dcd78b5d..477f9e86430 100644
--- a/contracts/src/v0.8/ccip/test/pools/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.lockOrBurn.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.lockOrBurn.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../libraries/Pool.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
@@ -16,7 +16,7 @@ contract BurnWithFromMintTokenPoolSetup is BurnMintSetup {
BurnMintSetup.setUp();
s_pool = new BurnWithFromMintTokenPool(
- s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ s_burnMintERC20, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
s_burnMintERC20.grantMintAndBurnRoles(address(s_pool));
@@ -25,15 +25,15 @@ contract BurnWithFromMintTokenPoolSetup is BurnMintSetup {
}
contract BurnWithFromMintTokenPool_lockOrBurn is BurnWithFromMintTokenPoolSetup {
- function test_Setup_Success() public view {
+ function test_Setup() public view {
assertEq(address(s_burnMintERC20), address(s_pool.getToken()));
- assertEq(address(s_mockRMN), s_pool.getRmnProxy());
+ assertEq(address(s_mockRMNRemote), s_pool.getRmnProxy());
assertEq(false, s_pool.getAllowListEnabled());
assertEq(type(uint256).max, s_burnMintERC20.allowance(address(s_pool), address(s_pool)));
assertEq("BurnWithFromMintTokenPool 1.5.1", s_pool.typeAndVersion());
}
- function test_PoolBurn_Success() public {
+ function test_PoolBurn() public {
uint256 burnAmount = 20_000e18;
deal(address(s_burnMintERC20), address(s_pool), burnAmount);
@@ -67,8 +67,8 @@ contract BurnWithFromMintTokenPool_lockOrBurn is BurnWithFromMintTokenPoolSetup
}
// Should not burn tokens if cursed.
- function test_PoolBurnRevertNotHealthy_Revert() public {
- s_mockRMN.setGlobalCursed(true);
+ function test_RevertWhen_PoolBurnRevertNotHealthy() public {
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(true));
uint256 before = s_burnMintERC20.balanceOf(address(s_pool));
vm.startPrank(s_burnMintOnRamp);
@@ -86,7 +86,7 @@ contract BurnWithFromMintTokenPool_lockOrBurn is BurnWithFromMintTokenPoolSetup
assertEq(s_burnMintERC20.balanceOf(address(s_pool)), before);
}
- function test_ChainNotAllowed_Revert() public {
+ function test_RevertWhen_ChainNotAllowed() public {
uint64 wrongChainSelector = 8838833;
vm.expectRevert(abi.encodeWithSelector(TokenPool.ChainNotAllowed.selector, wrongChainSelector));
s_pool.releaseOrMint(
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.canAcceptLiquidity.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.canAcceptLiquidity.t.sol
index 63b6e0bc351..e4bebbf1820 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.canAcceptLiquidity.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.canAcceptLiquidity.t.sol
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {LockReleaseTokenPool} from "../../../pools/LockReleaseTokenPool.sol";
import {LockReleaseTokenPoolSetup} from "./LockReleaseTokenPoolSetup.t.sol";
contract LockReleaseTokenPool_canAcceptLiquidity is LockReleaseTokenPoolSetup {
- function test_CanAcceptLiquidity_Success() public {
+ function test_CanAcceptLiquidity() public {
assertEq(true, s_lockReleaseTokenPool.canAcceptLiquidity());
s_lockReleaseTokenPool = new LockReleaseTokenPool(
- s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), false, address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), false, address(s_sourceRouter)
);
assertEq(false, s_lockReleaseTokenPool.canAcceptLiquidity());
}
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.lockOrBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.lockOrBurn.t.sol
index 7c87fbcc95d..490f848f7af 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.lockOrBurn.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.lockOrBurn.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../libraries/Pool.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
@@ -30,7 +30,7 @@ contract LockReleaseTokenPool_lockOrBurn is LockReleaseTokenPoolSetup {
);
}
- function test_LockOrBurnWithAllowList_Success() public {
+ function test_LockOrBurnWithAllowList() public {
uint256 amount = 100;
vm.startPrank(s_allowedOnRamp);
@@ -63,7 +63,7 @@ contract LockReleaseTokenPool_lockOrBurn is LockReleaseTokenPoolSetup {
);
}
- function test_LockOrBurnWithAllowList_Revert() public {
+ function test_RevertWhen_LockOrBurnWithAllowList() public {
vm.startPrank(s_allowedOnRamp);
vm.expectRevert(abi.encodeWithSelector(TokenPool.SenderNotAllowed.selector, STRANGER));
@@ -79,9 +79,9 @@ contract LockReleaseTokenPool_lockOrBurn is LockReleaseTokenPoolSetup {
);
}
- function test_PoolBurnRevertNotHealthy_Revert() public {
+ function test_RevertWhen_PoolBurnRevertNotHealthy() public {
// Should not burn tokens if cursed.
- s_mockRMN.setGlobalCursed(true);
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(true));
uint256 before = s_token.balanceOf(address(s_lockReleaseTokenPoolWithAllowList));
vm.startPrank(s_allowedOnRamp);
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.provideLiquidity.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.provideLiquidity.t.sol
index 6ef52e88467..88724f89abb 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.provideLiquidity.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.provideLiquidity.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {LockReleaseTokenPool} from "../../../pools/LockReleaseTokenPool.sol";
@@ -21,7 +21,7 @@ contract LockReleaseTokenPool_provideLiquidity is LockReleaseTokenPoolSetup {
// Reverts
- function test_Unauthorized_Revert() public {
+ function test_RevertWhen_Unauthorized() public {
vm.startPrank(STRANGER);
vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, STRANGER));
@@ -36,9 +36,9 @@ contract LockReleaseTokenPool_provideLiquidity is LockReleaseTokenPoolSetup {
s_lockReleaseTokenPool.provideLiquidity(amount);
}
- function test_LiquidityNotAccepted_Revert() public {
+ function test_RevertWhen_LiquidityNotAccepted() public {
s_lockReleaseTokenPool = new LockReleaseTokenPool(
- s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), false, address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), false, address(s_sourceRouter)
);
vm.expectRevert(LockReleaseTokenPool.LiquidityNotAccepted.selector);
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.releaseOrMint.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.releaseOrMint.t.sol
index 9a67f766448..9ef5130370a 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.releaseOrMint.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.releaseOrMint.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../libraries/Pool.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
@@ -27,7 +27,7 @@ contract LockReleaseTokenPool_releaseOrMint is LockReleaseTokenPoolSetup {
s_lockReleaseTokenPoolWithAllowList.applyChainUpdates(new uint64[](0), chainUpdate);
}
- function test_ReleaseOrMint_Success() public {
+ function test_ReleaseOrMint() public {
vm.startPrank(s_allowedOffRamp);
uint256 amount = 100;
@@ -93,7 +93,7 @@ contract LockReleaseTokenPool_releaseOrMint is LockReleaseTokenPoolSetup {
);
}
- function test_ChainNotAllowed_Revert() public {
+ function test_RevertWhen_ChainNotAllowed() public {
uint64[] memory chainsToRemove = new uint64[](1);
chainsToRemove[0] = SOURCE_CHAIN_SELECTOR;
@@ -116,9 +116,9 @@ contract LockReleaseTokenPool_releaseOrMint is LockReleaseTokenPoolSetup {
);
}
- function test_PoolMintNotHealthy_Revert() public {
+ function test_RevertWhen_PoolMintNotHealthy() public {
// Should not mint tokens if cursed.
- s_mockRMN.setGlobalCursed(true);
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed(bytes16)"), abi.encode(true));
uint256 before = s_token.balanceOf(OWNER);
vm.startPrank(s_allowedOffRamp);
vm.expectRevert(TokenPool.CursedByRMN.selector);
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.setRebalancer.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.setRebalancer.t.sol
index 25286c1a376..055bbf3c55d 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.setRebalancer.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.setRebalancer.t.sol
@@ -1,17 +1,17 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {LockReleaseTokenPoolSetup} from "./LockReleaseTokenPoolSetup.t.sol";
contract LockReleaseTokenPool_setRebalancer is LockReleaseTokenPoolSetup {
- function test_SetRebalancer_Success() public {
+ function test_SetRebalancer() public {
assertEq(address(s_lockReleaseTokenPool.getRebalancer()), OWNER);
s_lockReleaseTokenPool.setRebalancer(STRANGER);
assertEq(address(s_lockReleaseTokenPool.getRebalancer()), STRANGER);
}
- function test_SetRebalancer_Revert() public {
+ function test_RevertWhen_SetRebalancer() public {
vm.startPrank(STRANGER);
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.supportsInterface.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.supportsInterface.t.sol
index 9a08fc38c96..000ece21f35 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.supportsInterface.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.supportsInterface.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IPoolV1} from "../../../interfaces/IPool.sol";
@@ -8,7 +8,7 @@ import {LockReleaseTokenPoolSetup} from "./LockReleaseTokenPoolSetup.t.sol";
import {IERC165} from "../../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol";
contract LockReleaseTokenPool_supportsInterface is LockReleaseTokenPoolSetup {
- function test_SupportsInterface_Success() public view {
+ function test_SupportsInterface() 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/LockReleaseTokenPool/LockReleaseTokenPool.transferLiquidity.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.transferLiquidity.t.sol
index 60b9c935bd3..7eca1f95067 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.transferLiquidity.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.transferLiquidity.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {LockReleaseTokenPool} from "../../../pools/LockReleaseTokenPool.sol";
import {LockReleaseTokenPoolSetup} from "./LockReleaseTokenPoolSetup.t.sol";
@@ -12,13 +12,13 @@ contract LockReleaseTokenPool_transferLiquidity is LockReleaseTokenPoolSetup {
super.setUp();
s_oldLockReleaseTokenPool = new LockReleaseTokenPool(
- s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), true, address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), true, address(s_sourceRouter)
);
deal(address(s_token), address(s_oldLockReleaseTokenPool), s_amount);
}
- function test_transferLiquidity_Success() public {
+ function test_transferLiquidity() public {
uint256 balancePre = s_token.balanceOf(address(s_lockReleaseTokenPool));
s_oldLockReleaseTokenPool.setRebalancer(address(s_lockReleaseTokenPool));
@@ -31,7 +31,7 @@ contract LockReleaseTokenPool_transferLiquidity is LockReleaseTokenPoolSetup {
assertEq(s_token.balanceOf(address(s_lockReleaseTokenPool)), balancePre + s_amount);
}
- function test_transferLiquidity_transferTooMuch_Revert() public {
+ function test_RevertWhen_transferLiquidity_transferTooMuch() public {
uint256 balancePre = s_token.balanceOf(address(s_lockReleaseTokenPool));
s_oldLockReleaseTokenPool.setRebalancer(address(s_lockReleaseTokenPool));
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.withdrawalLiquidity.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.withdrawalLiquidity.t.sol
index 29b6ef6c7f8..df21bc36fab 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.withdrawalLiquidity.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPool.withdrawalLiquidity.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {LockReleaseTokenPool} from "../../../pools/LockReleaseTokenPool.sol";
@@ -20,14 +20,14 @@ contract LockReleaseTokenPool_withdrawalLiquidity is LockReleaseTokenPoolSetup {
}
// Reverts
- function test_Unauthorized_Revert() public {
+ function test_RevertWhen_Unauthorized() public {
vm.startPrank(STRANGER);
vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, STRANGER));
s_lockReleaseTokenPool.withdrawLiquidity(1);
}
- function test_InsufficientLiquidity_Revert() public {
+ function test_RevertWhen_InsufficientLiquidity() public {
uint256 maxUint256 = 2 ** 256 - 1;
s_token.approve(address(s_lockReleaseTokenPool), maxUint256);
s_lockReleaseTokenPool.provideLiquidity(maxUint256);
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPoolSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPoolSetup.t.sol
index 13bcb8cfdee..8fc7a84ecbb 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPoolSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool/LockReleaseTokenPoolSetup.t.sol
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC20} from "../../../../shared/token/ERC20/BurnMintERC20.sol";
import {Router} from "../../../Router.sol";
import {LockReleaseTokenPool} from "../../../pools/LockReleaseTokenPool.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
+import {BaseTest} from "../../BaseTest.t.sol";
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
-import {RouterSetup} from "../../router/Router/RouterSetup.t.sol";
-contract LockReleaseTokenPoolSetup is RouterSetup {
+contract LockReleaseTokenPoolSetup is BaseTest {
IERC20 internal s_token;
LockReleaseTokenPool internal s_lockReleaseTokenPool;
LockReleaseTokenPool internal s_lockReleaseTokenPoolWithAllowList;
@@ -22,17 +22,17 @@ contract LockReleaseTokenPoolSetup is RouterSetup {
address internal s_sourcePoolAddress = address(53852352095);
function setUp() public virtual override {
- RouterSetup.setUp();
+ super.setUp();
s_token = new BurnMintERC20("LINK", "LNK", 18, 0, 0);
deal(address(s_token), OWNER, type(uint256).max);
s_lockReleaseTokenPool = new LockReleaseTokenPool(
- s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), true, address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), true, address(s_sourceRouter)
);
- s_allowedList.push(USER_1);
+ s_allowedList.push(vm.randomAddress());
s_allowedList.push(OWNER);
s_lockReleaseTokenPoolWithAllowList = new LockReleaseTokenPool(
- s_token, DEFAULT_TOKEN_DECIMALS, s_allowedList, address(s_mockRMN), true, address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, s_allowedList, address(s_mockRMNRemote), true, address(s_sourceRouter)
);
bytes[] memory remotePoolAddresses = new bytes[](1);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.addRemotePool.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.addRemotePool.t.sol
index 287ee796f67..5a2e84f5c98 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.addRemotePool.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.addRemotePool.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Router} from "../../../Router.sol";
import {Pool} from "../../../libraries/Pool.sol";
@@ -7,7 +7,7 @@ import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolSetup} from "./TokenPoolSetup.t.sol";
contract TokenPool_addRemotePool is TokenPoolSetup {
- function test_addRemotePool_Success() public {
+ function test_addRemotePool() public {
// Use a longer data type to ensure it also works for non-evm
bytes memory remotePool = abi.encode(makeAddr("non-evm-1"), makeAddr("non-evm-2"));
@@ -130,7 +130,7 @@ contract TokenPool_addRemotePool is TokenPoolSetup {
// Reverts
- function test_NonExistentChain_Revert() public {
+ function test_RevertWhen_NonExistentChain() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR + 1;
bytes memory remotePool = abi.encode(type(uint256).max);
@@ -139,7 +139,7 @@ contract TokenPool_addRemotePool is TokenPoolSetup {
s_tokenPool.addRemotePool(chainSelector, remotePool);
}
- function test_ZeroLengthAddressNotAllowed_Revert() public {
+ function test_RevertWhen_ZeroLengthAddressNotAllowed() public {
bytes memory remotePool = "";
vm.expectRevert(abi.encodeWithSelector(TokenPool.ZeroAddressNotAllowed.selector));
@@ -147,7 +147,7 @@ contract TokenPool_addRemotePool is TokenPoolSetup {
s_tokenPool.addRemotePool(DEST_CHAIN_SELECTOR, remotePool);
}
- function test_PoolAlreadyAdded_Revert() public {
+ function test_RevertWhen_PoolAlreadyAdded() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR;
bytes memory remotePool = abi.encode(type(uint256).max);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.applyAllowListUpdates.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.applyAllowListUpdates.t.sol
index 96629445810..95d498430dc 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.applyAllowListUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.applyAllowListUpdates.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
@@ -8,7 +8,7 @@ import {TokenPoolHelper} from "../../helpers/TokenPoolHelper.sol";
import {TokenPoolWithAllowListSetup} from "./TokenPoolWithAllowListSetup.t.sol";
contract TokenPoolWithAllowList_applyAllowListUpdates is TokenPoolWithAllowListSetup {
- function test_SetAllowList_Success() public {
+ function test_SetAllowList() public {
address[] memory newAddresses = new address[](2);
newAddresses[0] = address(1);
newAddresses[1] = address(2);
@@ -60,7 +60,7 @@ contract TokenPoolWithAllowList_applyAllowListUpdates is TokenPoolWithAllowListS
assertEq(0, setAddresses.length);
}
- function test_SetAllowListSkipsZero_Success() public {
+ function test_SetAllowListSkipsZero() public {
uint256 setAddressesLength = s_tokenPool.getAllowList().length;
address[] memory newAddresses = new address[](1);
@@ -74,16 +74,16 @@ contract TokenPoolWithAllowList_applyAllowListUpdates is TokenPoolWithAllowListS
// Reverts
- function test_OnlyOwner_Revert() public {
+ function test_RevertWhen_OnlyOwner() public {
vm.stopPrank();
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
address[] memory newAddresses = new address[](2);
s_tokenPool.applyAllowListUpdates(new address[](0), newAddresses);
}
- function test_AllowListNotEnabled_Revert() public {
+ function test_RevertWhen_AllowListNotEnabled() public {
s_tokenPool = new TokenPoolHelper(
- s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
vm.expectRevert(TokenPool.AllowListNotEnabled.selector);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.applyChainUpdates.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.applyChainUpdates.t.sol
index 1ecfc83c5ce..e26cf766362 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.applyChainUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.applyChainUpdates.t.sol
@@ -1,27 +1,26 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {BurnMintERC677} from "../../../../shared/token/ERC677/BurnMintERC677.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
-
+import {BaseTest} from "../../BaseTest.t.sol";
import {TokenPoolHelper} from "../../helpers/TokenPoolHelper.sol";
-import {RouterSetup} from "../../router/Router/RouterSetup.t.sol";
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
-contract TokenPool_applyChainUpdates is RouterSetup {
+contract TokenPool_applyChainUpdates is BaseTest {
IERC20 internal s_token;
TokenPoolHelper internal s_tokenPool;
function setUp() public virtual override {
- RouterSetup.setUp();
+ super.setUp();
s_token = new BurnMintERC677("LINK", "LNK", 18, 0);
deal(address(s_token), OWNER, type(uint256).max);
s_tokenPool = new TokenPoolHelper(
- s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
}
@@ -48,7 +47,7 @@ contract TokenPool_applyChainUpdates is RouterSetup {
}
}
- function test_applyChainUpdates_Success() public {
+ function test_applyChainUpdates() public {
RateLimiter.Config memory outboundRateLimit1 = RateLimiter.Config({isEnabled: true, capacity: 100e28, rate: 1e18});
RateLimiter.Config memory inboundRateLimit1 = RateLimiter.Config({isEnabled: true, capacity: 100e29, rate: 1e19});
RateLimiter.Config memory outboundRateLimit2 = RateLimiter.Config({isEnabled: true, capacity: 100e26, rate: 1e16});
@@ -200,13 +199,13 @@ contract TokenPool_applyChainUpdates is RouterSetup {
// Reverts
- function test_applyChainUpdates_OnlyCallableByOwner_Revert() public {
+ function test_RevertWhen_applyChainUpdates_OnlyCallableByOwner() public {
vm.startPrank(STRANGER);
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
s_tokenPool.applyChainUpdates(new uint64[](0), new TokenPool.ChainUpdate[](0));
}
- function test_applyChainUpdates_ZeroAddressNotAllowed_Revert() public {
+ function test_RevertWhen_applyChainUpdates_ZeroAddressNotAllowed() public {
bytes[] memory remotePoolAddresses = new bytes[](1);
remotePoolAddresses[0] = "";
@@ -235,7 +234,7 @@ contract TokenPool_applyChainUpdates is RouterSetup {
s_tokenPool.applyChainUpdates(new uint64[](0), chainUpdates);
}
- function test_applyChainUpdates_NonExistentChain_Revert() public {
+ function test_RevertWhen_applyChainUpdates_NonExistentChain() public {
uint64[] memory chainRemoves = new uint64[](1);
chainRemoves[0] = 1;
@@ -243,7 +242,7 @@ contract TokenPool_applyChainUpdates is RouterSetup {
s_tokenPool.applyChainUpdates(chainRemoves, new TokenPool.ChainUpdate[](0));
}
- function test_applyChainUpdates_InvalidRateLimitRate_Revert() public {
+ function test_RevertWhen_applyChainUpdates_InvalidRateLimitRate() public {
uint64 unusedChainSelector = 2 ** 64 - 1;
TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](1);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.calculateLocalAmount.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.calculateLocalAmount.t.sol
index 4262fac2218..8faf2303524 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.calculateLocalAmount.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.calculateLocalAmount.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolHelper} from "../../helpers/TokenPoolHelper.sol";
@@ -36,7 +36,7 @@ contract TokenPool_calculateLocalAmount is TokenPoolSetup {
// Reverts
- function test_calculateLocalAmount_RevertWhen_LowRemoteDecimalsOverflows() public {
+ function test_RevertWhen_calculateLocalAmountWhen_LowRemoteDecimalsOverflows() public {
uint8 remoteDecimals = 0;
uint8 localDecimals = 78;
uint256 remoteAmount = 1;
@@ -44,7 +44,7 @@ contract TokenPool_calculateLocalAmount is TokenPoolSetup {
vm.mockCall(address(s_token), abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(localDecimals));
s_tokenPool =
- new TokenPoolHelper(s_token, localDecimals, new address[](0), address(s_mockRMN), address(s_sourceRouter));
+ new TokenPoolHelper(s_token, localDecimals, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter));
vm.expectRevert(
abi.encodeWithSelector(TokenPool.OverflowDetected.selector, remoteDecimals, localDecimals, remoteAmount)
@@ -53,7 +53,7 @@ contract TokenPool_calculateLocalAmount is TokenPoolSetup {
s_tokenPool.calculateLocalAmount(remoteAmount, remoteDecimals);
}
- function test_calculateLocalAmount_RevertWhen_HighLocalDecimalsOverflows() public {
+ function test_RevertWhen_calculateLocalAmountWhen_HighLocalDecimalsOverflows() public {
uint8 remoteDecimals = 18;
uint8 localDecimals = 18 + 78;
uint256 remoteAmount = 1;
@@ -61,7 +61,7 @@ contract TokenPool_calculateLocalAmount is TokenPoolSetup {
vm.mockCall(address(s_token), abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(localDecimals));
s_tokenPool =
- new TokenPoolHelper(s_token, localDecimals, new address[](0), address(s_mockRMN), address(s_sourceRouter));
+ new TokenPoolHelper(s_token, localDecimals, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter));
vm.expectRevert(
abi.encodeWithSelector(TokenPool.OverflowDetected.selector, remoteDecimals, localDecimals, remoteAmount)
@@ -70,7 +70,7 @@ contract TokenPool_calculateLocalAmount is TokenPoolSetup {
s_tokenPool.calculateLocalAmount(remoteAmount, remoteDecimals);
}
- function test_calculateLocalAmount_RevertWhen_HighRemoteDecimalsOverflows() public {
+ function test_RevertWhen_calculateLocalAmountWhen_HighRemoteDecimalsOverflows() public {
uint8 remoteDecimals = 18 + 78;
uint8 localDecimals = 18;
uint256 remoteAmount = 1;
@@ -82,7 +82,7 @@ contract TokenPool_calculateLocalAmount is TokenPoolSetup {
s_tokenPool.calculateLocalAmount(remoteAmount, remoteDecimals);
}
- function test_calculateLocalAmount_RevertWhen_HighAmountOverflows() public {
+ function test_RevertWhen_calculateLocalAmountWhen_HighAmountOverflows() public {
uint8 remoteDecimals = 18;
uint8 localDecimals = 18 + 28;
uint256 remoteAmount = 1e50;
@@ -90,7 +90,7 @@ contract TokenPool_calculateLocalAmount is TokenPoolSetup {
vm.mockCall(address(s_token), abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(localDecimals));
s_tokenPool =
- new TokenPoolHelper(s_token, localDecimals, new address[](0), address(s_mockRMN), address(s_sourceRouter));
+ new TokenPoolHelper(s_token, localDecimals, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter));
vm.expectRevert(
abi.encodeWithSelector(TokenPool.OverflowDetected.selector, remoteDecimals, localDecimals, remoteAmount)
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.constructor.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.constructor.t.sol
index 4b643d66b9e..28c13582c6f 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.constructor.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolHelper} from "../../helpers/TokenPoolHelper.sol";
@@ -12,7 +12,7 @@ import {IERC20Metadata} from
contract TokenPool_constructor is TokenPoolSetup {
function test_constructor() public view {
assertEq(address(s_token), address(s_tokenPool.getToken()));
- assertEq(address(s_mockRMN), s_tokenPool.getRmnProxy());
+ assertEq(address(s_mockRMNRemote), s_tokenPool.getRmnProxy());
assertFalse(s_tokenPool.getAllowListEnabled());
assertEq(address(s_sourceRouter), s_tokenPool.getRouter());
assertEq(DEFAULT_TOKEN_DECIMALS, s_tokenPool.getTokenDecimals());
@@ -23,22 +23,23 @@ contract TokenPool_constructor is TokenPoolSetup {
vm.mockCallRevert(address(s_token), abi.encodeWithSelector(IERC20Metadata.decimals.selector), "decimals fails");
- s_tokenPool = new TokenPoolHelper(s_token, decimals, new address[](0), address(s_mockRMN), address(s_sourceRouter));
+ s_tokenPool =
+ new TokenPoolHelper(s_token, decimals, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter));
assertEq(s_tokenPool.getTokenDecimals(), decimals);
}
// Reverts
- function test_constructor_RevertWhen_ZeroAddressNotAllowed() public {
+ function test_RevertWhen_constructorWhen_ZeroAddressNotAllowed() public {
vm.expectRevert(TokenPool.ZeroAddressNotAllowed.selector);
s_tokenPool = new TokenPoolHelper(
- IERC20(address(0)), DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ IERC20(address(0)), DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
}
- function test_constructor_RevertWhen_InvalidDecimalArgs() public {
+ function test_RevertWhen_constructorWhen_InvalidDecimalArgs() public {
uint8 invalidDecimals = DEFAULT_TOKEN_DECIMALS + 1;
vm.expectRevert(
@@ -46,6 +47,6 @@ contract TokenPool_constructor is TokenPoolSetup {
);
s_tokenPool =
- new TokenPoolHelper(s_token, invalidDecimals, new address[](0), address(s_mockRMN), address(s_sourceRouter));
+ new TokenPoolHelper(s_token, invalidDecimals, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter));
}
}
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getAllowList.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getAllowList.t.sol
index 8d4256d3479..ea9bbf5d068 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getAllowList.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getAllowList.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPoolWithAllowListSetup} from "./TokenPoolWithAllowListSetup.t.sol";
contract TokenPoolWithAllowList_getAllowList is TokenPoolWithAllowListSetup {
- function test_GetAllowList_Success() public view {
+ function test_GetAllowList() public view {
address[] memory setAddresses = s_tokenPool.getAllowList();
assertEq(2, setAddresses.length);
assertEq(s_allowedSenders[0], setAddresses[0]);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getAllowListEnabled.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getAllowListEnabled.t.sol
index 2a36a846999..b710433f785 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getAllowListEnabled.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getAllowListEnabled.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPoolWithAllowListSetup} from "./TokenPoolWithAllowListSetup.t.sol";
contract TokenPoolWithAllowList_getAllowListEnabled is TokenPoolWithAllowListSetup {
- function test_GetAllowListEnabled_Success() public view {
+ function test_GetAllowListEnabled() public view {
assertTrue(s_tokenPool.getAllowListEnabled());
}
}
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getRemotePool.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getRemotePool.t.sol
index 5e619aede4c..dc570781d81 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getRemotePool.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.getRemotePool.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolSetup} from "./TokenPoolSetup.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.onlyOffRamp.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.onlyOffRamp.t.sol
index 8df07a285f3..7f972010754 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.onlyOffRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.onlyOffRamp.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Router} from "../../../Router.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolSetup} from "./TokenPoolSetup.t.sol";
contract TokenPool_onlyOffRamp is TokenPoolSetup {
- function test_onlyOffRamp_Success() public {
+ function test_onlyOffRamp() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR;
address offRamp = makeAddr("onRamp");
@@ -19,7 +19,7 @@ contract TokenPool_onlyOffRamp is TokenPoolSetup {
s_tokenPool.onlyOffRampModifier(chainSelector);
}
- function test_ChainNotAllowed_Revert() public {
+ function test_RevertWhen_ChainNotAllowed() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR + 1;
address offRamp = makeAddr("onRamp");
@@ -60,7 +60,7 @@ contract TokenPool_onlyOffRamp is TokenPoolSetup {
s_tokenPool.onlyOffRampModifier(chainSelector);
}
- function test_CallerIsNotARampOnRouter_Revert() public {
+ function test_RevertWhen_CallerIsNotARampOnRouter() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR;
address offRamp = makeAddr("offRamp");
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.onlyOnRamp.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.onlyOnRamp.t.sol
index be0c21e4c1e..970228c424f 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.onlyOnRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.onlyOnRamp.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Router} from "../../../Router.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolSetup} from "./TokenPoolSetup.t.sol";
contract TokenPool_onlyOnRamp is TokenPoolSetup {
- function test_onlyOnRamp_Success() public {
+ function test_onlyOnRamp() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR;
address onRamp = makeAddr("onRamp");
@@ -19,7 +19,7 @@ contract TokenPool_onlyOnRamp is TokenPoolSetup {
s_tokenPool.onlyOnRampModifier(chainSelector);
}
- function test_ChainNotAllowed_Revert() public {
+ function test_RevertWhen_ChainNotAllowed() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR + 1;
address onRamp = makeAddr("onRamp");
@@ -60,7 +60,7 @@ contract TokenPool_onlyOnRamp is TokenPoolSetup {
s_tokenPool.onlyOffRampModifier(chainSelector);
}
- function test_CallerIsNotARampOnRouter_Revert() public {
+ function test_RevertWhen_CallerIsNotARampOnRouter() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR;
address onRamp = makeAddr("onRamp");
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.parseRemoteDecimals.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.parseRemoteDecimals.t.sol
index 9817fe227e4..49b40fc5c60 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.parseRemoteDecimals.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.parseRemoteDecimals.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolSetup} from "./TokenPoolSetup.t.sol";
@@ -18,7 +18,7 @@ contract TokenPool_parseRemoteDecimals is TokenPoolSetup {
assertEq(s_tokenPool.parseRemoteDecimals(""), s_tokenPool.getTokenDecimals());
}
- function test_parseRemoteDecimals_RevertWhen_InvalidRemoteChainDecimals_DigitTooLarge() public {
+ function test_RevertWhen_parseRemoteDecimalsWhen_InvalidRemoteChainDecimals_DigitTooLarge() public {
bytes memory encodedDecimals = abi.encode(uint256(256));
vm.expectRevert(abi.encodeWithSelector(TokenPool.InvalidRemoteChainDecimals.selector, encodedDecimals));
@@ -26,7 +26,7 @@ contract TokenPool_parseRemoteDecimals is TokenPoolSetup {
s_tokenPool.parseRemoteDecimals(encodedDecimals);
}
- function test_parseRemoteDecimals_RevertWhen_InvalidRemoteChainDecimals_WrongType() public {
+ function test_RevertWhen_parseRemoteDecimalsWhen_InvalidRemoteChainDecimals_WrongType() public {
bytes memory encodedDecimals = abi.encode(uint256(256), "wrong type");
vm.expectRevert(abi.encodeWithSelector(TokenPool.InvalidRemoteChainDecimals.selector, encodedDecimals));
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.removeRemotePool.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.removeRemotePool.t.sol
index 2fa9ef16624..ac50a34b8ca 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.removeRemotePool.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.removeRemotePool.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolSetup} from "./TokenPoolSetup.t.sol";
contract TokenPool_removeRemotePool is TokenPoolSetup {
- function test_removeRemotePool_Success() public {
+ function test_removeRemotePool() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR;
// Use a longer data type to ensure it also works for non-evm
bytes memory remotePool = abi.encode(makeAddr("non-evm-1"), makeAddr("non-evm-2"));
@@ -41,7 +41,7 @@ contract TokenPool_removeRemotePool is TokenPoolSetup {
// Reverts
- function test_NonExistentChain_Revert() public {
+ function test_RevertWhen_NonExistentChain() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR + 1;
bytes memory remotePool = abi.encode(type(uint256).max);
@@ -50,7 +50,7 @@ contract TokenPool_removeRemotePool is TokenPoolSetup {
s_tokenPool.removeRemotePool(chainSelector, remotePool);
}
- function test_InvalidRemotePoolForChain_Revert() public {
+ function test_RevertWhen_InvalidRemotePoolForChain() public {
uint64 chainSelector = DEST_CHAIN_SELECTOR;
bytes memory remotePool = abi.encode(type(uint256).max);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setChainRateLimiterConfig.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setChainRateLimiterConfig.t.sol
index 4dea9bf4032..afb8a649a07 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setChainRateLimiterConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setChainRateLimiterConfig.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
@@ -50,7 +50,7 @@ contract TokenPool_setChainRateLimiterConfig is TokenPoolSetup {
// Reverts
- function test_OnlyOwnerOrRateLimitAdmin_Revert() public {
+ function test_RevertWhen_OnlyOwnerOrRateLimitAdmin() public {
vm.startPrank(STRANGER);
vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, STRANGER));
@@ -59,7 +59,7 @@ contract TokenPool_setChainRateLimiterConfig is TokenPoolSetup {
);
}
- function test_NonExistentChain_Revert() public {
+ function test_RevertWhen_NonExistentChain() public {
uint64 wrongChainSelector = 9084102894;
vm.expectRevert(abi.encodeWithSelector(TokenPool.NonExistentChain.selector, wrongChainSelector));
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setChainRateLimiterConfigs.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setChainRateLimiterConfigs.t.sol
index 716e06734ee..27e01fd5921 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setChainRateLimiterConfigs.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setChainRateLimiterConfigs.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
@@ -79,7 +79,7 @@ contract TokenPool_setChainRateLimiterConfigs is TokenPoolSetup {
// Reverts
- function test_OnlyOwnerOrRateLimitAdmin_Revert() public {
+ function test_RevertWhen_OnlyOwnerOrRateLimitAdmin() public {
uint64[] memory chainSelectors = new uint64[](1);
chainSelectors[0] = DEST_CHAIN_SELECTOR;
@@ -95,7 +95,7 @@ contract TokenPool_setChainRateLimiterConfigs is TokenPoolSetup {
s_tokenPool.setChainRateLimiterConfigs(chainSelectors, newOutboundConfigs, newInboundConfigs);
}
- function test_NonExistentChain_Revert() public {
+ function test_RevertWhen_NonExistentChain() public {
uint64 wrongChainSelector = 9084102894;
uint64[] memory chainSelectors = new uint64[](1);
@@ -108,7 +108,7 @@ contract TokenPool_setChainRateLimiterConfigs is TokenPoolSetup {
s_tokenPool.setChainRateLimiterConfigs(chainSelectors, newOutboundConfigs, newInboundConfigs);
}
- function test_MismatchedArrayLengths_Revert() public {
+ function test_RevertWhen_MismatchedArrayLengths() public {
uint64[] memory chainSelectors = new uint64[](1);
RateLimiter.Config[] memory newOutboundConfigs = new RateLimiter.Config[](1);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setRateLimitAdmin.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setRateLimitAdmin.t.sol
index 7c57741cf42..0d6622f859a 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setRateLimitAdmin.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setRateLimitAdmin.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
@@ -7,7 +7,7 @@ import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolSetup} from "./TokenPoolSetup.t.sol";
contract TokenPool_setRateLimitAdmin is TokenPoolSetup {
- function test_SetRateLimitAdmin_Success() public {
+ function test_SetRateLimitAdmin() public {
assertEq(address(0), s_tokenPool.getRateLimitAdmin());
vm.expectEmit();
emit TokenPool.RateLimitAdminSet(OWNER);
@@ -17,7 +17,7 @@ contract TokenPool_setRateLimitAdmin is TokenPoolSetup {
// Reverts
- function test_SetRateLimitAdmin_Revert() public {
+ function test_RevertWhen_SetRateLimitAdmin() public {
vm.startPrank(STRANGER);
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setRouter.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setRouter.t.sol
index 4bf85f3af9f..37108e3899b 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setRouter.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPool.setRouter.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPool} from "../../../pools/TokenPool.sol";
import {TokenPoolWithAllowListSetup} from "./TokenPoolWithAllowListSetup.t.sol";
contract TokenPoolWithAllowList_setRouter is TokenPoolWithAllowListSetup {
- function test_SetRouter_Success() public {
+ function test_SetRouter() public {
assertEq(address(s_sourceRouter), s_tokenPool.getRouter());
address newRouter = makeAddr("newRouter");
@@ -20,7 +20,7 @@ contract TokenPoolWithAllowList_setRouter is TokenPoolWithAllowListSetup {
// Reverts
- function test_ZeroAddressNotAllowed_Revert() public {
+ function test_RevertWhen_ZeroAddressNotAllowed() public {
address newRouter = address(0);
vm.expectRevert(TokenPool.ZeroAddressNotAllowed.selector);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPoolSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPoolSetup.t.sol
index b2bdeefee12..0fb44fba024 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPoolSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPoolSetup.t.sol
@@ -1,14 +1,14 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC20} from "../../../../shared/token/ERC20/BurnMintERC20.sol";
import {TokenPool} from "../../../pools/TokenPool.sol";
+import {BaseTest} from "../../BaseTest.t.sol";
import {TokenPoolHelper} from "../../helpers/TokenPoolHelper.sol";
-import {RouterSetup} from "../../router/Router/RouterSetup.t.sol";
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
-contract TokenPoolSetup is RouterSetup {
+contract TokenPoolSetup is BaseTest {
IERC20 internal s_token;
TokenPoolHelper internal s_tokenPool;
@@ -16,12 +16,12 @@ contract TokenPoolSetup is RouterSetup {
address internal s_initialRemoteToken = makeAddr("initialRemoteToken");
function setUp() public virtual override {
- RouterSetup.setUp();
+ super.setUp();
s_token = new BurnMintERC20("LINK", "LNK", 18, 0, 0);
deal(address(s_token), OWNER, type(uint256).max);
s_tokenPool = new TokenPoolHelper(
- s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMN), address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, new address[](0), address(s_mockRMNRemote), address(s_sourceRouter)
);
bytes[] memory remotePoolAddresses = new bytes[](1);
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPoolWithAllowListSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPoolWithAllowListSetup.t.sol
index 478e8996376..f69b004d548 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPoolWithAllowListSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool/TokenPoolWithAllowListSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPoolHelper} from "../../helpers/TokenPoolHelper.sol";
import {TokenPoolSetup} from "./TokenPoolSetup.t.sol";
@@ -14,7 +14,7 @@ contract TokenPoolWithAllowListSetup is TokenPoolSetup {
s_allowedSenders.push(OWNER);
s_tokenPool = new TokenPoolHelper(
- s_token, DEFAULT_TOKEN_DECIMALS, s_allowedSenders, address(s_mockRMN), address(s_sourceRouter)
+ s_token, DEFAULT_TOKEN_DECIMALS, s_allowedSenders, address(s_mockRMNRemote), address(s_sourceRouter)
);
}
}
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.lockOrBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.lockOrBurn.t.sol
index 394357f213f..51556b63d17 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.lockOrBurn.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.lockOrBurn.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITokenMessenger} from "../../../../pools/USDC/ITokenMessenger.sol";
@@ -11,7 +11,7 @@ import {USDCTokenPool} from "../../../../pools/USDC/USDCTokenPool.sol";
import {HybridLockReleaseUSDCTokenPoolSetup} from "./HybridLockReleaseUSDCTokenPoolSetup.t.sol";
contract HybridLockReleaseUSDCTokenPool_lockOrBurn is HybridLockReleaseUSDCTokenPoolSetup {
- function test_onLockReleaseMechanism_Success() public {
+ function test_onLockReleaseMechanism() public {
bytes32 receiver = bytes32(uint256(uint160(STRANGER)));
// Mark the destination chain as supporting CCTP, so use L/R instead.
@@ -47,7 +47,7 @@ contract HybridLockReleaseUSDCTokenPool_lockOrBurn is HybridLockReleaseUSDCToken
assertEq(s_token.balanceOf(address(s_usdcTokenPool)), amount, "Incorrect token amount in the tokenPool");
}
- function test_PrimaryMechanism_Success() public {
+ function test_PrimaryMechanism() public {
bytes32 receiver = bytes32(uint256(uint160(STRANGER)));
uint256 amount = 1;
@@ -91,9 +91,9 @@ contract HybridLockReleaseUSDCTokenPool_lockOrBurn is HybridLockReleaseUSDCToken
assertEq(s_mockUSDC.s_nonce() - 1, nonce);
}
- function test_onLockReleaseMechanism_thenSwitchToPrimary_Success() public {
+ function test_onLockReleaseMechanism_thenSwitchToPrimary() public {
// Test Enabling the LR mechanism and sending an outgoing message
- test_PrimaryMechanism_Success();
+ test_PrimaryMechanism();
// Disable the LR mechanism so that primary CCTP is used and then attempt to send a message
uint64[] memory destChainRemoves = new uint64[](1);
@@ -107,10 +107,10 @@ contract HybridLockReleaseUSDCTokenPool_lockOrBurn is HybridLockReleaseUSDCToken
s_usdcTokenPool.updateChainSelectorMechanisms(destChainRemoves, new uint64[](0));
// Send an outgoing message
- test_PrimaryMechanism_Success();
+ test_PrimaryMechanism();
}
- function test_WhileMigrationPause_Revert() public {
+ function test_RevertWhen_WhileMigrationPause() public {
// Mark the destination chain as supporting CCTP, so use L/R instead.
uint64[] memory destChainAdds = new uint64[](1);
destChainAdds[0] = DEST_CHAIN_SELECTOR;
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.releaseOrMint.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.releaseOrMint.t.sol
index ea3c581ea52..f528ea2586a 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.releaseOrMint.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.releaseOrMint.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../../../libraries/Internal.sol";
import {Pool} from "../../../../libraries/Pool.sol";
@@ -12,7 +12,7 @@ import {MockE2EUSDCTransmitter} from "../../../mocks/MockE2EUSDCTransmitter.sol"
import {HybridLockReleaseUSDCTokenPoolSetup} from "./HybridLockReleaseUSDCTokenPoolSetup.t.sol";
contract HybridLockReleaseUSDCTokenPool_releaseOrMint is HybridLockReleaseUSDCTokenPoolSetup {
- function test_OnLockReleaseMechanism_Success() public {
+ function test_OnLockReleaseMechanism() public {
address recipient = address(1234);
// Designate the SOURCE_CHAIN as not using native-USDC, and so the L/R mechanism must be used instead
@@ -120,7 +120,7 @@ contract HybridLockReleaseUSDCTokenPool_releaseOrMint is HybridLockReleaseUSDCTo
);
}
- function test_WhileMigrationPause_Revert() public {
+ function test_RevertWhen_WhileMigrationPause() public {
address recipient = address(1234);
// Designate the SOURCE_CHAIN as not using native-USDC, and so the L/R mechanism must be used instead
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.transferLiquidity.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.transferLiquidity.t.sol
index 4e5a45a1438..d0600d26b88 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.transferLiquidity.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.transferLiquidity.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ILiquidityContainer} from "../../../../../liquiditymanager/interfaces/ILiquidityContainer.sol";
@@ -7,7 +7,7 @@ import {HybridLockReleaseUSDCTokenPool} from "../../../../pools/USDC/HybridLockR
import {HybridLockReleaseUSDCTokenPoolSetup} from "./HybridLockReleaseUSDCTokenPoolSetup.t.sol";
contract HybridLockReleaseUSDCTokenPool_TransferLiquidity is HybridLockReleaseUSDCTokenPoolSetup {
- function test_transferLiquidity_Success() public {
+ function test_transferLiquidity() public {
// Set as the OWNER so we can provide liquidity
vm.startPrank(OWNER);
@@ -63,7 +63,7 @@ contract HybridLockReleaseUSDCTokenPool_TransferLiquidity is HybridLockReleaseUS
);
}
- function test_cannotTransferLiquidityDuringPendingMigration_Revert() public {
+ function test_RevertWhen_cannotTransferLiquidityDuringPendingMigration() public {
// Set as the OWNER so we can provide liquidity
vm.startPrank(OWNER);
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPoolSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPoolSetup.t.sol
index 9b318b782ce..13262fa6472 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPoolSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPoolSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC677} from "../../../../../shared/token/ERC677/BurnMintERC677.sol";
@@ -15,11 +15,13 @@ contract HybridLockReleaseUSDCTokenPoolSetup is USDCSetup {
function setUp() public virtual override {
super.setUp();
- s_usdcTokenPool =
- new HybridLockReleaseUSDCTokenPool(s_mockUSDC, s_token, new address[](0), address(s_mockRMN), address(s_router));
+ s_usdcTokenPool = new HybridLockReleaseUSDCTokenPool(
+ s_mockUSDC, s_token, new address[](0), address(s_mockRMNRemote), address(s_router)
+ );
- s_usdcTokenPoolTransferLiquidity =
- new HybridLockReleaseUSDCTokenPool(s_mockUSDC, s_token, new address[](0), address(s_mockRMN), address(s_router));
+ s_usdcTokenPoolTransferLiquidity = new HybridLockReleaseUSDCTokenPool(
+ s_mockUSDC, s_token, new address[](0), address(s_mockRMNRemote), address(s_router)
+ );
BurnMintERC677(address(s_token)).grantMintAndBurnRoles(address(s_usdcTokenPool));
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.burnLockedUSDC.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.burnLockedUSDC.t.sol
index 52ddb9dad4c..59055fe4978 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.burnLockedUSDC.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.burnLockedUSDC.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Pool} from "../../../../libraries/Pool.sol";
import {TokenPool} from "../../../../pools/TokenPool.sol";
@@ -8,7 +8,7 @@ import {HybridLockReleaseUSDCTokenPool_lockOrBurn} from
"../HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.lockOrBurn.t.sol";
contract USDCBridgeMigrator_BurnLockedUSDC is HybridLockReleaseUSDCTokenPool_lockOrBurn {
- function test_lockOrBurn_then_BurnInCCTPMigration_Success() public {
+ function test_lockOrBurn_then_BurnInCCTPMigration() public {
bytes32 receiver = bytes32(uint256(uint160(STRANGER)));
address CIRCLE = makeAddr("CIRCLE CCTP Migrator");
@@ -96,10 +96,10 @@ contract USDCBridgeMigrator_BurnLockedUSDC is HybridLockReleaseUSDCTokenPool_loc
s_usdcTokenPool.shouldUseLockRelease(DEST_CHAIN_SELECTOR), "Lock/Release mech should be disabled after a burn"
);
- test_PrimaryMechanism_Success();
+ test_PrimaryMechanism();
}
- function test_invalidPermissions_Revert() public {
+ function test_RevertWhen_invalidPermissions() public {
address CIRCLE = makeAddr("CIRCLE");
vm.startPrank(OWNER);
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.cancelMigrationProposal.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.cancelMigrationProposal.t.sol
index f4f56cba3e6..40df069d80e 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.cancelMigrationProposal.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.cancelMigrationProposal.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {USDCBridgeMigrator} from "../../../../pools/USDC/USDCBridgeMigrator.sol";
import {HybridLockReleaseUSDCTokenPoolSetup} from "./USDCBridgeMigratorSetup.t.sol";
contract USDCBridgeMigrator_cancelMigrationProposal is HybridLockReleaseUSDCTokenPoolSetup {
- function test_cancelExistingCCTPMigrationProposal_Success() public {
+ function test_cancelExistingCCTPMigrationProposal() public {
vm.startPrank(OWNER);
// Mark the destination chain as supporting CCTP, so use L/R instead.
@@ -40,7 +40,7 @@ contract USDCBridgeMigrator_cancelMigrationProposal is HybridLockReleaseUSDCToke
s_usdcTokenPool.cancelExistingCCTPMigrationProposal();
}
- function test_cannotCancelANonExistentMigrationProposal_Revert() public {
+ function test_RevertWhen_cannotCancelANonExistentMigrationProposal() public {
vm.expectRevert(USDCBridgeMigrator.NoMigrationProposalPending.selector);
// Proposal to migrate doesn't exist, and so the chain selector is zero, and therefore should revert
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.excludeTokensFromBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.excludeTokensFromBurn.t.sol
index 855db7c5c64..441de21d0a2 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.excludeTokensFromBurn.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.excludeTokensFromBurn.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {USDCBridgeMigrator} from "../../../../pools/USDC/USDCBridgeMigrator.sol";
import {HybridLockReleaseUSDCTokenPoolSetup} from "./USDCBridgeMigratorSetup.t.sol";
contract USDCBridgeMigrator_excludeTokensFromBurn is HybridLockReleaseUSDCTokenPoolSetup {
- function test_excludeTokensWhenNoMigrationProposalPending_Revert() public {
+ function test_RevertWhen_excludeTokensWhenNoMigrationProposalPending() public {
vm.expectRevert(abi.encodeWithSelector(USDCBridgeMigrator.NoMigrationProposalPending.selector));
vm.startPrank(OWNER);
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.proposeMigration.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.proposeMigration.t.sol
index b2668bde801..b7c2b46820f 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.proposeMigration.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.proposeMigration.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {USDCBridgeMigrator} from "../../../../pools/USDC/USDCBridgeMigrator.sol";
import {HybridLockReleaseUSDCTokenPoolSetup} from "./USDCBridgeMigratorSetup.t.sol";
contract USDCBridgeMigrator_proposeMigration is HybridLockReleaseUSDCTokenPoolSetup {
- function test_ChainNotUsingLockRelease_Revert() public {
+ function test_RevertWhen_ChainNotUsingLockRelease() public {
vm.expectRevert(abi.encodeWithSelector(USDCBridgeMigrator.InvalidChainSelector.selector));
vm.startPrank(OWNER);
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.provideLiquidity.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.provideLiquidity.t.sol
index 88196d87795..5163f23f97f 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.provideLiquidity.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.provideLiquidity.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {TokenPool} from "../../../../pools/TokenPool.sol";
import {HybridLockReleaseUSDCTokenPool} from "../../../../pools/USDC/HybridLockReleaseUSDCTokenPool.sol";
import {USDCBridgeMigrator_BurnLockedUSDC} from "./USDCBridgeMigrator.burnLockedUSDC.t.sol";
contract USDCBridgeMigrator_provideLiquidity is USDCBridgeMigrator_BurnLockedUSDC {
- function test_cannotModifyLiquidityWithoutPermissions_Revert() public {
+ function test_RevertWhen_cannotModifyLiquidityWithoutPermissions() public {
address randomAddr = makeAddr("RANDOM");
vm.startPrank(randomAddr);
@@ -17,8 +17,8 @@ contract USDCBridgeMigrator_provideLiquidity is USDCBridgeMigrator_BurnLockedUSD
s_usdcTokenPool.provideLiquidity(DEST_CHAIN_SELECTOR, 1e6);
}
- function test_cannotProvideLiquidity_AfterMigration_Revert() public {
- test_lockOrBurn_then_BurnInCCTPMigration_Success();
+ function test_RevertWhen_cannotProvideLiquidity_AfterMigration() public {
+ test_lockOrBurn_then_BurnInCCTPMigration();
vm.startPrank(OWNER);
@@ -31,7 +31,7 @@ contract USDCBridgeMigrator_provideLiquidity is USDCBridgeMigrator_BurnLockedUSD
s_usdcTokenPool.provideLiquidity(DEST_CHAIN_SELECTOR, 1e6);
}
- function test_cannotProvideLiquidityWhenMigrationProposalPending_Revert() public {
+ function test_RevertWhen_cannotProvideLiquidityWhenMigrationProposalPending() public {
vm.startPrank(OWNER);
// Mark the destination chain as supporting CCTP, so use L/R instead.
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.releaseOrMint.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.releaseOrMint.t.sol
index 40569603e96..46861d614b6 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.releaseOrMint.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.releaseOrMint.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../../../libraries/Internal.sol";
import {Pool} from "../../../../libraries/Pool.sol";
@@ -11,7 +11,7 @@ import {HybridLockReleaseUSDCTokenPool_releaseOrMint} from
"../HybridLockReleaseUSDCTokenPool/HybridLockReleaseUSDCTokenPool.releaseOrMint.t.sol";
contract USDCBridgeMigrator_releaseOrMint is HybridLockReleaseUSDCTokenPool_releaseOrMint {
- function test_unstickManualTxAfterMigration_destChain_Success() public {
+ function test_unstickManualTxAfterMigration_destChain() public {
address recipient = address(1234);
// Test the edge case where a tx is stuck in the manual tx queue and the destination chain is the one that
// should process is after a migration. I.E the message will have the Lock-Release flag set in the OffChainData,
@@ -83,7 +83,7 @@ contract USDCBridgeMigrator_releaseOrMint is HybridLockReleaseUSDCTokenPool_rele
);
}
- function test_unstickManualTxAfterMigration_homeChain_Success() public {
+ function test_unstickManualTxAfterMigration_homeChain() public {
address CIRCLE = makeAddr("CIRCLE");
address recipient = address(1234);
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.updateChainSelectorMechanism.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.updateChainSelectorMechanism.t.sol
index 9db74061a31..160c09f7431 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.updateChainSelectorMechanism.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigrator.updateChainSelectorMechanism.t.sol
@@ -1,13 +1,13 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {HybridLockReleaseUSDCTokenPool} from "../../../../pools/USDC/HybridLockReleaseUSDCTokenPool.sol";
import {USDCBridgeMigrator_BurnLockedUSDC} from "./USDCBridgeMigrator.burnLockedUSDC.t.sol";
contract USDCBridgeMigrator_updateChainSelectorMechanism is USDCBridgeMigrator_BurnLockedUSDC {
- function test_cannotRevertChainMechanism_afterMigration_Revert() public {
- test_lockOrBurn_then_BurnInCCTPMigration_Success();
+ function test_RevertWhen_cannotRevertChainMechanism_afterMigration() public {
+ test_lockOrBurn_then_BurnInCCTPMigration();
vm.startPrank(OWNER);
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigratorSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigratorSetup.t.sol
index 5a250fd16a8..bf9af4c66ad 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigratorSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCBridgeMigrator/USDCBridgeMigratorSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {HybridLockReleaseUSDCTokenPool} from "../../../../pools/USDC/HybridLockReleaseUSDCTokenPool.sol";
import {USDCSetup} from "../USDCSetup.t.sol";
@@ -11,10 +11,12 @@ contract HybridLockReleaseUSDCTokenPoolSetup is USDCSetup {
function setUp() public virtual override {
super.setUp();
- s_usdcTokenPool =
- new HybridLockReleaseUSDCTokenPool(s_mockUSDC, s_token, new address[](0), address(s_mockRMN), address(s_router));
+ s_usdcTokenPool = new HybridLockReleaseUSDCTokenPool(
+ s_mockUSDC, s_token, new address[](0), address(s_mockRMNRemote), address(s_router)
+ );
- s_usdcTokenPoolTransferLiquidity =
- new HybridLockReleaseUSDCTokenPool(s_mockUSDC, s_token, new address[](0), address(s_mockRMN), address(s_router));
+ s_usdcTokenPoolTransferLiquidity = new HybridLockReleaseUSDCTokenPool(
+ s_mockUSDC, s_token, new address[](0), address(s_mockRMNRemote), address(s_router)
+ );
}
}
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCSetup.t.sol
index 9ec89b52582..e000999cb30 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../../shared/token/ERC20/IBurnMintERC20.sol";
@@ -85,7 +85,7 @@ contract USDCSetup is BaseTest {
}
function _setUpRamps() internal {
- s_router = new Router(address(s_token), address(s_mockRMN));
+ s_router = new Router(address(s_token), address(s_mockRMNRemote));
Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](1);
onRampUpdates[0] = Router.OnRamp({destChainSelector: DEST_CHAIN_SELECTOR, onRamp: s_routerAllowedOnRamp});
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.lockOrBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.lockOrBurn.t.sol
index 03d328b8e8c..484c795b375 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.lockOrBurn.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.lockOrBurn.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITokenMessenger} from "../../../../pools/USDC/ITokenMessenger.sol";
@@ -12,7 +12,7 @@ import {USDCTokenPoolSetup} from "./USDCTokenPoolSetup.t.sol";
contract USDCTokenPool_lockOrBurn is USDCTokenPoolSetup {
// Base test case, included for PR gas comparisons as fuzz tests are excluded from forge snapshot due to being flaky.
- function test_LockOrBurn_Success() public {
+ function test_LockOrBurn() public {
bytes32 receiver = bytes32(uint256(uint160(STRANGER)));
uint256 amount = 1;
s_token.transfer(address(s_usdcTokenPool), amount);
@@ -132,7 +132,7 @@ contract USDCTokenPool_lockOrBurn is USDCTokenPoolSetup {
}
// Reverts
- function test_UnknownDomain_Revert() public {
+ function test_RevertWhen_UnknownDomain() public {
uint64 wrongDomain = DEST_CHAIN_SELECTOR + 1;
// We need to setup the wrong chainSelector so it reaches the domain check
Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](1);
@@ -168,7 +168,7 @@ contract USDCTokenPool_lockOrBurn is USDCTokenPoolSetup {
);
}
- function test_CallerIsNotARampOnRouter_Revert() public {
+ function test_RevertWhen_CallerIsNotARampOnRouter() public {
vm.expectRevert(abi.encodeWithSelector(TokenPool.CallerIsNotARampOnRouter.selector, OWNER));
s_usdcTokenPool.lockOrBurn(
@@ -182,7 +182,7 @@ contract USDCTokenPool_lockOrBurn is USDCTokenPoolSetup {
);
}
- function test_LockOrBurnWithAllowList_Revert() public {
+ function test_RevertWhen_LockOrBurnWithAllowList() public {
vm.startPrank(s_routerAllowedOnRamp);
vm.expectRevert(abi.encodeWithSelector(TokenPool.SenderNotAllowed.selector, STRANGER));
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.releaseOrMint.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.releaseOrMint.t.sol
index 4499c748a6b..0dfe1dc4925 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.releaseOrMint.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.releaseOrMint.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Internal} from "../../../../libraries/Internal.sol";
import {Pool} from "../../../../libraries/Pool.sol";
@@ -84,7 +84,7 @@ contract USDCTokenPool_releaseOrMint is USDCTokenPoolSetup {
}
// https://etherscan.io/tx/0xac9f501fe0b76df1f07a22e1db30929fd12524bc7068d74012dff948632f0883
- function test_ReleaseOrMintRealTx_Success() public {
+ function test_ReleaseOrMintRealTx() public {
bytes memory encodedUsdcMessage =
hex"000000000000000300000000000000000000127a00000000000000000000000019330d10d9cc8751218eaf51e8885d058642e08a000000000000000000000000bd3fa81b58ba92a82136038b25adec7066af3155000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58310000000000000000000000004af08f56978be7dce2d1be3c65c005b41e79401c000000000000000000000000000000000000000000000000000000002057ff7a0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a50000000000000000000000000000000000000000000000000000000000000000000000000000008274119237535fd659626b090f87e365ff89ebc7096bb32e8b0e85f155626b73ae7c4bb2485c184b7cc3cf7909045487890b104efb62ae74a73e32901bdcec91df1bb9ee08ccb014fcbcfe77b74d1263fd4e0b0e8de05d6c9a5913554364abfd5ea768b222f50c715908183905d74044bb2b97527c7e70ae7983c443a603557cac3b1c000000000000000000000000000000000000000000000000000000000000";
bytes memory attestation = bytes("attestation bytes");
@@ -127,7 +127,7 @@ contract USDCTokenPool_releaseOrMint is USDCTokenPoolSetup {
}
// Reverts
- function test_UnlockingUSDCFailed_Revert() public {
+ function test_RevertWhen_UnlockingUSDCFailed() public {
vm.startPrank(s_routerAllowedOffRamp);
s_mockUSDCTransmitter.setShouldSucceed(false);
@@ -179,7 +179,7 @@ contract USDCTokenPool_releaseOrMint is USDCTokenPoolSetup {
);
}
- function test_TokenMaxCapacityExceeded_Revert() public {
+ function test_RevertWhen_TokenMaxCapacityExceeded() public {
uint256 capacity = _getInboundRateLimiterConfig().capacity;
uint256 amount = 10 * capacity;
address recipient = address(1);
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.setDomains.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.setDomains.t.sol
index 7fcb75fdf3f..0d4ff379dd7 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.setDomains.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.setDomains.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../../shared/access/Ownable2Step.sol";
import {USDCTokenPool} from "../../../../pools/USDC/USDCTokenPool.sol";
@@ -47,7 +47,7 @@ contract USDCTokenPool_setDomains is USDCTokenPoolSetup {
// Reverts
- function test_OnlyOwner_Revert() public {
+ function test_RevertWhen_OnlyOwner() public {
USDCTokenPool.DomainUpdate[] memory domainUpdates = new USDCTokenPool.DomainUpdate[](0);
vm.startPrank(STRANGER);
@@ -56,7 +56,7 @@ contract USDCTokenPool_setDomains is USDCTokenPoolSetup {
s_usdcTokenPool.setDomains(domainUpdates);
}
- function test_InvalidDomain_Revert() public {
+ function test_RevertWhen_InvalidDomain() public {
bytes32 validCaller = bytes32(uint256(25));
// Ensure valid domain works
USDCTokenPool.DomainUpdate[] memory domainUpdates = new USDCTokenPool.DomainUpdate[](1);
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.supportsInterface.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.supportsInterface.t.sol
index 05ac5f08136..304791ae2e6 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.supportsInterface.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.supportsInterface.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IPoolV1} from "../../../../interfaces/IPool.sol";
import {USDCTokenPoolSetup} from "./USDCTokenPoolSetup.t.sol";
@@ -7,7 +7,7 @@ import {USDCTokenPoolSetup} from "./USDCTokenPoolSetup.t.sol";
import {IERC165} from "../../../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol";
contract USDCTokenPool_supportsInterface is USDCTokenPoolSetup {
- function test_SupportsInterface_Success() public view {
+ function test_SupportsInterface() public view {
assertTrue(s_usdcTokenPool.supportsInterface(type(IPoolV1).interfaceId));
assertTrue(s_usdcTokenPool.supportsInterface(type(IERC165).interfaceId));
}
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.validateMessage.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.validateMessage.t.sol
index 975368c38b9..deaee56c7c7 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.validateMessage.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPool.validateMessage.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {USDCTokenPool} from "../../../../pools/USDC/USDCTokenPool.sol";
import {USDCTokenPoolSetup} from "./USDCTokenPoolSetup.t.sol";
@@ -28,7 +28,7 @@ contract USDCTokenPool__validateMessage is USDCTokenPoolSetup {
// Reverts
- function test_ValidateInvalidMessage_Revert() public {
+ function test_RevertWhen_ValidateInvalidMessage() public {
USDCMessage memory usdcMessage = USDCMessage({
version: 0,
sourceDomain: 1553252,
diff --git a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPoolSetup.t.sol b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPoolSetup.t.sol
index bc6108926b3..0166fe4b645 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPoolSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDC/USDCTokenPool/USDCTokenPoolSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {USDCTokenPool} from "../../../../pools/USDC/USDCTokenPool.sol";
import {USDCTokenPoolHelper} from "../../../helpers/USDCTokenPoolHelper.sol";
@@ -14,11 +14,11 @@ contract USDCTokenPoolSetup is USDCSetup {
super.setUp();
s_usdcTokenPool =
- new USDCTokenPoolHelper(s_mockUSDC, s_token, new address[](0), address(s_mockRMN), address(s_router));
+ new USDCTokenPoolHelper(s_mockUSDC, s_token, new address[](0), address(s_mockRMNRemote), address(s_router));
- s_allowedList.push(USER_1);
+ s_allowedList.push(vm.randomAddress());
s_usdcTokenPoolWithAllowList =
- new USDCTokenPoolHelper(s_mockUSDC, s_token, s_allowedList, address(s_mockRMN), address(s_router));
+ new USDCTokenPoolHelper(s_mockUSDC, s_token, s_allowedList, address(s_mockRMNRemote), address(s_router));
_poolApplyChainUpdates(address(s_usdcTokenPool));
_poolApplyChainUpdates(address(s_usdcTokenPoolWithAllowList));
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiterSetup.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiterSetup.t.sol
index d3e87f5faa4..73dbeff1bf4 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiterSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiterSetup.t.sol
@@ -1,16 +1,14 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiAggregateRateLimiter} from "../../../MultiAggregateRateLimiter.sol";
import {Client} from "../../../libraries/Client.sol";
import {Internal} from "../../../libraries/Internal.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
-import {BaseTest} from "../../BaseTest.t.sol";
-
import {FeeQuoterSetup} from "../../feeQuoter/FeeQuoterSetup.t.sol";
import {MultiAggregateRateLimiterHelper} from "../../helpers/MultiAggregateRateLimiterHelper.sol";
-contract MultiAggregateRateLimiterSetup is BaseTest, FeeQuoterSetup {
+contract MultiAggregateRateLimiterSetup is FeeQuoterSetup {
MultiAggregateRateLimiterHelper internal s_rateLimiter;
address internal constant TOKEN = 0x21118E64E1fB0c487F25Dd6d3601FF6af8D32E4e;
@@ -27,8 +25,7 @@ contract MultiAggregateRateLimiterSetup is BaseTest, FeeQuoterSetup {
address[] internal s_authorizedCallers;
- function setUp() public virtual override(BaseTest, FeeQuoterSetup) {
- BaseTest.setUp();
+ function setUp() public virtual override {
FeeQuoterSetup.setUp();
Internal.PriceUpdates memory priceUpdates = _getSingleTokenPriceUpdateStruct(TOKEN, TOKEN_PRICE);
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_applyRateLimiterConfigUpdates.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_applyRateLimiterConfigUpdates.t.sol
index 306be6b5956..78f2101b852 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_applyRateLimiterConfigUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_applyRateLimiterConfigUpdates.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {MultiAggregateRateLimiter} from "../../../MultiAggregateRateLimiter.sol";
@@ -9,7 +9,7 @@ import {MultiAggregateRateLimiterSetup} from "./MultiAggregateRateLimiterSetup.t
import {Vm} from "forge-std/Vm.sol";
contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggregateRateLimiterSetup {
- function test_ZeroConfigs_Success() public {
+ function test_ZeroConfigs() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](0);
@@ -20,7 +20,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
assertEq(logEntries.length, 0);
}
- function test_SingleConfig_Success() public {
+ function test_SingleConfig() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -46,7 +46,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
assertEq(BLOCK_TIME, bucket1.lastUpdated);
}
- function test_SingleConfigOutbound_Success() public {
+ function test_SingleConfigOutbound() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -72,7 +72,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
assertEq(BLOCK_TIME, bucket1.lastUpdated);
}
- function test_MultipleConfigs_Success() public {
+ function test_MultipleConfigs() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](5);
@@ -103,7 +103,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
}
}
- function test_MultipleConfigsBothLanes_Success() public {
+ function test_MultipleConfigsBothLanes() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](2);
@@ -134,7 +134,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
}
}
- function test_UpdateExistingConfig_Success() public {
+ function test_UpdateExistingConfig() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -170,7 +170,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
);
}
- function test_UpdateExistingConfigWithNoDifference_Success() public {
+ function test_UpdateExistingConfigWithNoDifference() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -198,7 +198,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
}
// Reverts
- function test_ZeroChainSelector_Revert() public {
+ function test_RevertWhen_ZeroChainSelector() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -211,7 +211,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
s_rateLimiter.applyRateLimiterConfigUpdates(configUpdates);
}
- function test_OnlyCallableByOwner_Revert() public {
+ function test_RevertWhen_OnlyCallableByOwner() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -225,7 +225,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
s_rateLimiter.applyRateLimiterConfigUpdates(configUpdates);
}
- function test_ConfigRateMoreThanCapacity_Revert() public {
+ function test_RevertWhen_ConfigRateMoreThanCapacity() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -240,7 +240,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
s_rateLimiter.applyRateLimiterConfigUpdates(configUpdates);
}
- function test_ConfigRateZero_Revert() public {
+ function test_RevertWhen_ConfigRateZero() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -255,7 +255,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
s_rateLimiter.applyRateLimiterConfigUpdates(configUpdates);
}
- function test_DisableConfigRateNonZero_Revert() public {
+ function test_RevertWhen_DisableConfigRateNonZero() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -270,7 +270,7 @@ contract MultiAggregateRateLimiter_applyRateLimiterConfigUpdates is MultiAggrega
s_rateLimiter.applyRateLimiterConfigUpdates(configUpdates);
}
- function test_DiableConfigCapacityNonZero_Revert() public {
+ function test_RevertWhen_DiableConfigCapacityNonZero() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_constructor.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_constructor.t.sol
index 0f858a79a56..c9ea2bce69a 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_constructor.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiAggregateRateLimiter} from "../../../MultiAggregateRateLimiter.sol";
import {MultiAggregateRateLimiterHelper} from "../../helpers/MultiAggregateRateLimiterHelper.sol";
@@ -7,7 +7,7 @@ import {MultiAggregateRateLimiterSetup} from "./MultiAggregateRateLimiterSetup.t
import {Vm} from "forge-std/Vm.sol";
contract MultiAggregateRateLimiter_constructor is MultiAggregateRateLimiterSetup {
- function test_ConstructorNoAuthorizedCallers_Success() public {
+ function test_ConstructorNoAuthorizedCallers() public {
address[] memory authorizedCallers = new address[](0);
vm.recordLogs();
@@ -21,7 +21,7 @@ contract MultiAggregateRateLimiter_constructor is MultiAggregateRateLimiterSetup
assertEq(address(s_feeQuoter), s_rateLimiter.getFeeQuoter());
}
- function test_Constructor_Success() public {
+ function test_Constructor() public {
address[] memory authorizedCallers = new address[](2);
authorizedCallers[0] = MOCK_OFFRAMP;
authorizedCallers[1] = MOCK_ONRAMP;
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_getTokenBucket.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_getTokenBucket.t.sol
index bfb5da07da3..dabf1b60c9a 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_getTokenBucket.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_getTokenBucket.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiAggregateRateLimiter} from "../../../MultiAggregateRateLimiter.sol";
import {RateLimiter} from "../../../libraries/RateLimiter.sol";
@@ -8,7 +8,7 @@ import {MultiAggregateRateLimiterSetup} from "./MultiAggregateRateLimiterSetup.t
import {stdError} from "forge-std/Test.sol";
contract MultiAggregateRateLimiter_getTokenBucket is MultiAggregateRateLimiterSetup {
- function test_GetTokenBucket_Success() public view {
+ function test_GetTokenBucket() public view {
RateLimiter.TokenBucket memory bucketInbound = s_rateLimiter.currentRateLimiterState(CHAIN_SELECTOR_1, false);
_assertConfigWithTokenBucketEquality(s_rateLimiterConfig1, bucketInbound);
assertEq(BLOCK_TIME, bucketInbound.lastUpdated);
@@ -18,7 +18,7 @@ contract MultiAggregateRateLimiter_getTokenBucket is MultiAggregateRateLimiterSe
assertEq(BLOCK_TIME, bucketOutbound.lastUpdated);
}
- function test_Refill_Success() public {
+ function test_Refill() public {
s_rateLimiterConfig1.capacity = s_rateLimiterConfig1.capacity * 2;
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
@@ -57,7 +57,7 @@ contract MultiAggregateRateLimiter_getTokenBucket is MultiAggregateRateLimiterSe
// Reverts
- function test_TimeUnderflow_Revert() public {
+ function test_RevertWhen_TimeUnderflow() public {
vm.warp(BLOCK_TIME - 1);
vm.expectRevert(stdError.arithmeticError);
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_getTokenValue.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_getTokenValue.t.sol
index 9b4448339e8..a70c28ec875 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_getTokenValue.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_getTokenValue.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {MultiAggregateRateLimiter} from "../../../MultiAggregateRateLimiter.sol";
import {Client} from "../../../libraries/Client.sol";
import {MultiAggregateRateLimiterSetup} from "./MultiAggregateRateLimiterSetup.t.sol";
contract MultiAggregateRateLimiter_getTokenValue is MultiAggregateRateLimiterSetup {
- function test_GetTokenValue_Success() public view {
+ function test_GetTokenValue() public view {
uint256 numberOfTokens = 10;
Client.EVMTokenAmount memory tokenAmount = Client.EVMTokenAmount({token: TOKEN, amount: 10});
uint256 value = s_rateLimiter.getTokenValue(tokenAmount);
@@ -14,7 +14,7 @@ contract MultiAggregateRateLimiter_getTokenValue is MultiAggregateRateLimiterSet
}
// Reverts
- function test_NoTokenPrice_Reverts() public {
+ function test_RevertWhen_NoTokenPrices() public {
address tokenWithNoPrice = makeAddr("Token with no price");
Client.EVMTokenAmount memory tokenAmount = Client.EVMTokenAmount({token: tokenWithNoPrice, amount: 10});
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_onInboundMessage.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_onInboundMessage.t.sol
index 8697dae871e..48f7ec88a42 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_onInboundMessage.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_onInboundMessage.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {AuthorizedCallers} from "../../../../shared/access/AuthorizedCallers.sol";
import {MultiAggregateRateLimiter} from "../../../MultiAggregateRateLimiter.sol";
@@ -34,7 +34,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
s_rateLimiter.updateRateLimitTokens(new MultiAggregateRateLimiter.LocalRateLimitToken[](0), tokensToAdd);
}
- function test_ValidateMessageWithNoTokens_Success() public {
+ function test_ValidateMessageWithNoTokens() public {
vm.startPrank(MOCK_OFFRAMP);
vm.recordLogs();
@@ -45,7 +45,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
assertEq(logEntries.length, 0);
}
- function test_ValidateMessageWithTokens_Success() public {
+ function test_ValidateMessageWithTokens() public {
vm.startPrank(MOCK_OFFRAMP);
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2);
@@ -59,7 +59,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
s_rateLimiter.onInboundMessage(_generateAny2EVMMessage(CHAIN_SELECTOR_1, tokenAmounts));
}
- function test_ValidateMessageWithDisabledRateLimitToken_Success() public {
+ function test_ValidateMessageWithDisabledRateLimitToken() public {
MultiAggregateRateLimiter.LocalRateLimitToken[] memory removes =
new MultiAggregateRateLimiter.LocalRateLimitToken[](1);
removes[0] = MultiAggregateRateLimiter.LocalRateLimitToken({
@@ -80,7 +80,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
s_rateLimiter.onInboundMessage(_generateAny2EVMMessage(CHAIN_SELECTOR_1, tokenAmounts));
}
- function test_ValidateMessageWithRateLimitDisabled_Success() public {
+ function test_ValidateMessageWithRateLimitDisabled() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -104,7 +104,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
assertEq(logEntries.length, 0);
}
- function test_ValidateMessageWithTokensOnDifferentChains_Success() public {
+ function test_ValidateMessageWithTokensOnDifferentChains() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory tokensToAdd =
new MultiAggregateRateLimiter.RateLimitTokenArgs[](s_sourceTokens.length);
for (uint224 i = 0; i < s_sourceTokens.length; ++i) {
@@ -152,7 +152,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
assertEq(bucketChain2.capacity - totalValue, bucketChain2.tokens);
}
- function test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() public {
+ function test_ValidateMessageWithDifferentTokensOnDifferentChains() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory tokensToAdd =
new MultiAggregateRateLimiter.RateLimitTokenArgs[](1);
@@ -203,7 +203,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
assertEq(bucketChain2.capacity - totalValue2, bucketChain2.tokens);
}
- function test_ValidateMessageWithRateLimitReset_Success() public {
+ function test_ValidateMessageWithRateLimitReset() public {
vm.startPrank(MOCK_OFFRAMP);
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2);
@@ -228,7 +228,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
// Reverts
- function test_ValidateMessageWithRateLimitExceeded_Revert() public {
+ function test_RevertWhen_ValidateMessageWithRateLimitExceeded() public {
vm.startPrank(MOCK_OFFRAMP);
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2);
@@ -240,7 +240,7 @@ contract MultiAggregateRateLimiter_onInboundMessage is MultiAggregateRateLimiter
s_rateLimiter.onInboundMessage(_generateAny2EVMMessage(CHAIN_SELECTOR_1, tokenAmounts));
}
- function test_ValidateMessageFromUnauthorizedCaller_Revert() public {
+ function test_RevertWhen_ValidateMessageFromUnauthorizedCaller() public {
vm.startPrank(STRANGER);
vm.expectRevert(abi.encodeWithSelector(AuthorizedCallers.UnauthorizedCaller.selector, STRANGER));
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_onOutboundMessage.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_onOutboundMessage.t.sol
index 9d20e203619..7886a77f5b6 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_onOutboundMessage.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_onOutboundMessage.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {AuthorizedCallers} from "../../../../shared/access/AuthorizedCallers.sol";
import {MultiAggregateRateLimiter} from "../../../MultiAggregateRateLimiter.sol";
@@ -31,7 +31,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
s_rateLimiter.updateRateLimitTokens(new MultiAggregateRateLimiter.LocalRateLimitToken[](0), tokensToAdd);
}
- function test_ValidateMessageWithNoTokens_Success() public {
+ function test_ValidateMessageWithNoTokens() public {
vm.startPrank(MOCK_ONRAMP);
vm.recordLogs();
@@ -41,7 +41,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
assertEq(vm.getRecordedLogs().length, 0);
}
- function test_onOutboundMessage_ValidateMessageWithTokens_Success() public {
+ function test_onOutboundMessage_ValidateMessageWithTokens() public {
vm.startPrank(MOCK_ONRAMP);
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2);
@@ -55,7 +55,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
s_rateLimiter.onOutboundMessage(CHAIN_SELECTOR_1, _generateEVM2AnyMessage(tokenAmounts));
}
- function test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() public {
+ function test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken() public {
MultiAggregateRateLimiter.LocalRateLimitToken[] memory removes =
new MultiAggregateRateLimiter.LocalRateLimitToken[](1);
removes[0] = MultiAggregateRateLimiter.LocalRateLimitToken({
@@ -76,7 +76,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
s_rateLimiter.onOutboundMessage(CHAIN_SELECTOR_1, _generateEVM2AnyMessage(tokenAmounts));
}
- function test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() public {
+ function test_onOutboundMessage_ValidateMessageWithRateLimitDisabled() public {
MultiAggregateRateLimiter.RateLimiterConfigArgs[] memory configUpdates =
new MultiAggregateRateLimiter.RateLimiterConfigArgs[](1);
configUpdates[0] = MultiAggregateRateLimiter.RateLimiterConfigArgs({
@@ -99,7 +99,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
assertEq(vm.getRecordedLogs().length, 0);
}
- function test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() public {
+ function test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory tokensToAdd =
new MultiAggregateRateLimiter.RateLimitTokenArgs[](s_sourceTokens.length);
for (uint224 i = 0; i < s_sourceTokens.length; ++i) {
@@ -147,7 +147,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
assertEq(bucketChain2.capacity - totalValue, bucketChain2.tokens);
}
- function test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() public {
+ function test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory tokensToAdd =
new MultiAggregateRateLimiter.RateLimitTokenArgs[](1);
@@ -198,7 +198,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
assertEq(bucketChain2.capacity - totalValue2, bucketChain2.tokens);
}
- function test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() public {
+ function test_onOutboundMessage_ValidateMessageWithRateLimitReset() public {
vm.startPrank(MOCK_ONRAMP);
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2);
@@ -221,7 +221,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
s_rateLimiter.onOutboundMessage(CHAIN_SELECTOR_1, _generateEVM2AnyMessage(tokenAmounts));
}
- function test_RateLimitValueDifferentLanes_Success() public {
+ function test_RateLimitValueDifferentLanes() public {
vm.pauseGasMetering();
// start from blocktime that does not equal rate limiter init timestamp
vm.warp(BLOCK_TIME + 1);
@@ -266,7 +266,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
// Reverts
- function test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() public {
+ function test_RevertWhen_onOutboundMessage_ValidateMessageWithRateLimitExceeded() public {
vm.startPrank(MOCK_OFFRAMP);
Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](2);
@@ -278,7 +278,7 @@ contract MultiAggregateRateLimiter_onOutboundMessage is MultiAggregateRateLimite
s_rateLimiter.onOutboundMessage(CHAIN_SELECTOR_1, _generateEVM2AnyMessage(tokenAmounts));
}
- function test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() public {
+ function test_RevertWhen_onOutboundMessage_ValidateMessageFromUnauthorizedCaller() public {
vm.startPrank(STRANGER);
vm.expectRevert(abi.encodeWithSelector(AuthorizedCallers.UnauthorizedCaller.selector, STRANGER));
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_setFeeQuoter.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_setFeeQuoter.t.sol
index 39412a65045..77968339685 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_setFeeQuoter.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_setFeeQuoter.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {AuthorizedCallers} from "../../../../shared/access/AuthorizedCallers.sol";
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
@@ -7,7 +7,7 @@ import {MultiAggregateRateLimiter} from "../../../MultiAggregateRateLimiter.sol"
import {MultiAggregateRateLimiterSetup} from "./MultiAggregateRateLimiterSetup.t.sol";
contract MultiAggregateRateLimiter_setFeeQuoter is MultiAggregateRateLimiterSetup {
- function test_Owner_Success() public {
+ function test_Owner() public {
address newAddress = address(42);
vm.expectEmit();
@@ -19,14 +19,14 @@ contract MultiAggregateRateLimiter_setFeeQuoter is MultiAggregateRateLimiterSetu
// Reverts
- function test_OnlyOwner_Revert() public {
+ function test_RevertWhen_OnlyOwner() public {
vm.startPrank(STRANGER);
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
s_rateLimiter.setFeeQuoter(STRANGER);
}
- function test_ZeroAddress_Revert() public {
+ function test_RevertWhen_ZeroAddress() public {
vm.expectRevert(AuthorizedCallers.ZeroAddressNotAllowed.selector);
s_rateLimiter.setFeeQuoter(address(0));
}
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_updateRateLimitTokens.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_updateRateLimitTokens.t.sol
index 2125983ed70..85c9495c05e 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_updateRateLimitTokens.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_updateRateLimitTokens.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {AuthorizedCallers} from "../../../../shared/access/AuthorizedCallers.sol";
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
@@ -24,7 +24,7 @@ contract MultiAggregateRateLimiter_updateRateLimitTokens is MultiAggregateRateLi
s_rateLimiter.updateRateLimitTokens(removes, new MultiAggregateRateLimiter.RateLimitTokenArgs[](0));
}
- function test_UpdateRateLimitTokensSingleChain_Success() public {
+ function test_UpdateRateLimitTokensSingleChain() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory adds = new MultiAggregateRateLimiter.RateLimitTokenArgs[](2);
adds[0] = MultiAggregateRateLimiter.RateLimitTokenArgs({
localTokenArgs: MultiAggregateRateLimiter.LocalRateLimitToken({
@@ -61,7 +61,7 @@ contract MultiAggregateRateLimiter_updateRateLimitTokens is MultiAggregateRateLi
}
}
- function test_UpdateRateLimitTokensMultipleChains_Success() public {
+ function test_UpdateRateLimitTokensMultipleChains() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory adds = new MultiAggregateRateLimiter.RateLimitTokenArgs[](2);
adds[0] = MultiAggregateRateLimiter.RateLimitTokenArgs({
localTokenArgs: MultiAggregateRateLimiter.LocalRateLimitToken({
@@ -104,7 +104,7 @@ contract MultiAggregateRateLimiter_updateRateLimitTokens is MultiAggregateRateLi
assertEq(remoteTokensChain2[0], adds[1].remoteToken);
}
- function test_UpdateRateLimitTokens_AddsAndRemoves_Success() public {
+ function test_UpdateRateLimitTokens_AddsAndRemoves() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory adds = new MultiAggregateRateLimiter.RateLimitTokenArgs[](2);
adds[0] = MultiAggregateRateLimiter.RateLimitTokenArgs({
localTokenArgs: MultiAggregateRateLimiter.LocalRateLimitToken({
@@ -150,7 +150,7 @@ contract MultiAggregateRateLimiter_updateRateLimitTokens is MultiAggregateRateLi
assertEq(adds[1].localTokenArgs.localToken, localTokens[0]);
}
- function test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() public {
+ function test_UpdateRateLimitTokens_RemoveNonExistentToken() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory adds = new MultiAggregateRateLimiter.RateLimitTokenArgs[](0);
MultiAggregateRateLimiter.LocalRateLimitToken[] memory removes =
@@ -175,7 +175,7 @@ contract MultiAggregateRateLimiter_updateRateLimitTokens is MultiAggregateRateLi
// Reverts
- function test_ZeroSourceToken_Revert() public {
+ function test_RevertWhen_ZeroSourceToken() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory adds = new MultiAggregateRateLimiter.RateLimitTokenArgs[](1);
adds[0] = MultiAggregateRateLimiter.RateLimitTokenArgs({
localTokenArgs: MultiAggregateRateLimiter.LocalRateLimitToken({
@@ -189,7 +189,7 @@ contract MultiAggregateRateLimiter_updateRateLimitTokens is MultiAggregateRateLi
s_rateLimiter.updateRateLimitTokens(new MultiAggregateRateLimiter.LocalRateLimitToken[](0), adds);
}
- function test_ZeroDestToken_Revert() public {
+ function test_RevertWhen_ZeroDestToken() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory adds = new MultiAggregateRateLimiter.RateLimitTokenArgs[](1);
adds[0] = MultiAggregateRateLimiter.RateLimitTokenArgs({
localTokenArgs: MultiAggregateRateLimiter.LocalRateLimitToken({
@@ -203,7 +203,7 @@ contract MultiAggregateRateLimiter_updateRateLimitTokens is MultiAggregateRateLi
s_rateLimiter.updateRateLimitTokens(new MultiAggregateRateLimiter.LocalRateLimitToken[](0), adds);
}
- function test_ZeroDestToken_AbiEncoded_Revert() public {
+ function test_RevertWhen_ZeroDestToken_AbiEncoded() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory adds = new MultiAggregateRateLimiter.RateLimitTokenArgs[](1);
adds[0] = MultiAggregateRateLimiter.RateLimitTokenArgs({
localTokenArgs: MultiAggregateRateLimiter.LocalRateLimitToken({
@@ -217,7 +217,7 @@ contract MultiAggregateRateLimiter_updateRateLimitTokens is MultiAggregateRateLi
s_rateLimiter.updateRateLimitTokens(new MultiAggregateRateLimiter.LocalRateLimitToken[](0), adds);
}
- function test_NonOwner_Revert() public {
+ function test_RevertWhen_NonOwner() public {
MultiAggregateRateLimiter.RateLimitTokenArgs[] memory adds = new MultiAggregateRateLimiter.RateLimitTokenArgs[](4);
vm.startPrank(STRANGER);
diff --git a/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmPorxy.setARM.t.sol b/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmPorxy.setARM.t.sol
deleted file mode 100644
index 88e613c06da..00000000000
--- a/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmPorxy.setARM.t.sol
+++ /dev/null
@@ -1,22 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
-
-import {ARMProxy} from "../../../rmn/ARMProxy.sol";
-
-import {ARMProxyTestSetup} from "./ARMProxyTestSetup.t.sol";
-
-contract ARMProxy_setARM is ARMProxyTestSetup {
- function test_SetARM() public {
- vm.expectEmit();
- emit ARMProxy.ARMSet(MOCK_RMN_ADDRESS);
- vm.prank(OWNER_ADDRESS);
- s_armProxy.setARM(MOCK_RMN_ADDRESS);
- assertEq(s_armProxy.getARM(), MOCK_RMN_ADDRESS);
- }
-
- function test_SetARMzero() public {
- vm.expectRevert(abi.encodeWithSelector(ARMProxy.ZeroAddressNotAllowed.selector));
- vm.prank(OWNER_ADDRESS);
- s_armProxy.setARM(address(0x0));
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmProxy.constructor.t.sol b/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmProxy.constructor.t.sol
deleted file mode 100644
index 778a9d4086c..00000000000
--- a/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmProxy.constructor.t.sol
+++ /dev/null
@@ -1,14 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
-
-import {ARMProxy} from "../../../rmn/ARMProxy.sol";
-import {ARMProxyTestSetup} from "./ARMProxyTestSetup.t.sol";
-
-contract ARMProxy_constructor is ARMProxyTestSetup {
- function test_Constructor() public {
- vm.expectEmit();
- emit ARMProxy.ARMSet(MOCK_RMN_ADDRESS);
- ARMProxy proxy = new ARMProxy(MOCK_RMN_ADDRESS);
- assertEq(proxy.getARM(), MOCK_RMN_ADDRESS);
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmProxy.isCursed.t.sol b/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmProxy.isCursed.t.sol
deleted file mode 100644
index fdc6fce0cf4..00000000000
--- a/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ArmProxy.isCursed.t.sol
+++ /dev/null
@@ -1,42 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
-
-import {IRMN} from "../../../interfaces/IRMN.sol";
-
-import {ARMProxy} from "../../../rmn/ARMProxy.sol";
-import {MockRMN} from "../../mocks/MockRMN.sol";
-
-import {ARMProxyTestSetup} from "./ARMProxyTestSetup.t.sol";
-
-contract ARMProxy_isCursed is ARMProxyTestSetup {
- MockRMN internal s_mockRMN;
-
- function setUp() public virtual override {
- super.setUp();
- s_mockRMN = new MockRMN();
- s_armProxy = new ARMProxy(address(s_mockRMN));
- }
-
- function test_IsCursed_Success() public {
- s_armProxy.setARM(address(s_mockRMN));
- assertFalse(IRMN(address(s_armProxy)).isCursed());
- s_mockRMN.setGlobalCursed(true);
- assertTrue(IRMN(address(s_armProxy)).isCursed());
- }
-
- function test_isCursed_RevertReasonForwarded_Revert() public {
- bytes memory err = bytes("revert");
- s_mockRMN.setIsCursedRevert(err);
- s_armProxy.setARM(address(s_mockRMN));
- vm.expectRevert(abi.encodeWithSelector(MockRMN.CustomError.selector, err));
- IRMN(address(s_armProxy)).isCursed();
- }
-
- function test_call_ARMCallEmptyContract_Revert() public {
- s_armProxy.setARM(EMPTY_ADDRESS); // No code at address 1, should revert.
- vm.expectRevert();
- bytes memory b = new bytes(0);
- (bool success,) = address(s_armProxy).call(b);
- success;
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.getConfigDigests.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.getConfigDigests.t.sol
index b339bb183e7..f17a7d27311 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.getConfigDigests.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.getConfigDigests.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RMNHomeTestSetup} from "./RMNHomeTestSetup.t.sol";
contract RMNHome_getConfigDigests is RMNHomeTestSetup {
- function test_getConfigDigests_success() public {
+ function test_getConfigDigests() public {
(bytes32 activeDigest, bytes32 candidateDigest) = s_rmnHome.getConfigDigests();
assertEq(activeDigest, ZERO_DIGEST);
assertEq(candidateDigest, ZERO_DIGEST);
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.promoteCandidateAndRevokeActive.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.promoteCandidateAndRevokeActive.t.sol
index 6d99ed1cfaa..f45d63ffeb0 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.promoteCandidateAndRevokeActive.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.promoteCandidateAndRevokeActive.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {RMNHome} from "../../../rmn/RMNHome.sol";
@@ -7,7 +7,7 @@ import {RMNHome} from "../../../rmn/RMNHome.sol";
import {RMNHomeTestSetup} from "./RMNHomeTestSetup.t.sol";
contract RMNHome_promoteCandidateAndRevokeActive is RMNHomeTestSetup {
- function test_promoteCandidateAndRevokeActive_success() public {
+ function test_promoteCandidateAndRevokeActive() public {
Config memory config = _getBaseConfig();
bytes32 firstConfigToPromote = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
@@ -43,12 +43,12 @@ contract RMNHome_promoteCandidateAndRevokeActive is RMNHomeTestSetup {
assertEq(candidateConfig.configDigest, ZERO_DIGEST);
}
- function test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() public {
+ function test_RevertWhen_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed() public {
vm.expectRevert(RMNHome.NoOpStateTransitionNotAllowed.selector);
s_rmnHome.promoteCandidateAndRevokeActive(ZERO_DIGEST, ZERO_DIGEST);
}
- function test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() public {
+ function test_RevertWhen_promoteCandidateAndRevokeActive_ConfigDigestMismatch() public {
(bytes32 priorActiveDigest, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests();
bytes32 wrongActiveDigest = keccak256("wrongActiveDigest");
bytes32 wrongCandidateDigest = keccak256("wrongCandidateDigest");
@@ -63,7 +63,7 @@ contract RMNHome_promoteCandidateAndRevokeActive is RMNHomeTestSetup {
s_rmnHome.promoteCandidateAndRevokeActive(priorCandidateDigest, wrongActiveDigest);
}
- function test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() public {
+ function test_RevertWhen_promoteCandidateAndRevokeActive_OnlyOwner() public {
vm.startPrank(address(0));
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.revokeCandidate.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.revokeCandidate.t.sol
index a486bd193ff..3bb925fd105 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.revokeCandidate.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.revokeCandidate.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {RMNHome} from "../../../rmn/RMNHome.sol";
@@ -17,7 +17,7 @@ contract RMNHome_revokeCandidate is RMNHomeTestSetup {
s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
}
- function test_revokeCandidate_success() public {
+ function test_revokeCandidate() public {
(bytes32 priorActiveDigest, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests();
vm.expectEmit();
@@ -39,7 +39,7 @@ contract RMNHome_revokeCandidate is RMNHomeTestSetup {
assertTrue(candidateDigest != priorCandidateDigest);
}
- function test_revokeCandidate_ConfigDigestMismatch_reverts() public {
+ function test_RevertWhen_revokeCandidate_ConfigDigestMismatch() public {
(, bytes32 priorCandidateDigest) = s_rmnHome.getConfigDigests();
bytes32 wrongDigest = keccak256("wrong_digest");
@@ -47,12 +47,12 @@ contract RMNHome_revokeCandidate is RMNHomeTestSetup {
s_rmnHome.revokeCandidate(wrongDigest);
}
- function test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() public {
+ function test_RevertWhen_revokeCandidate_RevokingZeroDigestNotAllowed() public {
vm.expectRevert(RMNHome.RevokingZeroDigestNotAllowed.selector);
s_rmnHome.revokeCandidate(ZERO_DIGEST);
}
- function test_revokeCandidate_OnlyOwner_reverts() public {
+ function test_RevertWhen_revokeCandidate_OnlyOwner() public {
vm.startPrank(address(0));
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.setCandidate.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.setCandidate.t.sol
index 6fae7a90552..502f1b5a0b8 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.setCandidate.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.setCandidate.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {RMNHome} from "../../../rmn/RMNHome.sol";
@@ -7,7 +7,7 @@ import {RMNHome} from "../../../rmn/RMNHome.sol";
import {RMNHomeTestSetup} from "./RMNHomeTestSetup.t.sol";
contract RMNHome_setCandidate is RMNHomeTestSetup {
- function test_setCandidate_success() public {
+ function test_setCandidate() public {
Config memory config = _getBaseConfig();
RMNHome.VersionedConfig memory versionedConfig = RMNHome.VersionedConfig({
version: 1,
@@ -49,7 +49,7 @@ contract RMNHome_setCandidate is RMNHomeTestSetup {
assertEq(storedStaticConfig.offchainConfig, versionedConfig.staticConfig.offchainConfig);
}
- function test_setCandidate_ConfigDigestMismatch_reverts() public {
+ function test_RevertWhen_setCandidate_ConfigDigestMismatch() public {
Config memory config = _getBaseConfig();
bytes32 digest = s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
@@ -63,7 +63,7 @@ contract RMNHome_setCandidate is RMNHomeTestSetup {
s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, digest);
}
- function test_setCandidate_OnlyOwner_reverts() public {
+ function test_RevertWhen_setCandidate_OnlyOwner() public {
Config memory config = _getBaseConfig();
vm.startPrank(address(0));
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.setDynamicConfig.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.setDynamicConfig.t.sol
index 048a6ef226e..a0c1f376390 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.setDynamicConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.setDynamicConfig.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {RMNHome} from "../../../rmn/RMNHome.sol";
@@ -12,7 +12,7 @@ contract RMNHome_setDynamicConfig is RMNHomeTestSetup {
s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
}
- function test_setDynamicConfig_success() public {
+ function test_setDynamicConfig() public {
(bytes32 priorActiveDigest,) = s_rmnHome.getConfigDigests();
Config memory config = _getBaseConfig();
@@ -36,7 +36,7 @@ contract RMNHome_setDynamicConfig is RMNHomeTestSetup {
}
// Asserts the validation function is being called
- function test_setDynamicConfig_MinObserversTooHigh_reverts() public {
+ function test_RevertWhen_setDynamicConfig_MinObserversTooHigh() public {
Config memory config = _getBaseConfig();
config.dynamicConfig.sourceChains[0].f++;
@@ -44,7 +44,7 @@ contract RMNHome_setDynamicConfig is RMNHomeTestSetup {
s_rmnHome.setDynamicConfig(config.dynamicConfig, ZERO_DIGEST);
}
- function test_setDynamicConfig_DigestNotFound_reverts() public {
+ function test_RevertWhen_setDynamicConfig_DigestNotFound() public {
// Zero always reverts
vm.expectRevert(abi.encodeWithSelector(RMNHome.DigestNotFound.selector, ZERO_DIGEST));
s_rmnHome.setDynamicConfig(_getBaseConfig().dynamicConfig, ZERO_DIGEST);
@@ -55,7 +55,7 @@ contract RMNHome_setDynamicConfig is RMNHomeTestSetup {
s_rmnHome.setDynamicConfig(_getBaseConfig().dynamicConfig, nonExistentDigest);
}
- function test_setDynamicConfig_OnlyOwner_reverts() public {
+ function test_RevertWhen_setDynamicConfig_OnlyOwner() public {
Config memory config = _getBaseConfig();
vm.startPrank(address(0));
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.validateStaticAndDynamicConfig.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.validateStaticAndDynamicConfig.t.sol
index 2aa7b1a5100..c719ae4f73b 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.validateStaticAndDynamicConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHome.validateStaticAndDynamicConfig.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RMNHome} from "../../../rmn/RMNHome.sol";
import {RMNHomeTestSetup} from "./RMNHomeTestSetup.t.sol";
contract RMNHome_validateStaticAndDynamicConfig is RMNHomeTestSetup {
- function test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() public {
+ function test_RevertWhen_validateStaticAndDynamicConfig_OutOfBoundsNodesLength() public {
Config memory config = _getBaseConfig();
config.staticConfig.nodes = new RMNHome.Node[](257);
@@ -14,7 +14,7 @@ contract RMNHome_validateStaticAndDynamicConfig is RMNHomeTestSetup {
s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
}
- function test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() public {
+ function test_RevertWhen_validateStaticAndDynamicConfig_DuplicatePeerId() public {
Config memory config = _getBaseConfig();
config.staticConfig.nodes[1].peerId = config.staticConfig.nodes[0].peerId;
@@ -22,7 +22,7 @@ contract RMNHome_validateStaticAndDynamicConfig is RMNHomeTestSetup {
s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
}
- function test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() public {
+ function test_RevertWhen_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey() public {
Config memory config = _getBaseConfig();
config.staticConfig.nodes[1].offchainPublicKey = config.staticConfig.nodes[0].offchainPublicKey;
@@ -30,7 +30,7 @@ contract RMNHome_validateStaticAndDynamicConfig is RMNHomeTestSetup {
s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
}
- function test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() public {
+ function test_RevertWhen_validateStaticAndDynamicConfig_DuplicateSourceChain() public {
Config memory config = _getBaseConfig();
config.dynamicConfig.sourceChains[1].chainSelector = config.dynamicConfig.sourceChains[0].chainSelector;
@@ -38,7 +38,7 @@ contract RMNHome_validateStaticAndDynamicConfig is RMNHomeTestSetup {
s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
}
- function test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() public {
+ function test_RevertWhen_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex() public {
Config memory config = _getBaseConfig();
config.dynamicConfig.sourceChains[0].observerNodesBitmap = 1 << config.staticConfig.nodes.length;
@@ -46,7 +46,7 @@ contract RMNHome_validateStaticAndDynamicConfig is RMNHomeTestSetup {
s_rmnHome.setCandidate(config.staticConfig, config.dynamicConfig, ZERO_DIGEST);
}
- function test_validateStaticAndDynamicConfig_NotEnoughObservers_reverts() public {
+ function test_RevertWhen_validateStaticAndDynamicConfig_NotEnoughObservers() public {
Config memory config = _getBaseConfig();
config.dynamicConfig.sourceChains[0].f++;
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHomeTestSetup.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHomeTestSetup.t.sol
index 6bb76c29ba7..1d7f5a0571d 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHomeTestSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNHome/RMNHomeTestSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RMNHome} from "../../../rmn/RMNHome.sol";
import {Test} from "forge-std/Test.sol";
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.constructor.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.constructor.t.sol
new file mode 100644
index 00000000000..7efa4059436
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.constructor.t.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.24;
+
+import {RMNProxy} from "../../../rmn/RMNProxy.sol";
+import {RMNProxyTestSetup} from "./RMNProxyTestSetup.t.sol";
+
+contract RMNProxy_constructor is RMNProxyTestSetup {
+ function test_Constructor() public {
+ vm.expectEmit();
+ emit RMNProxy.ARMSet(MOCK_RMN_ADDRESS);
+ RMNProxy proxy = new RMNProxy(MOCK_RMN_ADDRESS);
+ assertEq(proxy.getARM(), MOCK_RMN_ADDRESS);
+ }
+}
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.isCursed.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.isCursed.t.sol
new file mode 100644
index 00000000000..add370a3d67
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.isCursed.t.sol
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.24;
+
+import {IRMN} from "../../../interfaces/IRMN.sol";
+
+import {RMNProxy} from "../../../rmn/RMNProxy.sol";
+import {GLOBAL_CURSE_SUBJECT, RMNRemote} from "../../../rmn/RMNRemote.sol";
+import {RMNProxyTestSetup} from "./RMNProxyTestSetup.t.sol";
+
+contract RMNProxy_isCursed is RMNProxyTestSetup {
+ RMNRemote internal s_mockRMNRemote;
+
+ function setUp() public virtual override {
+ super.setUp();
+ s_mockRMNRemote = new RMNRemote(1, IRMN(address(0)));
+ s_rmnProxy = new RMNProxy(address(s_mockRMNRemote));
+ }
+
+ function test_IsCursed_GlobalCurseSubject() public {
+ assertFalse(IRMN(address(s_rmnProxy)).isCursed());
+
+ s_mockRMNRemote.curse(GLOBAL_CURSE_SUBJECT);
+ vm.assertTrue(IRMN(address(s_rmnProxy)).isCursed());
+ }
+
+ error CustomError(bytes err);
+
+ function test_isCursed_RevertWhen_isCursedReasonForwarded() public {
+ bytes memory err = bytes("revert");
+ vm.mockCallRevert(
+ address(s_mockRMNRemote), abi.encodeWithSignature("isCursed()"), abi.encodeWithSelector(CustomError.selector, err)
+ );
+
+ s_rmnProxy.setARM(address(s_mockRMNRemote));
+ vm.expectRevert(abi.encodeWithSelector(CustomError.selector, err));
+ IRMN(address(s_rmnProxy)).isCursed();
+ }
+
+ function test_RevertWhen_call_ARMCallEmptyContract() public {
+ s_rmnProxy.setARM(EMPTY_ADDRESS); // No code at address 1, should revert.
+ vm.expectRevert();
+ (bool success,) = address(s_rmnProxy).call(new bytes(0));
+ success;
+ }
+}
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.setARM.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.setARM.t.sol
new file mode 100644
index 00000000000..ef0f8518955
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxy.setARM.t.sol
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.24;
+
+import {RMNProxy} from "../../../rmn/RMNProxy.sol";
+
+import {RMNProxyTestSetup} from "./RMNProxyTestSetup.t.sol";
+
+contract RMNProxy_setARM is RMNProxyTestSetup {
+ function test_SetARM() public {
+ vm.expectEmit();
+ emit RMNProxy.ARMSet(MOCK_RMN_ADDRESS);
+ vm.prank(OWNER_ADDRESS);
+ s_rmnProxy.setARM(MOCK_RMN_ADDRESS);
+ assertEq(s_rmnProxy.getARM(), MOCK_RMN_ADDRESS);
+ }
+
+ function test_SetARMzero() public {
+ vm.expectRevert(abi.encodeWithSelector(RMNProxy.ZeroAddressNotAllowed.selector));
+ vm.prank(OWNER_ADDRESS);
+ s_rmnProxy.setARM(address(0x0));
+ }
+}
diff --git a/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ARMProxyTestSetup.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxyTestSetup.t.sol
similarity index 64%
rename from contracts/src/v0.8/ccip/test/rmn/ArmProxy/ARMProxyTestSetup.t.sol
rename to contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxyTestSetup.t.sol
index 6a98d726d63..9c8a372dfb9 100644
--- a/contracts/src/v0.8/ccip/test/rmn/ArmProxy/ARMProxyTestSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNProxy/RMNProxyTestSetup.t.sol
@@ -1,20 +1,20 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
-import {ARMProxy} from "../../../rmn/ARMProxy.sol";
+import {RMNProxy} from "../../../rmn/RMNProxy.sol";
import {Test} from "forge-std/Test.sol";
-contract ARMProxyTestSetup is Test {
+contract RMNProxyTestSetup is Test {
address internal constant EMPTY_ADDRESS = address(0x1);
address internal constant OWNER_ADDRESS = 0xC0ffeeEeC0fFeeeEc0ffeEeEc0ffEEEEC0FfEEee;
address internal constant MOCK_RMN_ADDRESS = 0x1337133713371337133713371337133713371337;
- ARMProxy internal s_armProxy;
+ RMNProxy internal s_rmnProxy;
function setUp() public virtual {
- // needed so that the extcodesize check in ARMProxy.fallback doesn't revert
+ // needed so that the extcodesize check in RMNProxy.fallback doesn't revert
vm.etch(MOCK_RMN_ADDRESS, bytes("fake bytecode"));
vm.prank(OWNER_ADDRESS);
- s_armProxy = new ARMProxy(MOCK_RMN_ADDRESS);
+ s_rmnProxy = new RMNProxy(MOCK_RMN_ADDRESS);
}
}
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.constructor.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.constructor.t.sol
index 413ef4a6797..8c2b0157800 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.constructor.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.curse.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.curse.t.sol
index e1af2ab4e6b..4c3d6bd3fb1 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.curse.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.curse.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {RMNRemote} from "../../../rmn/RMNRemote.sol";
import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol";
contract RMNRemote_curse is RMNRemoteSetup {
- function test_curse_success() public {
+ function test_curse() public {
vm.expectEmit();
emit RMNRemote.Cursed(s_curseSubjects);
@@ -19,14 +19,14 @@ contract RMNRemote_curse is RMNRemoteSetup {
assertFalse(s_rmnRemote.isCursed(bytes16(keccak256("subject 3"))));
}
- function test_curse_AlreadyCursed_duplicateSubject_reverts() public {
+ function test_RevertWhen_curse_AlreadyCursed_duplicateSubject() public {
s_curseSubjects.push(CURSE_SUBJ_1);
vm.expectRevert(abi.encodeWithSelector(RMNRemote.AlreadyCursed.selector, CURSE_SUBJ_1));
s_rmnRemote.curse(s_curseSubjects);
}
- function test_curse_calledByNonOwner_reverts() public {
+ function test_RevertWhen_curse_calledByNonOwner() public {
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
vm.stopPrank();
vm.prank(STRANGER);
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.globalAndLegacyCurses.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.globalAndLegacyCurses.t.sol
deleted file mode 100644
index da6677678fe..00000000000
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.globalAndLegacyCurses.t.sol
+++ /dev/null
@@ -1,29 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
-
-import {GLOBAL_CURSE_SUBJECT, LEGACY_CURSE_SUBJECT} from "../../../rmn/RMNRemote.sol";
-import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol";
-
-contract RMNRemote_global_and_legacy_curses is RMNRemoteSetup {
- function test_global_and_legacy_curses_success() public {
- bytes16 randSubject = bytes16(keccak256("random subject"));
- assertFalse(s_rmnRemote.isCursed());
- assertFalse(s_rmnRemote.isCursed(randSubject));
-
- s_rmnRemote.curse(GLOBAL_CURSE_SUBJECT);
- assertTrue(s_rmnRemote.isCursed());
- assertTrue(s_rmnRemote.isCursed(randSubject));
-
- s_rmnRemote.uncurse(GLOBAL_CURSE_SUBJECT);
- assertFalse(s_rmnRemote.isCursed());
- assertFalse(s_rmnRemote.isCursed(randSubject));
-
- s_rmnRemote.curse(LEGACY_CURSE_SUBJECT);
- assertTrue(s_rmnRemote.isCursed());
- assertFalse(s_rmnRemote.isCursed(randSubject)); // legacy curse doesn't affect specific subjects
-
- s_rmnRemote.uncurse(LEGACY_CURSE_SUBJECT);
- assertFalse(s_rmnRemote.isCursed());
- assertFalse(s_rmnRemote.isCursed(randSubject));
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.globalCurses.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.globalCurses.t.sol
new file mode 100644
index 00000000000..3732095ea9d
--- /dev/null
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.globalCurses.t.sol
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.24;
+
+import {GLOBAL_CURSE_SUBJECT} from "../../../rmn/RMNRemote.sol";
+import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol";
+
+contract RMNRemote_global_curses is RMNRemoteSetup {
+ function test_isCursed_globalCurseSubject() public {
+ bytes16 randSubject = bytes16(keccak256("random subject"));
+ assertFalse(s_rmnRemote.isCursed());
+ assertFalse(s_rmnRemote.isCursed(randSubject));
+
+ s_rmnRemote.curse(GLOBAL_CURSE_SUBJECT);
+ assertTrue(s_rmnRemote.isCursed());
+ assertTrue(s_rmnRemote.isCursed(randSubject));
+
+ s_rmnRemote.uncurse(GLOBAL_CURSE_SUBJECT);
+ assertFalse(s_rmnRemote.isCursed());
+ assertFalse(s_rmnRemote.isCursed(randSubject));
+ }
+}
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.isBlessed.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.isBlessed.t.sol
index aabfe74bf4d..d013f9edf0b 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.isBlessed.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.isBlessed.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRMN} from "../../../interfaces/IRMN.sol";
@@ -23,7 +23,7 @@ contract RMNRemote_isBlessed is RMNRemoteSetup {
assertFalse(s_rmnRemote.isBlessed(taggedRoot));
}
- function test_isBlessed_RevertWhen_IsBlessedNotAvailable() public {
+ function test_RevertWhen_isBlessedWhen_IsBlessedNotAvailable() public {
IRMN.TaggedRoot memory taggedRoot = IRMN.TaggedRoot({root: keccak256("root"), commitStore: makeAddr("commitStore")});
s_rmnRemote = new RMNRemote(100, IRMN(address(0)));
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.setConfig.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.setConfig.t.sol
index 0805871955d..80bbddbfc03 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.setConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.setConfig.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {RMNRemote} from "../../../rmn/RMNRemote.sol";
import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol";
contract RMNRemote_setConfig is RMNRemoteSetup {
- function test_setConfig_ZeroValueNotAllowed_revert() public {
+ function test_RevertWhen_setConfig_ZeroValueNotAllowed() public {
RMNRemote.Config memory config =
RMNRemote.Config({rmnHomeContractConfigDigest: bytes32(0), signers: s_signers, f: 1});
@@ -14,7 +14,7 @@ contract RMNRemote_setConfig is RMNRemoteSetup {
s_rmnRemote.setConfig(config);
}
- function test_setConfig_addSigner_removeSigner_success() public {
+ function test_setConfig_addSigner_removeSigner() public {
uint32 currentConfigVersion = 0;
uint256 numSigners = s_signers.length;
RMNRemote.Config memory config =
@@ -56,7 +56,7 @@ contract RMNRemote_setConfig is RMNRemoteSetup {
assertEq(version, currentConfigVersion);
}
- function test_setConfig_invalidSignerOrder_reverts() public {
+ function test_RevertWhen_setConfig_invalidSignerOrder() public {
s_signers.push(RMNRemote.Signer({onchainPublicKey: address(4), nodeIndex: 0}));
RMNRemote.Config memory config =
RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, f: 1});
@@ -65,7 +65,7 @@ contract RMNRemote_setConfig is RMNRemoteSetup {
s_rmnRemote.setConfig(config);
}
- function test_setConfig_notEnoughSigners_reverts() public {
+ function test_RevertWhen_setConfig_notEnoughSigners() public {
RMNRemote.Config memory config = RMNRemote.Config({
rmnHomeContractConfigDigest: _randomBytes32(),
signers: s_signers,
@@ -76,7 +76,7 @@ contract RMNRemote_setConfig is RMNRemoteSetup {
s_rmnRemote.setConfig(config);
}
- function test_setConfig_duplicateOnChainPublicKey_reverts() public {
+ function test_RevertWhen_setConfig_duplicateOnChainPublicKey() public {
s_signers.push(RMNRemote.Signer({onchainPublicKey: s_signerWallets[0].addr, nodeIndex: uint64(s_signers.length)}));
RMNRemote.Config memory config =
RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, f: 1});
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.uncurse.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.uncurse.t.sol
index ad784a8cb30..5f537f3d7fc 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.uncurse.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.uncurse.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {RMNRemote} from "../../../rmn/RMNRemote.sol";
@@ -11,7 +11,7 @@ contract RMNRemote_uncurse is RMNRemoteSetup {
s_rmnRemote.curse(s_curseSubjects);
}
- function test_uncurse_success() public {
+ function test_uncurse() public {
vm.expectEmit();
emit RMNRemote.Uncursed(s_curseSubjects);
@@ -22,14 +22,14 @@ contract RMNRemote_uncurse is RMNRemoteSetup {
assertFalse(s_rmnRemote.isCursed(CURSE_SUBJ_2));
}
- function test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() public {
+ function test_RevertWhen_uncurse_NotCursed_duplicatedUncurseSubject() public {
s_curseSubjects.push(CURSE_SUBJ_1);
vm.expectRevert(abi.encodeWithSelector(RMNRemote.NotCursed.selector, CURSE_SUBJ_1));
s_rmnRemote.uncurse(s_curseSubjects);
}
- function test_uncurse_calledByNonOwner_reverts() public {
+ function test_RevertWhen_uncurse_calledByNonOwner() public {
vm.expectRevert(Ownable2Step.OnlyCallableByOwner.selector);
vm.stopPrank();
vm.prank(STRANGER);
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.verifywithConfigNotSet.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.verifywithConfigNotSet.t.sol
index bba4e8e6a0d..f48d87ef620 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.verifywithConfigNotSet.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.verifywithConfigNotSet.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRMNRemote} from "../../../interfaces/IRMNRemote.sol";
@@ -8,7 +8,7 @@ import {RMNRemote} from "../../../rmn/RMNRemote.sol";
import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol";
contract RMNRemote_verify_withConfigNotSet is RMNRemoteSetup {
- function test_verify_reverts() public {
+ function test_RevertWhen_verifys() public {
Internal.MerkleRoot[] memory merkleRoots = new Internal.MerkleRoot[](0);
IRMNRemote.Signature[] memory signatures = new IRMNRemote.Signature[](0);
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.verifywithConfigSet.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.verifywithConfigSet.t.sol
index 1ba9de9d039..3884493106d 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.verifywithConfigSet.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemote.verifywithConfigSet.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRMNRemote} from "../../../interfaces/IRMNRemote.sol";
import {RMNRemote} from "../../../rmn/RMNRemote.sol";
@@ -8,48 +8,44 @@ import {RMNRemoteSetup} from "./RMNRemoteSetup.t.sol";
contract RMNRemote_verify_withConfigSet is RMNRemoteSetup {
function setUp() public override {
super.setUp();
+
RMNRemote.Config memory config =
RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, f: 3});
s_rmnRemote.setConfig(config);
_generatePayloadAndSigs(2, 4);
}
- function test_verify_success() public view {
+ function test_verify() public view {
s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures);
}
- function test_verify_InvalidSignature_reverts() public {
- IRMNRemote.Signature memory sig = s_signatures[s_signatures.length - 1];
- sig.r = _randomBytes32();
- s_signatures.pop();
- s_signatures.push(sig);
+ function test_verify_RevertWhen_InvalidSignature() public {
+ s_signatures[s_signatures.length - 1].r = 0x0;
vm.expectRevert(RMNRemote.InvalidSignature.selector);
+
s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures);
}
- function test_verify_OutOfOrderSignatures_not_sorted_reverts() public {
+ function test_verify_RevertWhen_OutOfOrderSignatures_not_sorted() public {
IRMNRemote.Signature memory sig1 = s_signatures[s_signatures.length - 1];
- s_signatures.pop();
- IRMNRemote.Signature memory sig2 = s_signatures[s_signatures.length - 1];
- s_signatures.pop();
- s_signatures.push(sig1);
- s_signatures.push(sig2);
+ IRMNRemote.Signature memory sig2 = s_signatures[s_signatures.length - 2];
+
+ s_signatures[s_signatures.length - 1] = sig2;
+ s_signatures[s_signatures.length - 2] = sig1;
vm.expectRevert(RMNRemote.OutOfOrderSignatures.selector);
s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures);
}
- function test_verify_OutOfOrderSignatures_duplicateSignature_reverts() public {
- IRMNRemote.Signature memory sig = s_signatures[s_signatures.length - 2];
- s_signatures.pop();
- s_signatures.push(sig);
+ function test_verify_RevertWhen_OutOfOrderSignatures_duplicateSignature() public {
+ s_signatures[s_signatures.length - 1] = s_signatures[s_signatures.length - 2];
vm.expectRevert(RMNRemote.OutOfOrderSignatures.selector);
s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures);
}
- function test_verify_UnexpectedSigner_reverts() public {
+ function test_verify_RevertWhen_UnexpectedSigner() public {
_setupSigners(4); // create new signers that aren't configured on RMNRemote
_generatePayloadAndSigs(2, 4);
@@ -57,7 +53,7 @@ contract RMNRemote_verify_withConfigSet is RMNRemoteSetup {
s_rmnRemote.verify(OFF_RAMP_ADDRESS, s_merkleRoots, s_signatures);
}
- function test_verify_ThresholdNotMet_reverts() public {
+ function test_verify_RevertWhen_ThresholdNotMet() public {
RMNRemote.Config memory config =
RMNRemote.Config({rmnHomeContractConfigDigest: _randomBytes32(), signers: s_signers, f: 2}); // 3 = f+1 sigs required
s_rmnRemote.setConfig(config);
diff --git a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemoteSetup.t.sol b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemoteSetup.t.sol
index afb65eeab11..3c3ecd7a62b 100644
--- a/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemoteSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/rmn/RMNRemote/RMNRemoteSetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRMN} from "../../../interfaces/IRMN.sol";
import {IRMNRemote} from "../../../interfaces/IRMNRemote.sol";
@@ -49,7 +49,7 @@ contract RMNRemoteSetup is BaseTest {
}
for (uint256 i = 0; i < numSigners; ++i) {
- s_signerWallets.push(vm.createWallet(_randomNum()));
+ s_signerWallets.push(vm.createWallet(vm.randomUint()));
}
_sort(s_signerWallets);
@@ -84,11 +84,11 @@ contract RMNRemoteSetup is BaseTest {
/// @notice generates a random dest lane update
function _generateRandomDestLaneUpdate() private returns (Internal.MerkleRoot memory) {
- uint64 minSeqNum = uint32(_randomNum());
+ uint64 minSeqNum = uint32(vm.randomUint());
uint64 maxSeqNum = minSeqNum + 100;
return Internal.MerkleRoot({
- sourceChainSelector: uint64(_randomNum()),
- onRampAddress: abi.encode(_randomAddress()),
+ sourceChainSelector: uint64(vm.randomUint()),
+ onRampAddress: abi.encode(vm.randomAddress()),
minSeqNr: minSeqNum,
maxSeqNr: maxSeqNum,
merkleRoot: _randomBytes32()
@@ -147,4 +147,9 @@ contract RMNRemoteSetup is BaseTest {
}
}
}
+
+ /// @dev returns a pseudo-random bytes32
+ function _randomBytes32() internal returns (bytes32) {
+ return bytes32(vm.randomUint());
+ }
}
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.applyRampUpdates.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.applyRampUpdates.t.sol
index be0999542ea..4284c854466 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.applyRampUpdates.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.applyRampUpdates.t.sol
@@ -1,18 +1,18 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
-import {Router} from "../../../Router.sol";
import {IAny2EVMMessageReceiver} from "../../../interfaces/IAny2EVMMessageReceiver.sol";
import {IRouter} from "../../../interfaces/IRouter.sol";
-import {Client} from "../../../libraries/Client.sol";
+import {Router} from "../../../Router.sol";
+import {Client} from "../../../libraries/Client.sol";
+import {BaseTest} from "../../BaseTest.t.sol";
import {MaybeRevertMessageReceiver} from "../../helpers/receivers/MaybeRevertMessageReceiver.sol";
-import {RouterSetup} from "./RouterSetup.t.sol";
-contract Router_applyRampUpdates is RouterSetup {
+contract Router_applyRampUpdates is BaseTest {
MaybeRevertMessageReceiver internal s_receiver;
- function setUp() public virtual override(RouterSetup) {
+ function setUp() public virtual override {
super.setUp();
s_receiver = new MaybeRevertMessageReceiver(false);
}
@@ -22,7 +22,14 @@ contract Router_applyRampUpdates is RouterSetup {
) internal {
vm.startPrank(offRamp.offRamp);
- Client.Any2EVMMessage memory message = _generateReceiverMessage(offRamp.sourceChainSelector);
+ Client.Any2EVMMessage memory message = Client.Any2EVMMessage({
+ messageId: bytes32("a"),
+ sourceChainSelector: offRamp.sourceChainSelector,
+ sender: bytes("a"),
+ data: bytes("a"),
+ destTokenAmounts: new Client.EVMTokenAmount[](0)
+ });
+
vm.expectCall(address(s_receiver), abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message));
s_sourceRouter.routeMessage(message, GAS_FOR_CALL_EXACT_CHECK, 100_000, address(s_receiver));
}
@@ -34,7 +41,16 @@ contract Router_applyRampUpdates is RouterSetup {
vm.expectRevert(IRouter.OnlyOffRamp.selector);
s_sourceRouter.routeMessage(
- _generateReceiverMessage(offRamp.sourceChainSelector), GAS_FOR_CALL_EXACT_CHECK, 100_000, address(s_receiver)
+ Client.Any2EVMMessage({
+ messageId: bytes32("a"),
+ sourceChainSelector: offRamp.sourceChainSelector,
+ sender: bytes("a"),
+ data: bytes("a"),
+ destTokenAmounts: new Client.EVMTokenAmount[](0)
+ }),
+ GAS_FOR_CALL_EXACT_CHECK,
+ 100_000,
+ address(s_receiver)
);
}
@@ -267,7 +283,7 @@ contract Router_applyRampUpdates is RouterSetup {
assertTrue(s_sourceRouter.isChainSupported(DEST_CHAIN_SELECTOR));
}
- function test_applyRampUpdates_RevertWhen_OnlyOwner() public {
+ function test_RevertWhen_applyRampUpdatesWhen_OnlyOwner() public {
vm.stopPrank();
vm.expectRevert("Only callable by owner");
Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](0);
@@ -275,7 +291,7 @@ contract Router_applyRampUpdates is RouterSetup {
s_sourceRouter.applyRampUpdates(onRampUpdates, offRampUpdates, offRampUpdates);
}
- function test_applyRampUpdates_RevertWhen_OffRampMismatch() public {
+ function test_RevertWhen_applyRampUpdatesWhen_OffRampMismatch() public {
address offRamp = address(uint160(2));
Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](0);
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.ccipSend.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.ccipSend.t.sol
index c44a94d8d3d..bf7b8f59353 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.ccipSend.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.ccipSend.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
@@ -138,7 +138,7 @@ contract Router_ccipSend is OnRampSetup {
vm.resumeGasMetering();
}
- function test_NonLinkFeeToken_Success() public {
+ function test_NonLinkFeeToken() public {
address[] memory feeTokens = new address[](1);
feeTokens[0] = s_sourceTokens[1];
s_feeQuoter.applyFeeTokensUpdates(new address[](0), feeTokens);
@@ -149,7 +149,7 @@ contract Router_ccipSend is OnRampSetup {
s_sourceRouter.ccipSend(DEST_CHAIN_SELECTOR, message);
}
- function test_NativeFeeToken_Success() public {
+ function test_NativeFeeToken() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.feeToken = address(0); // Raw native
uint256 nativeQuote = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message);
@@ -158,7 +158,7 @@ contract Router_ccipSend is OnRampSetup {
s_sourceRouter.ccipSend{value: nativeQuote}(DEST_CHAIN_SELECTOR, message);
}
- function test_NativeFeeTokenOverpay_Success() public {
+ function test_NativeFeeTokenOverpay() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.feeToken = address(0); // Raw native
uint256 nativeQuote = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message);
@@ -170,7 +170,7 @@ contract Router_ccipSend is OnRampSetup {
assertEq(address(s_sourceRouter).balance, 0);
}
- function test_WrappedNativeFeeToken_Success() public {
+ function test_WrappedNativeFeeToken() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.feeToken = s_sourceRouter.getWrappedNative();
uint256 nativeQuote = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message);
@@ -184,14 +184,15 @@ contract Router_ccipSend is OnRampSetup {
// Reverts
- function test_WhenNotHealthy_Revert() public {
- Client.EVM2AnyMessage memory message = _generateEmptyMessage();
- s_mockRMN.setGlobalCursed(true);
+ function test_RevertWhen_WhenNotHealthy() public {
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed()"), abi.encode(true));
+
vm.expectRevert(Router.BadARMSignal.selector);
- s_sourceRouter.ccipSend(DEST_CHAIN_SELECTOR, message);
+
+ s_sourceRouter.ccipSend(DEST_CHAIN_SELECTOR, _generateEmptyMessage());
}
- function test_UnsupportedDestinationChain_Revert() public {
+ function test_RevertWhen_UnsupportedDestinationChain() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
uint64 wrongChain = DEST_CHAIN_SELECTOR + 1;
@@ -200,7 +201,7 @@ contract Router_ccipSend is OnRampSetup {
s_sourceRouter.ccipSend(wrongChain, message);
}
- function test_FeeTokenAmountTooLow_Revert() public {
+ function test_RevertWhen_FeeTokenAmountTooLow() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
IERC20(s_sourceTokens[0]).approve(address(s_sourceRouter), 0);
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.constructor.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.constructor.t.sol
index a7dd90fc5e5..6ac1d483729 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.constructor.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {OnRampSetup} from "../../onRamp/OnRamp/OnRampSetup.t.sol";
contract Router_constructor is OnRampSetup {
- function test_Constructor_Success() public view {
+ function test_Constructor() public view {
assertEq("Router 1.2.0", s_sourceRouter.typeAndVersion());
assertEq(OWNER, s_sourceRouter.owner());
}
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.getArmProxy.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.getArmProxy.t.sol
index a88e4c6b543..3bc57e56291 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.getArmProxy.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.getArmProxy.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
-import {RouterSetup} from "./RouterSetup.t.sol";
+import {BaseTest} from "../../BaseTest.t.sol";
-contract Router_getArmProxy is RouterSetup {
+contract Router_getArmProxy is BaseTest {
function test_getArmProxy() public view {
- assertEq(s_sourceRouter.getArmProxy(), address(s_mockRMN));
+ assertEq(s_sourceRouter.getArmProxy(), address(s_mockRMNRemote));
}
}
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.getFee.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.getFee.t.sol
index 9cb2249bf6b..f800b6a269c 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.getFee.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.getFee.t.sol
@@ -1,19 +1,19 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IRouterClient} from "../../../interfaces/IRouterClient.sol";
import {Client} from "../../../libraries/Client.sol";
import {OnRampSetup} from "../../onRamp/OnRamp/OnRampSetup.t.sol";
contract Router_getFee is OnRampSetup {
- function test_GetFeeSupportedChain_Success() public view {
+ function test_GetFeeSupportedChain() public view {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
uint256 expectedFee = s_sourceRouter.getFee(DEST_CHAIN_SELECTOR, message);
assertGt(expectedFee, 10e9);
}
// Reverts
- function test_UnsupportedDestinationChain_Revert() public {
+ function test_RevertWhen_UnsupportedDestinationChain() public {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
vm.expectRevert(abi.encodeWithSelector(IRouterClient.UnsupportedDestinationChain.selector, 999));
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.getSupportedTokens.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.getSupportedTokens.t.sol
index 734f1f35ca5..d13acceff3c 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.getSupportedTokens.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.getSupportedTokens.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {OnRamp} from "../../../onRamp/OnRamp.sol";
import {OnRampSetup} from "../../onRamp/OnRamp/OnRampSetup.t.sol";
contract Router_getSupportedTokens is OnRampSetup {
- function test_GetSupportedTokens_Revert() public {
+ function test_RevertWhen_GetSupportedTokens() public {
vm.expectRevert(OnRamp.GetSupportedTokensFunctionalityRemovedCheckAdminRegistry.selector);
s_onRamp.getSupportedTokens(DEST_CHAIN_SELECTOR);
}
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.recoverTokens.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.recoverTokens.t.sol
index 3eb76b52d1b..4d9c7928fc9 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.recoverTokens.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.recoverTokens.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
@@ -9,7 +9,7 @@ import {MaybeRevertMessageReceiver} from "../../helpers/receivers/MaybeRevertMes
import {OnRampSetup} from "../../onRamp/OnRamp/OnRampSetup.t.sol";
contract Router_recoverTokens is OnRampSetup {
- function test_RecoverTokens_Success() public {
+ function test_RecoverTokens() public {
// Assert we can recover sourceToken
IERC20 token = IERC20(s_sourceTokens[0]);
uint256 balanceBefore = token.balanceOf(OWNER);
@@ -28,25 +28,25 @@ contract Router_recoverTokens is OnRampSetup {
assertEq(address(s_sourceRouter).balance, 0);
}
- function test_RecoverTokensNonOwner_Revert() public {
+ function test_RevertWhen_RecoverTokensNonOwner() public {
// Reverts if not owner
vm.startPrank(STRANGER);
vm.expectRevert("Only callable by owner");
s_sourceRouter.recoverTokens(address(0), STRANGER, 1);
}
- function test_RecoverTokensInvalidRecipient_Revert() public {
+ function test_RevertWhen_RecoverTokensInvalidRecipient() public {
vm.expectRevert(abi.encodeWithSelector(Router.InvalidRecipientAddress.selector, address(0)));
s_sourceRouter.recoverTokens(address(0), address(0), 1);
}
- function test_RecoverTokensNoFunds_Revert() public {
+ function test_RevertWhen_RecoverTokensNoFunds() public {
// Reverts if no funds present
vm.expectRevert();
s_sourceRouter.recoverTokens(address(0), OWNER, 10);
}
- function test_RecoverTokensValueReceiver_Revert() public {
+ function test_RevertWhen_RecoverTokensValueReceiver() public {
MaybeRevertMessageReceiver revertingValueReceiver = new MaybeRevertMessageReceiver(true);
deal(address(s_sourceRouter), 10);
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.routeMessage.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.routeMessage.t.sol
index 8fca851fa4a..26b629dd30e 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.routeMessage.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.routeMessage.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
-import {Router} from "../../../Router.sol";
import {IAny2EVMMessageReceiver} from "../../../interfaces/IAny2EVMMessageReceiver.sol";
import {IRouter} from "../../../interfaces/IRouter.sol";
-import {Client} from "../../../libraries/Client.sol";
+import {Router} from "../../../Router.sol";
+import {Client} from "../../../libraries/Client.sol";
import {MaybeRevertMessageReceiver} from "../../helpers/receivers/MaybeRevertMessageReceiver.sol";
import {OffRampSetup} from "../../offRamp/OffRamp/OffRampSetup.t.sol";
@@ -21,7 +21,20 @@ contract Router_routeMessage is OffRampSetup {
return ((gasleft() - 2 * (16 * callDataLength + GAS_FOR_CALL_EXACT_CHECK)) * 62) / 64;
}
- function test_routeMessage_ManualExec_Success() public {
+ function _generateReceiverMessage(
+ uint64 chainSelector
+ ) internal pure returns (Client.Any2EVMMessage memory) {
+ Client.EVMTokenAmount[] memory ta = new Client.EVMTokenAmount[](0);
+ return Client.Any2EVMMessage({
+ messageId: bytes32("a"),
+ sourceChainSelector: chainSelector,
+ sender: bytes("a"),
+ data: bytes("a"),
+ destTokenAmounts: ta
+ });
+ }
+
+ function test_routeMessage_ManualExec() public {
Client.Any2EVMMessage memory message = _generateReceiverMessage(SOURCE_CHAIN_SELECTOR);
// Manuel execution cannot run out of gas
@@ -36,7 +49,7 @@ contract Router_routeMessage is OffRampSetup {
assertGt(gasUsed, 3_000);
}
- function test_routeMessage_ExecutionEvent_Success() public {
+ function test_routeMessage_ExecutionEvent() public {
Client.Any2EVMMessage memory message = _generateReceiverMessage(SOURCE_CHAIN_SELECTOR);
// Should revert with reason
bytes memory realError1 = new bytes(2);
@@ -61,7 +74,7 @@ contract Router_routeMessage is OffRampSetup {
assertFalse(success);
assertEq(abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, realError1), retData);
- assertGt(gasUsed, 3_000);
+ assertGt(gasUsed, 2850);
// Reason is truncated
// Over the MAX_RET_BYTES limit (including offset and length word since we have a dynamic values), should be ignored
@@ -165,7 +178,7 @@ contract Router_routeMessage is OffRampSetup {
assertEq(expectedRetData, retData);
}
- function test_routeMessage_AutoExec_Success() public {
+ function test_routeMessage_AutoExec() public {
(bool success,,) = s_destRouter.routeMessage(
_generateReceiverMessage(SOURCE_CHAIN_SELECTOR), GAS_FOR_CALL_EXACT_CHECK, 100_000, address(s_receiver)
);
@@ -181,7 +194,7 @@ contract Router_routeMessage is OffRampSetup {
}
// Reverts
- function test_routeMessage_OnlyOffRamp_Revert() public {
+ function test_RevertWhen_routeMessage_OnlyOffRamp() public {
vm.stopPrank();
vm.startPrank(STRANGER);
@@ -191,8 +204,8 @@ contract Router_routeMessage is OffRampSetup {
);
}
- function test_routeMessage_WhenNotHealthy_Revert() public {
- s_mockRMN.setGlobalCursed(true);
+ function test_RevertWhen_routeMessage_WhenNotHealthy() public {
+ vm.mockCall(address(s_mockRMNRemote), abi.encodeWithSignature("isCursed()"), abi.encode(true));
vm.expectRevert(Router.BadARMSignal.selector);
s_destRouter.routeMessage(
_generateReceiverMessage(SOURCE_CHAIN_SELECTOR), GAS_FOR_CALL_EXACT_CHECK, 100_000, address(s_receiver)
diff --git a/contracts/src/v0.8/ccip/test/router/Router/Router.setWrappedNative.t.sol b/contracts/src/v0.8/ccip/test/router/Router/Router.setWrappedNative.t.sol
index a23d98e4eaa..62cab30b5d0 100644
--- a/contracts/src/v0.8/ccip/test/router/Router/Router.setWrappedNative.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/Router/Router.setWrappedNative.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {OnRampSetup} from "../../onRamp/OnRamp/OnRampSetup.t.sol";
@@ -12,7 +12,7 @@ contract Router_setWrappedNative is OnRampSetup {
}
// Reverts
- function test_OnlyOwner_Revert() public {
+ function test_RevertWhen_OnlyOwner() public {
vm.stopPrank();
vm.expectRevert("Only callable by owner");
s_sourceRouter.setWrappedNative(address(1));
diff --git a/contracts/src/v0.8/ccip/test/router/Router/RouterSetup.t.sol b/contracts/src/v0.8/ccip/test/router/Router/RouterSetup.t.sol
deleted file mode 100644
index 4a977db6c23..00000000000
--- a/contracts/src/v0.8/ccip/test/router/Router/RouterSetup.t.sol
+++ /dev/null
@@ -1,50 +0,0 @@
-// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
-
-import {Router} from "../../../Router.sol";
-import {Client} from "../../../libraries/Client.sol";
-import {Internal} from "../../../libraries/Internal.sol";
-import {BaseTest} from "../../BaseTest.t.sol";
-import {WETH9} from "../../WETH9.sol";
-
-contract RouterSetup is BaseTest {
- Router internal s_sourceRouter;
- Router internal s_destRouter;
-
- function setUp() public virtual override {
- BaseTest.setUp();
-
- if (address(s_sourceRouter) == address(0)) {
- WETH9 weth = new WETH9();
- s_sourceRouter = new Router(address(weth), address(s_mockRMN));
- vm.label(address(s_sourceRouter), "sourceRouter");
- }
- if (address(s_destRouter) == address(0)) {
- WETH9 weth = new WETH9();
- s_destRouter = new Router(address(weth), address(s_mockRMN));
- vm.label(address(s_destRouter), "destRouter");
- }
- }
-
- function _generateReceiverMessage(
- uint64 chainSelector
- ) internal pure returns (Client.Any2EVMMessage memory) {
- Client.EVMTokenAmount[] memory ta = new Client.EVMTokenAmount[](0);
- return Client.Any2EVMMessage({
- messageId: bytes32("a"),
- sourceChainSelector: chainSelector,
- sender: bytes("a"),
- data: bytes("a"),
- destTokenAmounts: ta
- });
- }
-
- function _generateSourceTokenData() internal pure returns (Internal.SourceTokenData memory) {
- return Internal.SourceTokenData({
- sourcePoolAddress: abi.encode(address(12312412312)),
- destTokenAddress: abi.encode(address(9809808909)),
- extraData: "",
- destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
- });
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/BurnMintERC20Setup.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/BurnMintERC20Setup.t.sol
index 098d5e4601e..f5ad827db45 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/BurnMintERC20Setup.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/BurnMintERC20Setup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
import {BaseTest} from "../../BaseTest.t.sol";
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.approve.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.approve.t.sol
index 9ba6da0186d..4117bba4f6e 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.approve.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.approve.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_approve is BurnMintERC20Setup {
- function test_Approve_Success() public {
+ function test_Approve() public {
uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER);
uint256 sendingAmount = s_amount / 2;
@@ -19,7 +19,7 @@ contract FactoryBurnMintERC20_approve is BurnMintERC20Setup {
// Reverts
- function test_InvalidAddress_Reverts() public {
+ function test_RevertWhen_InvalidAddresss() public {
vm.expectRevert();
s_burnMintERC20.approve(address(s_burnMintERC20), s_amount);
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burn.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burn.t.sol
index 5f6e7ee4d04..8ca692a4069 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burn.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burn.t.sol
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_burn is BurnMintERC20Setup {
- function test_BasicBurn_Success() public {
+ function test_BasicBurn() public {
s_burnMintERC20.grantBurnRole(OWNER);
deal(address(s_burnMintERC20), OWNER, s_amount);
@@ -20,13 +20,13 @@ contract FactoryBurnMintERC20_burn is BurnMintERC20Setup {
// Revert
- function test_SenderNotBurner_Reverts() public {
+ function test_RevertWhen_SenderNotBurners() public {
vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER));
s_burnMintERC20.burnFrom(STRANGER, s_amount);
}
- function test_ExceedsBalance_Reverts() public {
+ function test_RevertWhen_ExceedsBalances() public {
changePrank(s_mockPool);
vm.expectRevert("ERC20: burn amount exceeds balance");
@@ -34,7 +34,7 @@ contract FactoryBurnMintERC20_burn is BurnMintERC20Setup {
s_burnMintERC20.burn(s_amount * 2);
}
- function test_BurnFromZeroAddress_Reverts() public {
+ function test_RevertWhen_BurnFromZeroAddresss() public {
s_burnMintERC20.grantBurnRole(address(0));
changePrank(address(0));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burnFrom.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burnFrom.t.sol
index e2dcaf28563..4549ca01dbe 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burnFrom.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burnFrom.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
@@ -9,7 +9,7 @@ contract FactoryBurnMintERC20_burnFrom is BurnMintERC20Setup {
BurnMintERC20Setup.setUp();
}
- function test_BurnFrom_Success() public {
+ function test_BurnFrom() public {
s_burnMintERC20.approve(s_mockPool, s_amount);
changePrank(s_mockPool);
@@ -21,13 +21,13 @@ contract FactoryBurnMintERC20_burnFrom is BurnMintERC20Setup {
// Reverts
- function test_SenderNotBurner_Reverts() public {
+ function test_RevertWhen_SenderNotBurners() public {
vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER));
s_burnMintERC20.burnFrom(OWNER, s_amount);
}
- function test_InsufficientAllowance_Reverts() public {
+ function test_RevertWhen_InsufficientAllowances() public {
changePrank(s_mockPool);
vm.expectRevert("ERC20: insufficient allowance");
@@ -35,7 +35,7 @@ contract FactoryBurnMintERC20_burnFrom is BurnMintERC20Setup {
s_burnMintERC20.burnFrom(OWNER, s_amount);
}
- function test_ExceedsBalance_Reverts() public {
+ function test_RevertWhen_ExceedsBalances() public {
s_burnMintERC20.approve(s_mockPool, s_amount * 2);
changePrank(s_mockPool);
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burnFromAlias.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burnFromAlias.t.sol
index 0d46f1d54a5..c71f6142b2d 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burnFromAlias.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.burnFromAlias.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
@@ -9,7 +9,7 @@ contract FactoryBurnMintERC20_burnFromAlias is BurnMintERC20Setup {
BurnMintERC20Setup.setUp();
}
- function test_BurnFrom_Success() public {
+ function test_BurnFrom() public {
s_burnMintERC20.approve(s_mockPool, s_amount);
changePrank(s_mockPool);
@@ -21,13 +21,13 @@ contract FactoryBurnMintERC20_burnFromAlias is BurnMintERC20Setup {
// Reverts
- function test_SenderNotBurner_Reverts() public {
+ function test_RevertWhen_SenderNotBurners() public {
vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER));
s_burnMintERC20.burn(OWNER, s_amount);
}
- function test_InsufficientAllowance_Reverts() public {
+ function test_RevertWhen_InsufficientAllowances() public {
changePrank(s_mockPool);
vm.expectRevert("ERC20: insufficient allowance");
@@ -35,7 +35,7 @@ contract FactoryBurnMintERC20_burnFromAlias is BurnMintERC20Setup {
s_burnMintERC20.burn(OWNER, s_amount);
}
- function test_ExceedsBalance_Reverts() public {
+ function test_RevertWhen_ExceedsBalances() public {
s_burnMintERC20.approve(s_mockPool, s_amount * 2);
changePrank(s_mockPool);
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.constructor.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.constructor.t.sol
index f1ee0866abe..a5f65a903c0 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.constructor.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_constructor is BurnMintERC20Setup {
- function test_Constructor_Success() public {
+ function test_Constructor() public {
string memory name = "Chainlink token v2";
string memory symbol = "LINK2";
uint8 decimals = 19;
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.decreaseApproval.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.decreaseApproval.t.sol
index aa621a998ed..fbd64b5858e 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.decreaseApproval.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.decreaseApproval.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_decreaseApproval is BurnMintERC20Setup {
- function test_DecreaseApproval_Success() public {
+ function test_DecreaseApproval() public {
s_burnMintERC20.approve(s_mockPool, s_amount);
uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool);
assertEq(allowance, s_amount);
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.getCCIPAdmin.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.getCCIPAdmin.t.sol
index fc6a81a712b..2e30bc2a557 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.getCCIPAdmin.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.getCCIPAdmin.t.sol
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_getCCIPAdmin is BurnMintERC20Setup {
- function test_getCCIPAdmin_Success() public view {
+ function test_getCCIPAdmin() public view {
assertEq(s_alice, s_burnMintERC20.getCCIPAdmin());
}
- function test_setCCIPAdmin_Success() public {
+ function test_setCCIPAdmin() public {
address newAdmin = makeAddr("newAdmin");
vm.expectEmit();
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.grantMintAndBurnRoles.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.grantMintAndBurnRoles.t.sol
index aaa967edc15..0e55271cab3 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.grantMintAndBurnRoles.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.grantMintAndBurnRoles.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_grantMintAndBurnRoles is BurnMintERC20Setup {
- function test_GrantMintAndBurnRoles_Success() public {
+ function test_GrantMintAndBurnRoles() public {
assertFalse(s_burnMintERC20.isMinter(STRANGER));
assertFalse(s_burnMintERC20.isBurner(STRANGER));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.grantRole.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.grantRole.t.sol
index a06b52ac338..473c143cbd5 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.grantRole.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.grantRole.t.sol
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_grantRole is BurnMintERC20Setup {
- function test_GrantMintAccess_Success() public {
+ function test_GrantMintAccess() public {
assertFalse(s_burnMintERC20.isMinter(STRANGER));
vm.expectEmit();
@@ -23,7 +23,7 @@ contract FactoryBurnMintERC20_grantRole is BurnMintERC20Setup {
assertFalse(s_burnMintERC20.isMinter(STRANGER));
}
- function test_GrantBurnAccess_Success() public {
+ function test_GrantBurnAccess() public {
assertFalse(s_burnMintERC20.isBurner(STRANGER));
vm.expectEmit();
@@ -41,7 +41,7 @@ contract FactoryBurnMintERC20_grantRole is BurnMintERC20Setup {
assertFalse(s_burnMintERC20.isBurner(STRANGER));
}
- function test_GrantMany_Success() public {
+ function test_GrantMany() public {
// Since alice was already granted mint and burn roles in the setup, we will revoke them
// and then grant them again for the purposes of the test
s_burnMintERC20.revokeMintRole(s_alice);
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.increaseApproval.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.increaseApproval.t.sol
index e93cc2a71e6..b0782470691 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.increaseApproval.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.increaseApproval.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_increaseApproval is BurnMintERC20Setup {
- function test_IncreaseApproval_Success() public {
+ function test_IncreaseApproval() public {
s_burnMintERC20.approve(s_mockPool, s_amount);
uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool);
assertEq(allowance, s_amount);
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.mint.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.mint.t.sol
index b22783a3c75..59c4145f27b 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.mint.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.mint.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {FactoryBurnMintERC20} from "../../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol";
@@ -7,7 +7,7 @@ import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_mint is BurnMintERC20Setup {
- function test_BasicMint_Success() public {
+ function test_BasicMint() public {
uint256 balancePre = s_burnMintERC20.balanceOf(OWNER);
s_burnMintERC20.grantMintAndBurnRoles(OWNER);
@@ -22,12 +22,12 @@ contract FactoryBurnMintERC20_mint is BurnMintERC20Setup {
// Revert
- function test_SenderNotMinter_Reverts() public {
+ function test_RevertWhen_SenderNotMinters() public {
vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotMinter.selector, OWNER));
s_burnMintERC20.mint(STRANGER, 1e18);
}
- function test_MaxSupplyExceeded_Reverts() public {
+ function test_RevertWhen_MaxSupplyExceededs() public {
changePrank(s_mockPool);
// Mint max supply
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.supportsInterface.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.supportsInterface.t.sol
index bdf3c3e7ae3..0070a943cec 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.supportsInterface.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.supportsInterface.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../../shared/token/ERC20/IBurnMintERC20.sol";
import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
@@ -7,7 +7,7 @@ import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_supportsInterface is BurnMintERC20Setup {
- function test_SupportsInterface_Success() public view {
+ function test_SupportsInterface() public view {
assertTrue(s_burnMintERC20.supportsInterface(type(IERC20).interfaceId));
assertTrue(s_burnMintERC20.supportsInterface(type(IBurnMintERC20).interfaceId));
assertTrue(s_burnMintERC20.supportsInterface(type(IERC165).interfaceId));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.transfer.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.transfer.t.sol
index 333d50d333e..cf93e9f0b95 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.transfer.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20/FactoryBurnMintERC20.transfer.t.sol
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {BurnMintERC20Setup} from "./BurnMintERC20Setup.t.sol";
contract FactoryBurnMintERC20_transfer is BurnMintERC20Setup {
- function test_Transfer_Success() public {
+ function test_Transfer() public {
uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER);
uint256 sendingAmount = s_amount / 2;
@@ -15,7 +15,7 @@ contract FactoryBurnMintERC20_transfer is BurnMintERC20Setup {
// Reverts
- function test_InvalidAddress_Reverts() public {
+ function test_RevertWhen_InvalidAddresss() public {
vm.expectRevert();
s_burnMintERC20.transfer(address(s_burnMintERC20), s_amount);
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.constructor.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.constructor.t.sol
index 22bf54e633b..64b58b2d4dd 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.constructor.t.sol
@@ -5,7 +5,7 @@ import {RegistryModuleOwnerCustom} from "../../../tokenAdminRegistry/RegistryMod
import {RegistryModuleOwnerCustomSetup} from "./RegistryModuleOwnerCustomSetup.t.sol";
contract RegistryModuleOwnerCustom_constructor is RegistryModuleOwnerCustomSetup {
- function test_constructor_Revert() public {
+ function test_RevertWhen_constructor() public {
vm.expectRevert(abi.encodeWithSelector(RegistryModuleOwnerCustom.AddressZero.selector));
new RegistryModuleOwnerCustom(address(0));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAccessControlDefaultAdmin.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAccessControlDefaultAdmin.t.sol
index 5bf1c0aee34..6660962b0cf 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAccessControlDefaultAdmin.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAccessControlDefaultAdmin.t.sol
@@ -23,7 +23,7 @@ contract RegistryModuleOwnerCustom_registerAccessControlDefaultAdmin is Registry
s_token = address(new AccessController(OWNER));
}
- function test_registerAccessControlDefaultAdmin_Success() public {
+ function test_registerAccessControlDefaultAdmin() public {
assertEq(s_tokenAdminRegistry.getTokenConfig(s_token).administrator, address(0));
bytes32 defaultAdminRole = AccessController(s_token).DEFAULT_ADMIN_ROLE();
@@ -43,7 +43,7 @@ contract RegistryModuleOwnerCustom_registerAccessControlDefaultAdmin is Registry
assertEq(s_tokenAdminRegistry.getTokenConfig(s_token).pendingAdministrator, OWNER);
}
- function test_registerAccessControlDefaultAdmin_Revert() public {
+ function test_RevertWhen_registerAccessControlDefaultAdmin() public {
bytes32 defaultAdminRole = AccessController(s_token).DEFAULT_ADMIN_ROLE();
address wrongSender = makeAddr("Not_expected_owner");
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin.t.sol
index 5e3c6545417..8646d918afe 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAdminViaGetCCIPAdmin.t.sol
@@ -9,7 +9,7 @@ import {TokenAdminRegistry} from "../../../tokenAdminRegistry/TokenAdminRegistry
import {RegistryModuleOwnerCustomSetup} from "./RegistryModuleOwnerCustomSetup.t.sol";
contract RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin is RegistryModuleOwnerCustomSetup {
- function test_registerAdminViaGetCCIPAdmin_Success() public {
+ function test_registerAdminViaGetCCIPAdmin() public {
assertEq(s_tokenAdminRegistry.getTokenConfig(s_token).administrator, address(0));
address expectedOwner = IGetCCIPAdmin(s_token).getCCIPAdmin();
@@ -29,7 +29,7 @@ contract RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin is RegistryModul
assertEq(s_tokenAdminRegistry.getTokenConfig(s_token).pendingAdministrator, OWNER);
}
- function test_registerAdminViaGetCCIPAdmin_Revert() public {
+ function test_RevertWhen_registerAdminViaGetCCIPAdmin() public {
address expectedOwner = IGetCCIPAdmin(s_token).getCCIPAdmin();
vm.startPrank(makeAddr("Not_expected_owner"));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAdminViaOwner.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAdminViaOwner.t.sol
index b4e1a5e4577..6fcee1b039e 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAdminViaOwner.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.registerAdminViaOwner.t.sol
@@ -9,7 +9,7 @@ import {TokenAdminRegistry} from "../../../tokenAdminRegistry/TokenAdminRegistry
import {RegistryModuleOwnerCustomSetup} from "./RegistryModuleOwnerCustomSetup.t.sol";
contract RegistryModuleOwnerCustom_registerAdminViaOwner is RegistryModuleOwnerCustomSetup {
- function test_registerAdminViaOwner_Success() public {
+ function test_registerAdminViaOwner() public {
assertEq(s_tokenAdminRegistry.getTokenConfig(s_token).administrator, address(0));
address expectedOwner = IOwner(s_token).owner();
@@ -29,7 +29,7 @@ contract RegistryModuleOwnerCustom_registerAdminViaOwner is RegistryModuleOwnerC
assertEq(s_tokenAdminRegistry.getTokenConfig(s_token).pendingAdministrator, OWNER);
}
- function test_registerAdminViaOwner_Revert() public {
+ function test_RevertWhen_registerAdminViaOwner() public {
address expectedOwner = IOwner(s_token).owner();
vm.startPrank(makeAddr("Not_expected_owner"));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.acceptAdminRole.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.acceptAdminRole.t.sol
index 069159b8938..05c3ac77893 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.acceptAdminRole.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.acceptAdminRole.t.sol
@@ -5,7 +5,7 @@ import {TokenAdminRegistry} from "../../../tokenAdminRegistry/TokenAdminRegistry
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_acceptAdminRole is TokenAdminRegistrySetup {
- function test_acceptAdminRole_Success() public {
+ function test_acceptAdminRole() public {
address token = s_sourceTokens[0];
address currentAdmin = s_tokenAdminRegistry.getTokenConfig(token).administrator;
@@ -36,7 +36,7 @@ contract TokenAdminRegistry_acceptAdminRole is TokenAdminRegistrySetup {
assertEq(config.administrator, newAdmin);
}
- function test_acceptAdminRole_OnlyPendingAdministrator_Revert() public {
+ function test_RevertWhen_acceptAdminRole_OnlyPendingAdministrator() public {
address token = s_sourceTokens[0];
address currentAdmin = s_tokenAdminRegistry.getTokenConfig(token).administrator;
address newAdmin = makeAddr("newAdmin");
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.addRegistryModule.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.addRegistryModule.t.sol
index 9874ceb72bc..9e21cd3e193 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.addRegistryModule.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.addRegistryModule.t.sol
@@ -5,7 +5,7 @@ import {Ownable2Step} from "../../../../shared/access/Ownable2Step.sol";
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_addRegistryModule is TokenAdminRegistrySetup {
- function test_addRegistryModule_Success() public {
+ function test_addRegistryModule() public {
address newModule = makeAddr("newModule");
s_tokenAdminRegistry.addRegistryModule(newModule);
@@ -19,7 +19,7 @@ contract TokenAdminRegistry_addRegistryModule is TokenAdminRegistrySetup {
vm.assertEq(vm.getRecordedLogs().length, 0);
}
- function test_addRegistryModule_OnlyOwner_Revert() public {
+ function test_RevertWhen_addRegistryModule_OnlyOwner() public {
address newModule = makeAddr("newModule");
vm.stopPrank();
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getAllConfiguredTokens.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getAllConfiguredTokens.t.sol
index 6e16f27eca7..9d42bcc8b2f 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getAllConfiguredTokens.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getAllConfiguredTokens.t.sol
@@ -28,7 +28,7 @@ contract TokenAdminRegistry_getAllConfiguredTokens is TokenAdminRegistrySetup {
}
}
- function test_getAllConfiguredTokens_outOfBounds_Success() public view {
+ function test_getAllConfiguredTokens_outOfBounds() public view {
address[] memory tokens = s_tokenAdminRegistry.getAllConfiguredTokens(type(uint64).max, 10);
assertEq(tokens.length, 0);
}
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getPool.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getPool.t.sol
index 297e3c3143a..12288ae365c 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getPool.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getPool.t.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_getPool is TokenAdminRegistrySetup {
- function test_getPool_Success() public view {
+ function test_getPool() public view {
address got = s_tokenAdminRegistry.getPool(s_sourceTokens[0]);
assertEq(got, s_sourcePoolByToken[s_sourceTokens[0]]);
}
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getPools.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getPools.t.sol
index 7c673ee5be6..194adc447b9 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getPools.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.getPools.t.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_getPools is TokenAdminRegistrySetup {
- function test_getPools_Success() public {
+ function test_getPools() public {
address[] memory tokens = new address[](1);
tokens[0] = s_sourceTokens[0];
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.isAdministrator.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.isAdministrator.t.sol
index 00555ba3ff2..e94a0654a7e 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.isAdministrator.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.isAdministrator.t.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_isAdministrator is TokenAdminRegistrySetup {
- function test_isAdministrator_Success() public {
+ function test_isAdministrator() public {
address newAdmin = makeAddr("newAdmin");
address newToken = makeAddr("newToken");
assertFalse(s_tokenAdminRegistry.isAdministrator(newToken, newAdmin));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.proposeAdministrator.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.proposeAdministrator.t.sol
index 6f3ac4449c6..3d2fc0dafee 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.proposeAdministrator.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.proposeAdministrator.t.sol
@@ -5,7 +5,7 @@ import {TokenAdminRegistry} from "../../../tokenAdminRegistry/TokenAdminRegistry
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_proposeAdministrator is TokenAdminRegistrySetup {
- function test_proposeAdministrator_module_Success() public {
+ function test_proposeAdministrator_module() public {
vm.startPrank(s_registryModule);
address newAdmin = makeAddr("newAdmin");
address newToken = makeAddr("newToken");
@@ -25,7 +25,7 @@ contract TokenAdminRegistry_proposeAdministrator is TokenAdminRegistrySetup {
assertTrue(s_tokenAdminRegistry.isAdministrator(newToken, newAdmin));
}
- function test_proposeAdministrator_owner_Success() public {
+ function test_proposeAdministrator_owner() public {
address newAdmin = makeAddr("newAdmin");
address newToken = makeAddr("newToken");
@@ -42,7 +42,7 @@ contract TokenAdminRegistry_proposeAdministrator is TokenAdminRegistrySetup {
assertTrue(s_tokenAdminRegistry.isAdministrator(newToken, newAdmin));
}
- function test_proposeAdministrator_reRegisterWhileUnclaimed_Success() public {
+ function test_proposeAdministrator_reRegisterWhileUnclaimed() public {
address newAdmin = makeAddr("wrongAddress");
address newToken = makeAddr("newToken");
@@ -87,7 +87,7 @@ contract TokenAdminRegistry_proposeAdministrator is TokenAdminRegistrySetup {
}
}
- function test_proposeAdministrator_OnlyRegistryModule_Revert() public {
+ function test_RevertWhen_proposeAdministrator_OnlyRegistryModule() public {
address newToken = makeAddr("newToken");
vm.stopPrank();
@@ -95,14 +95,14 @@ contract TokenAdminRegistry_proposeAdministrator is TokenAdminRegistrySetup {
s_tokenAdminRegistry.proposeAdministrator(newToken, OWNER);
}
- function test_proposeAdministrator_ZeroAddress_Revert() public {
+ function test_RevertWhen_proposeAdministrator_ZeroAddress() public {
address newToken = makeAddr("newToken");
vm.expectRevert(abi.encodeWithSelector(TokenAdminRegistry.ZeroAddress.selector));
s_tokenAdminRegistry.proposeAdministrator(newToken, address(0));
}
- function test_proposeAdministrator_AlreadyRegistered_Revert() public {
+ function test_RevertWhen_proposeAdministrator_AlreadyRegistered() public {
address newAdmin = makeAddr("newAdmin");
address newToken = makeAddr("newToken");
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.removeRegistryModule.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.removeRegistryModule.t.sol
index d5fde7ad5d5..5f5141eb3f3 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.removeRegistryModule.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.removeRegistryModule.t.sol
@@ -6,7 +6,7 @@ import {TokenAdminRegistry} from "../../../tokenAdminRegistry/TokenAdminRegistry
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_removeRegistryModule is TokenAdminRegistrySetup {
- function test_removeRegistryModule_Success() public {
+ function test_removeRegistryModule() public {
address newModule = makeAddr("newModule");
s_tokenAdminRegistry.addRegistryModule(newModule);
@@ -27,7 +27,7 @@ contract TokenAdminRegistry_removeRegistryModule is TokenAdminRegistrySetup {
vm.assertEq(vm.getRecordedLogs().length, 0);
}
- function test_removeRegistryModule_OnlyOwner_Revert() public {
+ function test_RevertWhen_removeRegistryModule_OnlyOwner() public {
address newModule = makeAddr("newModule");
vm.stopPrank();
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.setPool.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.setPool.t.sol
index 51119ce30bb..589b882dc21 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.setPool.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.setPool.t.sol
@@ -6,7 +6,7 @@ import {TokenAdminRegistry} from "../../../tokenAdminRegistry/TokenAdminRegistry
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_setPool is TokenAdminRegistrySetup {
- function test_setPool_Success() public {
+ function test_setPool() public {
address pool = makeAddr("pool");
vm.mockCall(pool, abi.encodeWithSelector(IPoolV1.isSupportedToken.selector), abi.encode(true));
@@ -24,7 +24,7 @@ contract TokenAdminRegistry_setPool is TokenAdminRegistrySetup {
vm.assertEq(vm.getRecordedLogs().length, 0);
}
- function test_setPool_ZeroAddressRemovesPool_Success() public {
+ function test_setPool_ZeroAddressRemovesPool() public {
address pool = makeAddr("pool");
vm.mockCall(pool, abi.encodeWithSelector(IPoolV1.isSupportedToken.selector), abi.encode(true));
s_tokenAdminRegistry.setPool(s_sourceTokens[0], pool);
@@ -39,7 +39,7 @@ contract TokenAdminRegistry_setPool is TokenAdminRegistrySetup {
assertEq(s_tokenAdminRegistry.getPool(s_sourceTokens[0]), address(0));
}
- function test_setPool_InvalidTokenPoolToken_Revert() public {
+ function test_RevertWhen_setPool_InvalidTokenPoolToken() public {
address pool = makeAddr("pool");
vm.mockCall(pool, abi.encodeWithSelector(IPoolV1.isSupportedToken.selector), abi.encode(false));
@@ -47,7 +47,7 @@ contract TokenAdminRegistry_setPool is TokenAdminRegistrySetup {
s_tokenAdminRegistry.setPool(s_sourceTokens[0], pool);
}
- function test_setPool_OnlyAdministrator_Revert() public {
+ function test_RevertWhen_setPool_OnlyAdministrator() public {
vm.stopPrank();
vm.expectRevert(
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.transferAdminRole.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.transferAdminRole.t.sol
index 07a10b083af..7d0916c8093 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.transferAdminRole.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenAdminRegistry/TokenAdminRegistry.transferAdminRole.t.sol
@@ -5,7 +5,7 @@ import {TokenAdminRegistry} from "../../../tokenAdminRegistry/TokenAdminRegistry
import {TokenAdminRegistrySetup} from "./TokenAdminRegistrySetup.t.sol";
contract TokenAdminRegistry_transferAdminRole is TokenAdminRegistrySetup {
- function test_transferAdminRole_Success() public {
+ function test_transferAdminRole() public {
address token = s_sourceTokens[0];
address currentAdmin = s_tokenAdminRegistry.getTokenConfig(token).administrator;
@@ -23,7 +23,7 @@ contract TokenAdminRegistry_transferAdminRole is TokenAdminRegistrySetup {
assertEq(config.administrator, currentAdmin);
}
- function test_transferAdminRole_OnlyAdministrator_Revert() public {
+ function test_RevertWhen_transferAdminRole_OnlyAdministrator() public {
vm.stopPrank();
vm.expectRevert(
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.constructor.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.constructor.t.sol
index fbba0ccbb06..5aa79d3d164 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.constructor.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.constructor.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITokenAdminRegistry} from "../../../interfaces/ITokenAdminRegistry.sol";
@@ -12,7 +12,7 @@ import {TokenPoolFactorySetup} from "./TokenPoolFactorySetup.t.sol";
contract TokenPoolFactory_constructor is TokenPoolFactorySetup {
using Create2 for bytes32;
- function test_constructor_Revert() public {
+ function test_RevertWhen_constructor() public {
// Revert cause the tokenAdminRegistry is address(0)
vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector);
new TokenPoolFactory(ITokenAdminRegistry(address(0)), RegistryModuleOwnerCustom(address(0)), address(0), address(0));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.createTokenPool.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.createTokenPool.t.sol
index 301e26173bf..260f5322659 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.createTokenPool.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.createTokenPool.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IBurnMintERC20} from "../../../../shared/token/ERC20/IBurnMintERC20.sol";
import {IOwner} from "../../../interfaces/IOwner.sol";
@@ -38,7 +38,7 @@ contract TokenPoolFactory_createTokenPool is TokenPoolFactorySetup {
s_sourceRouter.applyRampUpdates(new Router.OnRamp[](0), new Router.OffRamp[](0), offRampUpdates);
}
- function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public {
+ function test_createTokenPool_WithNoExistingTokenOnRemoteChain() public {
vm.startPrank(OWNER);
bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER));
@@ -75,7 +75,7 @@ contract TokenPoolFactory_createTokenPool is TokenPoolFactorySetup {
assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner");
}
- function test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() public {
+ function test_createTokenPool_WithNoExistingRemoteContracts_predict() public {
vm.startPrank(OWNER);
bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER));
@@ -204,7 +204,7 @@ contract TokenPoolFactory_createTokenPool is TokenPoolFactorySetup {
assertEq(IOwner(poolAddress).owner(), OWNER, "Pool should be controlled by the OWNER");
}
- function test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() public {
+ function test_createTokenPool_ExistingRemoteToken_AndPredictPool() public {
vm.startPrank(OWNER);
bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER));
@@ -301,7 +301,7 @@ contract TokenPoolFactory_createTokenPool is TokenPoolFactorySetup {
);
}
- function test_createTokenPool_WithRemoteTokenAndRemotePool_Success() public {
+ function test_createTokenPool_WithRemoteTokenAndRemotePool() public {
vm.startPrank(OWNER);
bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN"));
@@ -351,7 +351,7 @@ contract TokenPoolFactory_createTokenPool is TokenPoolFactorySetup {
assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner");
}
- function test_createTokenPoolLockRelease_ExistingToken_predict_Success() public {
+ function test_createTokenPoolLockRelease_ExistingToken_predict() public {
vm.startPrank(OWNER);
// We have to create a new factory, registry module, and token admin registry to simulate the other chain
@@ -446,7 +446,7 @@ contract TokenPoolFactory_createTokenPool is TokenPoolFactorySetup {
);
}
- function test_createTokenPool_BurnFromMintTokenPool_Success() public {
+ function test_createTokenPool_BurnFromMintTokenPool() public {
vm.startPrank(OWNER);
bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN"));
@@ -496,7 +496,7 @@ contract TokenPoolFactory_createTokenPool is TokenPoolFactorySetup {
assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner");
}
- function test_createTokenPool_RemoteTokenHasDifferentDecimals_Success() public {
+ function test_createTokenPool_RemoteTokenHasDifferentDecimals() public {
vm.startPrank(OWNER);
bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER));
diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactorySetup.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactorySetup.t.sol
index 9f78ceb9439..ee280dbdf76 100644
--- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactorySetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactorySetup.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {Create2} from "../../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol";
import {BurnMintTokenPool} from "../../../pools/BurnMintTokenPool.sol";
diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol
index 4392fa8c56f..23014ccfc73 100644
--- a/contracts/src/v0.8/ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol
+++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/RegistryModuleOwnerCustom.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IGetCCIPAdmin} from "../interfaces/IGetCCIPAdmin.sol";
diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenAdminRegistry.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenAdminRegistry.sol
index 725bde0fbdf..6aa3950ec6b 100644
--- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenAdminRegistry.sol
+++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenAdminRegistry.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {IPoolV1} from "../interfaces/IPool.sol";
diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol
index 6fdba0f9b1f..97cbdb32e83 100644
--- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol
+++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IGetCCIPAdmin} from "../../../ccip/interfaces/IGetCCIPAdmin.sol";
import {IOwnable} from "../../../shared/interfaces/IOwnable.sol";
diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol
index 94beff704a4..8e036076b15 100644
--- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol
+++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1
-pragma solidity 0.8.24;
+pragma solidity ^0.8.24;
import {IOwnable} from "../../../shared/interfaces/IOwnable.sol";
import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol";
diff --git a/contracts/src/v0.8/keystone/KeystoneFeedsPermissionHandler.sol b/contracts/src/v0.8/keystone/KeystoneFeedsPermissionHandler.sol
index 809081b92e0..36b520bb3d1 100644
--- a/contracts/src/v0.8/keystone/KeystoneFeedsPermissionHandler.sol
+++ b/contracts/src/v0.8/keystone/KeystoneFeedsPermissionHandler.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.19;
import {Ownable2StepMsgSender} from "../shared/access/Ownable2StepMsgSender.sol";
diff --git a/contracts/src/v0.8/keystone/KeystoneForwarder.sol b/contracts/src/v0.8/keystone/KeystoneForwarder.sol
index 4a8660c4c32..5807f042593 100644
--- a/contracts/src/v0.8/keystone/KeystoneForwarder.sol
+++ b/contracts/src/v0.8/keystone/KeystoneForwarder.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.24;
+pragma solidity ^0.8.19;
import {IReceiver} from "./interfaces/IReceiver.sol";
import {IRouter} from "./interfaces/IRouter.sol";
@@ -316,15 +316,15 @@ contract KeystoneForwarder is OwnerIsCreator, ITypeAndVersion, IRouter {
bytes memory rawReport
) internal pure returns (bytes32 workflowExecutionId, uint64 configId, bytes2 reportId) {
// (first 32 bytes of memory contain length of the report)
- // version // offset 32, size 1
- // workflow_execution_id // offset 33, size 32
- // timestamp // offset 65, size 4
- // don_id // offset 69, size 4
- // don_config_version, // offset 73, size 4
- // workflow_cid // offset 77, size 32
- // workflow_name // offset 109, size 10
- // workflow_owner // offset 119, size 20
- // report_id // offset 139, size 2
+ // version offset 32, size 1
+ // workflow_execution_id offset 33, size 32
+ // timestamp offset 65, size 4
+ // don_id offset 69, size 4
+ // don_config_version, offset 73, size 4
+ // workflow_cid offset 77, size 32
+ // workflow_name offset 109, size 10
+ // workflow_owner offset 119, size 20
+ // report_id offset 139, size 2
assembly {
workflowExecutionId := mload(add(rawReport, 33))
// shift right by 24 bytes to get the combined don_id and don_config_version
diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol
index 946a6623b49..ea11dc08798 100644
--- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol
+++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol
@@ -13,7 +13,6 @@ import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ut
/// @notice A basic ERC20 compatible token contract with burn and minting roles.
/// @dev The total supply can be limited during deployment.
-/// @dev This contract has not been audited and is not yet approved for production use.
contract BurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Burnable, AccessControl {
error MaxSupplyExceeded(uint256 supplyAfterMint);
error InvalidRecipient(address recipient);
@@ -153,7 +152,7 @@ contract BurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Burnable,
/// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used.
/// @param newAdmin The address to transfer the CCIPAdmin role to. Setting to address(0) is a valid way to revoke
/// the role
- function setCCIPAdmin(address newAdmin) public onlyRole(DEFAULT_ADMIN_ROLE) {
+ function setCCIPAdmin(address newAdmin) external onlyRole(DEFAULT_ADMIN_ROLE) {
address currentAdmin = s_ccipAdmin;
s_ccipAdmin = newAdmin;
diff --git a/contracts/src/v0.8/transmission/dev/ERC-4337/Paymaster.sol b/contracts/src/v0.8/transmission/dev/ERC-4337/Paymaster.sol
deleted file mode 100644
index 932d35006c4..00000000000
--- a/contracts/src/v0.8/transmission/dev/ERC-4337/Paymaster.sol
+++ /dev/null
@@ -1,134 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-import {IPaymaster} from "../../../vendor/entrypoint/interfaces/IPaymaster.sol";
-import {SCALibrary} from "./SCALibrary.sol";
-import {LinkTokenInterface} from "../../../shared/interfaces/LinkTokenInterface.sol";
-import {AggregatorV3Interface} from "../../../shared/interfaces/AggregatorV3Interface.sol";
-import {ConfirmedOwner} from "../../../shared/access/ConfirmedOwner.sol";
-import {UserOperation} from "../../../vendor/entrypoint/interfaces/UserOperation.sol";
-import {_packValidationData} from "../../../vendor/entrypoint/core/Helpers.sol";
-
-/// @dev LINK token paymaster implementation.
-/// TODO: more documentation.
-contract Paymaster is IPaymaster, ConfirmedOwner {
- error OnlyCallableFromLink();
- error InvalidCalldata();
- error Unauthorized(address sender, address validator);
- error UserOperationAlreadyTried(bytes32 userOpHash);
- error InsufficientFunds(uint256 juelsNeeded, uint256 subscriptionBalance);
-
- LinkTokenInterface public immutable i_linkToken;
- AggregatorV3Interface public immutable i_linkEthFeed;
- address public immutable i_entryPoint;
-
- struct Config {
- uint32 stalenessSeconds;
- int256 fallbackWeiPerUnitLink;
- }
- Config public s_config;
-
- mapping(bytes32 => bool) internal s_userOpHashMapping;
- mapping(address => uint256) internal s_subscriptions;
-
- constructor(
- LinkTokenInterface linkToken,
- AggregatorV3Interface linkEthFeed,
- address entryPoint
- ) ConfirmedOwner(msg.sender) {
- i_linkToken = linkToken;
- i_linkEthFeed = linkEthFeed;
- i_entryPoint = entryPoint;
- }
-
- function setConfig(uint32 stalenessSeconds, int256 fallbackWeiPerUnitLink) external onlyOwner {
- s_config = Config({stalenessSeconds: stalenessSeconds, fallbackWeiPerUnitLink: fallbackWeiPerUnitLink});
- }
-
- function onTokenTransfer(address /* _sender */, uint256 _amount, bytes calldata _data) external {
- if (msg.sender != address(i_linkToken)) {
- revert OnlyCallableFromLink();
- }
- if (_data.length != 32) {
- revert InvalidCalldata();
- }
-
- address subscription = abi.decode(_data, (address));
- s_subscriptions[subscription] += _amount;
- }
-
- function validatePaymasterUserOp(
- UserOperation calldata userOp,
- bytes32 userOpHash,
- uint256 maxCost
- ) external returns (bytes memory context, uint256 validationData) {
- if (msg.sender != i_entryPoint) {
- revert Unauthorized(msg.sender, i_entryPoint);
- }
- if (s_userOpHashMapping[userOpHash]) {
- revert UserOperationAlreadyTried(userOpHash);
- }
-
- uint256 extraCostJuels = _handleExtraCostJuels(userOp);
- uint256 costJuels = _getCostJuels(maxCost) + extraCostJuels;
- if (s_subscriptions[userOp.sender] < costJuels) {
- revert InsufficientFunds(costJuels, s_subscriptions[userOp.sender]);
- }
-
- s_userOpHashMapping[userOpHash] = true;
- return (abi.encode(userOp.sender, extraCostJuels), _packValidationData(false, 0, 0)); // success
- }
-
- /// @dev Calculates any extra LINK cost for the user operation, based on the funding type passed to the
- /// @dev paymaster. Handles funding the LINK token funding described in the user operation.
- /// TODO: add logic for subscription top-up.
- function _handleExtraCostJuels(UserOperation calldata userOp) internal returns (uint256 extraCost) {
- if (userOp.paymasterAndData.length == 20) {
- return 0; // no extra data, stop here
- }
-
- uint8 paymentType = uint8(userOp.paymasterAndData[20]);
-
- // For direct funding, use top-up logic.
- if (paymentType == uint8(SCALibrary.LinkPaymentType.DIRECT_FUNDING)) {
- SCALibrary.DirectFundingData memory directFundingData = abi.decode(
- userOp.paymasterAndData[21:],
- (SCALibrary.DirectFundingData)
- );
- if (
- directFundingData.topupThreshold != 0 &&
- i_linkToken.balanceOf(directFundingData.recipient) < directFundingData.topupThreshold
- ) {
- i_linkToken.transfer(directFundingData.recipient, directFundingData.topupAmount);
- extraCost = directFundingData.topupAmount;
- }
- }
- return extraCost;
- }
-
- /// @dev Deducts user subscription balance after execution.
- function postOp(PostOpMode /* mode */, bytes calldata context, uint256 actualGasCost) external {
- if (msg.sender != i_entryPoint) {
- revert Unauthorized(msg.sender, i_entryPoint);
- }
- (address sender, uint256 extraCostJuels) = abi.decode(context, (address, uint256));
- s_subscriptions[sender] -= (_getCostJuels(actualGasCost) + extraCostJuels);
- }
-
- function _getCostJuels(uint256 costWei) internal view returns (uint256 costJuels) {
- costJuels = (1e18 * costWei) / uint256(_getFeedData());
- return costJuels;
- }
-
- function _getFeedData() internal view returns (int256) {
- uint32 stalenessSeconds = s_config.stalenessSeconds;
- bool staleFallback = stalenessSeconds > 0;
- uint256 timestamp;
- int256 weiPerUnitLink;
- (, weiPerUnitLink, , timestamp, ) = i_linkEthFeed.latestRoundData();
- if (staleFallback && stalenessSeconds < block.timestamp - timestamp) {
- weiPerUnitLink = s_config.fallbackWeiPerUnitLink;
- }
- return weiPerUnitLink;
- }
-}
diff --git a/contracts/src/v0.8/transmission/dev/ERC-4337/SCA.sol b/contracts/src/v0.8/transmission/dev/ERC-4337/SCA.sol
deleted file mode 100644
index 589c55f5b3b..00000000000
--- a/contracts/src/v0.8/transmission/dev/ERC-4337/SCA.sol
+++ /dev/null
@@ -1,73 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity 0.8.19;
-
-import {IAccount} from "../../../vendor/entrypoint/interfaces/IAccount.sol";
-import {SCALibrary} from "./SCALibrary.sol";
-import {UserOperation} from "../../../vendor/entrypoint/interfaces/UserOperation.sol";
-import {_packValidationData} from "../../../vendor/entrypoint/core/Helpers.sol";
-
-/// @dev Smart Contract Account, a contract deployed for a single user and that allows
-/// @dev them to invoke meta-transactions.
-/// TODO: Consider making the Smart Contract Account upgradeable.
-contract SCA is IAccount {
- uint256 public s_nonce;
- address public immutable i_owner;
- address public immutable i_entryPoint;
-
- error IncorrectNonce(uint256 currentNonce, uint256 nonceGiven);
- error NotAuthorized(address sender);
- error BadFormatOrOOG();
- error TransactionExpired(uint256 deadline, uint256 currentTimestamp);
- error InvalidSignature(bytes32 operationHash, address owner);
-
- // Assign the owner of this contract upon deployment.
- constructor(address owner, address entryPoint) {
- i_owner = owner;
- i_entryPoint = entryPoint;
- }
-
- /// @dev Validates the user operation via a signature check.
- /// TODO: Utilize a "validAfter" for a tx to be only valid _after_ a certain time.
- function validateUserOp(
- UserOperation calldata userOp,
- bytes32 userOpHash,
- uint256 /* missingAccountFunds - unused in favor of paymaster */
- ) external returns (uint256 validationData) {
- if (userOp.nonce != s_nonce) {
- // Revert for non-signature errors.
- revert IncorrectNonce(s_nonce, userOp.nonce);
- }
-
- // Verify signature on hash.
- bytes32 fullHash = SCALibrary._getUserOpFullHash(userOpHash, address(this));
- bytes memory signature = userOp.signature;
- if (SCALibrary._recoverSignature(signature, fullHash) != i_owner) {
- return _packValidationData(true, 0, 0); // signature error
- }
- s_nonce++;
-
- // Unpack deadline, return successful signature.
- (, , uint48 deadline, ) = abi.decode(userOp.callData[4:], (address, uint256, uint48, bytes));
- return _packValidationData(false, deadline, 0);
- }
-
- /// @dev Execute a transaction on behalf of the owner. This function can only
- /// @dev be called by the EntryPoint contract, and assumes that `validateUserOp` has succeeded.
- function executeTransactionFromEntryPoint(address to, uint256 value, uint48 deadline, bytes calldata data) external {
- if (msg.sender != i_entryPoint) {
- revert NotAuthorized(msg.sender);
- }
- if (deadline != 0 && block.timestamp > deadline) {
- revert TransactionExpired(deadline, block.timestamp);
- }
-
- // Execute transaction. Bubble up an error if found.
- (bool success, bytes memory returnData) = to.call{value: value}(data);
- if (!success) {
- if (returnData.length == 0) revert BadFormatOrOOG();
- assembly {
- revert(add(32, returnData), mload(returnData))
- }
- }
- }
-}
diff --git a/contracts/src/v0.8/transmission/dev/ERC-4337/SCALibrary.sol b/contracts/src/v0.8/transmission/dev/ERC-4337/SCALibrary.sol
deleted file mode 100644
index 095a3428ef4..00000000000
--- a/contracts/src/v0.8/transmission/dev/ERC-4337/SCALibrary.sol
+++ /dev/null
@@ -1,48 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-library SCALibrary {
- // keccak256("EIP712Domain(uint256 chainId, address verifyingContract)");
- bytes32 internal constant DOMAIN_SEPARATOR = hex"1c7d3b72b37a35523e273aaadd7b4cd66f618bb81429ab053412d51f50ccea61";
-
- // keccak256("executeTransactionFromEntryPoint(address to, uint256 value, bytes calldata data)");
- bytes32 internal constant TYPEHASH = hex"4750045d47fce615521b32cee713ff8db50147e98aec5ca94926b52651ca3fa0";
-
- enum LinkPaymentType {
- DIRECT_FUNDING,
- SUBSCRIPTION // TODO: implement
- }
-
- struct DirectFundingData {
- address recipient; // recipient of the top-up
- uint256 topupThreshold; // set to zero to disable auto-topup
- uint256 topupAmount;
- }
-
- function _getUserOpFullHash(bytes32 userOpHash, address scaAddress) internal view returns (bytes32 fullHash) {
- bytes32 hashOfEncoding = keccak256(abi.encode(SCALibrary.TYPEHASH, userOpHash));
- fullHash = keccak256(
- abi.encodePacked(
- bytes1(0x19),
- bytes1(0x01),
- SCALibrary.DOMAIN_SEPARATOR,
- block.chainid,
- scaAddress,
- hashOfEncoding
- )
- );
- return fullHash;
- }
-
- function _recoverSignature(bytes memory signature, bytes32 fullHash) internal pure returns (address) {
- bytes32 r;
- bytes32 s;
- assembly {
- r := mload(add(signature, 0x20))
- s := mload(add(signature, 0x40))
- }
- uint8 v = uint8(signature[64]);
-
- return ecrecover(fullHash, v + 27, r, s);
- }
-}
diff --git a/contracts/src/v0.8/transmission/dev/ERC-4337/SmartContractAccountFactory.sol b/contracts/src/v0.8/transmission/dev/ERC-4337/SmartContractAccountFactory.sol
deleted file mode 100644
index f27c8e15cf6..00000000000
--- a/contracts/src/v0.8/transmission/dev/ERC-4337/SmartContractAccountFactory.sol
+++ /dev/null
@@ -1,33 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-contract SmartContractAccountFactory {
- event ContractCreated(address scaAddress);
-
- error DeploymentFailed();
-
- /// @dev Use create2 to deploy a new Smart Contract Account.
- /// @dev See EIP-1014 for more on CREATE2.
- /// TODO: Return the address of the Smart Contract Account even if it is already
- /// deployed.
- function deploySmartContractAccount(
- bytes32 abiEncodedOwnerAddress,
- bytes memory initCode
- ) external payable returns (address scaAddress) {
- assembly {
- scaAddress := create2(
- 0, // value - left at zero here
- add(0x20, initCode), // initialization bytecode
- mload(initCode), // length of initialization bytecode
- abiEncodedOwnerAddress // user-defined nonce to ensure unique SCA addresses
- )
- }
- if (scaAddress == address(0)) {
- revert DeploymentFailed();
- }
-
- emit ContractCreated(scaAddress);
-
- return scaAddress;
- }
-}
diff --git a/contracts/src/v0.8/transmission/dev/testhelpers/Greeter.sol b/contracts/src/v0.8/transmission/dev/testhelpers/Greeter.sol
deleted file mode 100644
index 5851c86581e..00000000000
--- a/contracts/src/v0.8/transmission/dev/testhelpers/Greeter.sol
+++ /dev/null
@@ -1,15 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-/// @dev Ownerless greeter contract.
-contract Greeter {
- string private s_greeting;
-
- function setGreeting(string memory greeting) external {
- s_greeting = greeting;
- }
-
- function getGreeting() external view returns (string memory) {
- return s_greeting;
- }
-}
diff --git a/contracts/src/v0.8/transmission/dev/testhelpers/SmartContractAccountHelper.sol b/contracts/src/v0.8/transmission/dev/testhelpers/SmartContractAccountHelper.sol
deleted file mode 100644
index b080484d8cc..00000000000
--- a/contracts/src/v0.8/transmission/dev/testhelpers/SmartContractAccountHelper.sol
+++ /dev/null
@@ -1,78 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-import {SCA} from "../ERC-4337/SCA.sol";
-import {SmartContractAccountFactory} from "../ERC-4337/SmartContractAccountFactory.sol";
-import {SCALibrary} from "../ERC-4337/SCALibrary.sol";
-
-library SmartContractAccountHelper {
- bytes internal constant INITIALIZE_CODE = type(SCA).creationCode;
-
- function getFullEndTxEncoding(
- address endContract,
- uint256 value,
- uint256 deadline,
- bytes memory data
- ) public view returns (bytes memory encoding) {
- encoding = bytes.concat(
- SCA.executeTransactionFromEntryPoint.selector,
- abi.encode(endContract, value, block.timestamp + deadline, data)
- );
- return encoding;
- }
-
- function getFullHashForSigning(bytes32 userOpHash, address scaAddress) public view returns (bytes32) {
- return SCALibrary._getUserOpFullHash(userOpHash, scaAddress);
- }
-
- function getSCAInitCodeWithConstructor(
- address owner,
- address entryPoint
- ) public pure returns (bytes memory initCode) {
- initCode = bytes.concat(INITIALIZE_CODE, abi.encode(owner, entryPoint));
- return initCode;
- }
-
- function getInitCode(
- address factory,
- address owner,
- address entryPoint
- ) external pure returns (bytes memory initCode) {
- bytes32 salt = bytes32(uint256(uint160(owner)) << 96);
- bytes memory initializeCodeWithConstructor = bytes.concat(INITIALIZE_CODE, abi.encode(owner, entryPoint));
- initCode = bytes.concat(
- bytes20(address(factory)),
- abi.encodeWithSelector(
- SmartContractAccountFactory.deploySmartContractAccount.selector,
- salt,
- initializeCodeWithConstructor
- )
- );
- return initCode;
- }
-
- /// @dev Computes the smart contract address that results from a CREATE2 operation, per EIP-1014.
- function calculateSmartContractAccountAddress(
- address owner,
- address entryPoint,
- address factory
- ) external pure returns (address) {
- bytes32 salt = bytes32(uint256(uint160(owner)) << 96);
- bytes memory initializeCodeWithConstructor = bytes.concat(INITIALIZE_CODE, abi.encode(owner, entryPoint));
- bytes32 initializeCodeHash = keccak256(initializeCodeWithConstructor);
- return address(uint160(uint256(keccak256(abi.encodePacked(hex"ff", address(factory), salt, initializeCodeHash)))));
- }
-
- function getAbiEncodedDirectRequestData(
- address recipient,
- uint256 topupThreshold,
- uint256 topupAmount
- ) external pure returns (bytes memory) {
- SCALibrary.DirectFundingData memory data = SCALibrary.DirectFundingData({
- recipient: recipient,
- topupThreshold: topupThreshold,
- topupAmount: topupAmount
- });
- return abi.encode(data);
- }
-}
diff --git a/contracts/src/v0.8/transmission/test/BaseTest.t.sol b/contracts/src/v0.8/transmission/test/BaseTest.t.sol
deleted file mode 100644
index 4da698d1740..00000000000
--- a/contracts/src/v0.8/transmission/test/BaseTest.t.sol
+++ /dev/null
@@ -1,17 +0,0 @@
-pragma solidity ^0.8.0;
-
-import {Test} from "forge-std/Test.sol";
-
-contract BaseTest is Test {
- bool private s_baseTestInitialized;
- address internal constant OWNER = 0x00007e64E1fB0C487F25dd6D3601ff6aF8d32e4e;
-
- function setUp() public virtual {
- // BaseTest.setUp is often called multiple times from tests' setUp due to inheritance.
- if (s_baseTestInitialized) return;
- s_baseTestInitialized = true;
-
- // Set msg.sender to OWNER until changePrank or stopPrank is called
- vm.startPrank(OWNER);
- }
-}
diff --git a/contracts/src/v0.8/transmission/test/EIP_712_1014_4337.t.sol b/contracts/src/v0.8/transmission/test/EIP_712_1014_4337.t.sol
deleted file mode 100644
index fdfe190de26..00000000000
--- a/contracts/src/v0.8/transmission/test/EIP_712_1014_4337.t.sol
+++ /dev/null
@@ -1,365 +0,0 @@
-pragma solidity 0.8.19;
-
-import "../../shared/interfaces/LinkTokenInterface.sol";
-
-import "./BaseTest.t.sol";
-import "../dev/ERC-4337/SmartContractAccountFactory.sol";
-import "../dev/testhelpers/SmartContractAccountHelper.sol";
-import "../dev/ERC-4337/SCA.sol";
-import "../dev/testhelpers/Greeter.sol";
-import "../dev/ERC-4337/Paymaster.sol";
-import "../../transmission/dev/ERC-4337/SCALibrary.sol";
-import "../../mocks/MockLinkToken.sol";
-import "../../tests/MockV3Aggregator.sol";
-import "../../vrf/mocks/VRFCoordinatorMock.sol";
-import "../../vrf/testhelpers/VRFConsumer.sol";
-
-import "../../vendor/entrypoint/interfaces/UserOperation.sol";
-import "../../vendor/entrypoint/core/EntryPoint.sol";
-import "../../vendor/entrypoint/interfaces/IEntryPoint.sol";
-
-/*--------------------------------------------------------------------------------------------------------------------+
-| EIP 712 + 1014 + 4337 |
-| ________________ |
-| This implementation allows for meta-transactions to be signed by end-users and posted on-chain by executors. It |
-| utilizes the following components: |
-| - EIP-712: The method by which meta-transactions are authorized. |
-| - EIP-1014: The method by which the Smart Contract Account is generated. |
-| - EIP-4337: The method by which meta-transactions are executed. |
-| |
-| The below tests illustrate end-user flows for interacting with this meta-transaction system. For users with |
-| existing Smart Contract Accounts (SCAs), they simply sign off on the operation, after which the executor |
-| invokes the EntryPoint that authorizes the operation on the end-user's SCA, and then execute the transaction |
-| as the SCA. For users without existing SCAs, EIP-1014 ensures that the address of an SCA can be known in advance, |
-| so users can sign-off on transactions that will be executed by a not-yet-deployed SCA. The EntryPoint contract |
-| takes advantage of this functionality and allows for the SCA to be created in the same user operation that invokes |
-| it, and the end-user signs off on this creation-and-execution flow. After the initial creation-and-execution, the |
-| SCA is reused for future transactions. |
-| |
-| End-Dapps/protocols do not need to be EIP-2771-compliant or accommodate any other kind of transaction standard. |
-| They can be interacted with out-of-the-box through the SCA, which acts in place of the user's EOA as their |
-| immutable identity. |
-| |
--+---------------------------------------------------------------------------------------------------------------------*/
-
-contract EIP_712_1014_4337 is BaseTest {
- event RandomnessRequest(address indexed sender, bytes32 indexed keyHash, uint256 indexed seed, uint256 fee);
-
- address internal constant LINK_WHALE = 0xD883a6A1C22fC4AbFE938a5aDF9B2Cc31b1BF18B;
- address internal ENTRY_POINT;
-
- Greeter greeter;
- EntryPoint entryPoint;
- MockV3Aggregator linkEthFeed;
-
- // Randomly generated private/public key pair.
- uint256 END_USER_PKEY = uint256(bytes32(hex"99d518dbfea4b4ec301390f7e26d53d711fa1ca0c1a6e4cbed89617d4c578a8e"));
- address END_USER = 0xB6708257D4E1bf0b8C144793fc2Ff3193C737ed1;
-
- function setUp() public override {
- BaseTest.setUp();
- // Fund user accounts;
- vm.deal(END_USER, 10_000 ether);
- vm.deal(LINK_WHALE, 10_000 ether);
-
- // Impersonate a LINK whale.
- changePrank(LINK_WHALE);
-
- // Create simple greeter contract.
- greeter = new Greeter();
- assertEq("", greeter.getGreeting());
-
- // Create entry point contract.
- entryPoint = new EntryPoint();
- ENTRY_POINT = address(entryPoint);
-
- // Deploy link/eth feed.
- linkEthFeed = new MockV3Aggregator(18, 5000000000000000); // .005 ETH
- }
-
- /// @dev Test case for user that already has a Smart Contract Account.
- /// @dev EntryPoint.sol should use the existing SCA to execute the meta transaction.
- function testEIP712EIP4337WithExistingSmartContractAccount() public {
- // Pre-calculate user smart contract account address.
- SmartContractAccountFactory factory = new SmartContractAccountFactory();
- address toDeployAddress = SmartContractAccountHelper.calculateSmartContractAccountAddress(
- END_USER,
- ENTRY_POINT,
- address(factory)
- );
-
- // Deploy the end-contract.
- bytes32 salt = bytes32(uint256(uint160(END_USER)) << 96);
- bytes memory fullInitializeCode = SmartContractAccountHelper.getSCAInitCodeWithConstructor(END_USER, ENTRY_POINT);
- factory.deploySmartContractAccount(salt, fullInitializeCode);
- changePrank(END_USER);
-
- // Ensure a correct deployment and a functioning end-contract.
- uint256 contractCodeSize;
- assembly {
- contractCodeSize := extcodesize(toDeployAddress)
- }
- assertTrue(contractCodeSize > 0);
- assertEq(END_USER, SCA(toDeployAddress).i_owner());
-
- // Create the calldata for a setGreeting call.
- string memory greeting = "hi";
- bytes memory encodedGreetingCall = bytes.concat(Greeter.setGreeting.selector, abi.encode(greeting)); // abi.encodeWithSelector equivalent
-
- // Produce the final full end-tx encoding, to be used as calldata in the user operation.
- bytes memory fullEncoding = SmartContractAccountHelper.getFullEndTxEncoding(
- address(greeter),
- uint256(0),
- 0,
- encodedGreetingCall
- );
-
- // Construct the user operation.
- UserOperation memory op = UserOperation({
- sender: toDeployAddress,
- nonce: 0,
- initCode: "",
- callData: fullEncoding,
- callGasLimit: 1_000_000,
- verificationGasLimit: 1_000_000,
- preVerificationGas: 10_000,
- maxFeePerGas: 100,
- maxPriorityFeePerGas: 200,
- paymasterAndData: "",
- signature: ""
- });
-
- // Sign user operation.
- bytes32 userOpHash = entryPoint.getUserOpHash(op);
- bytes32 fullHash = SCALibrary._getUserOpFullHash(userOpHash, toDeployAddress);
- (uint8 v, bytes32 r, bytes32 s) = vm.sign(END_USER_PKEY, fullHash);
- op.signature = abi.encodePacked(r, s, v - 27);
-
- // Deposit funds for the transaction.
- entryPoint.depositTo{value: 10 ether}(toDeployAddress);
-
- // Execute the user operation.
- UserOperation[] memory operations = new UserOperation[](1);
- operations[0] = op;
- entryPoint.handleOps(operations, payable(END_USER));
-
- // Assert that the greeting was set.
- assertEq("hi", Greeter(greeter).getGreeting());
- assertEq(SCA(toDeployAddress).s_nonce(), uint256(1));
- }
-
- /// @dev Test case for fresh user, EntryPoint.sol should generate a
- /// @dev Smart Contract Account for them and execute the meta transaction.
- function testEIP712EIP4337AndCreateSmartContractAccount() public {
- // Pre-calculate user smart contract account address.
- SmartContractAccountFactory factory = new SmartContractAccountFactory();
- address toDeployAddress = SmartContractAccountHelper.calculateSmartContractAccountAddress(
- END_USER,
- ENTRY_POINT,
- address(factory)
- );
-
- // Construct initCode byte array.
- bytes memory fullInitializeCode = SmartContractAccountHelper.getInitCode(address(factory), END_USER, ENTRY_POINT);
-
- // Create the calldata for a setGreeting call.
- string memory greeting = "bye";
- bytes memory encodedGreetingCall = bytes.concat(Greeter.setGreeting.selector, abi.encode(greeting));
-
- // Produce the final full end-tx encoding, to be used as calldata in the user operation.
- bytes memory fullEncoding = SmartContractAccountHelper.getFullEndTxEncoding(
- address(greeter),
- uint256(0),
- 0,
- encodedGreetingCall
- );
-
- // Construct the user operation.
- UserOperation memory op = UserOperation({
- sender: toDeployAddress,
- nonce: 0,
- initCode: fullInitializeCode,
- callData: fullEncoding,
- callGasLimit: 1_000_000,
- verificationGasLimit: 1_000_000,
- preVerificationGas: 10_000,
- maxFeePerGas: 100,
- maxPriorityFeePerGas: 200,
- paymasterAndData: "",
- signature: ""
- });
-
- // Sign user operation.
- bytes32 userOpHash = entryPoint.getUserOpHash(op);
- bytes32 fullHash = SCALibrary._getUserOpFullHash(userOpHash, toDeployAddress);
- (uint8 v, bytes32 r, bytes32 s) = vm.sign(END_USER_PKEY, fullHash);
- op.signature = abi.encodePacked(r, s, v - 27);
-
- // Deposit funds for the transaction.
- entryPoint.depositTo{value: 10 ether}(toDeployAddress);
-
- // Execute the user operation.
- UserOperation[] memory operations = new UserOperation[](1);
- operations[0] = op;
- entryPoint.handleOps(operations, payable(END_USER));
-
- // Assert that the greeting was set.
- assertEq("bye", Greeter(greeter).getGreeting());
- assertEq(SCA(toDeployAddress).s_nonce(), uint256(1));
- assertEq(SCA(toDeployAddress).i_owner(), END_USER);
- }
-
- /// @dev Test case for a user executing a setGreeting with a LINK token paymaster.
- function testEIP712EIP4337AndCreateSmartContractAccountWithPaymaster() public {
- // Pre-calculate user smart contract account address.
- SmartContractAccountFactory factory = new SmartContractAccountFactory();
- address toDeployAddress = SmartContractAccountHelper.calculateSmartContractAccountAddress(
- END_USER,
- ENTRY_POINT,
- address(factory)
- );
-
- // Construct initCode byte array.
- bytes memory fullInitializeCode = SmartContractAccountHelper.getInitCode(address(factory), END_USER, ENTRY_POINT);
-
- // Create the calldata for a setGreeting call.
- string memory greeting = "good day";
- bytes memory encodedGreetingCall = bytes.concat(Greeter.setGreeting.selector, abi.encode(greeting));
-
- // Produce the final full end-tx encoding, to be used as calldata in the user operation.
- bytes memory fullEncoding = SmartContractAccountHelper.getFullEndTxEncoding(
- address(greeter),
- uint256(0),
- 0,
- encodedGreetingCall
- );
-
- // Create Link token, and deposit into paymaster.
- MockLinkToken linkToken = new MockLinkToken();
- Paymaster paymaster = new Paymaster(LinkTokenInterface(address(linkToken)), linkEthFeed, ENTRY_POINT);
- linkToken.transferAndCall(address(paymaster), 1000 ether, abi.encode(address(toDeployAddress)));
-
- // Construct the user opeartion.
- UserOperation memory op = UserOperation({
- sender: toDeployAddress,
- nonce: 0,
- initCode: fullInitializeCode,
- callData: fullEncoding,
- callGasLimit: 1_000_000,
- verificationGasLimit: 1_500_000,
- preVerificationGas: 10_000,
- maxFeePerGas: 100,
- maxPriorityFeePerGas: 200,
- paymasterAndData: abi.encodePacked(address(paymaster)),
- signature: ""
- });
-
- // Sign user operation.
- bytes32 userOpHash = entryPoint.getUserOpHash(op);
- bytes32 fullHash = SCALibrary._getUserOpFullHash(userOpHash, toDeployAddress);
- (uint8 v, bytes32 r, bytes32 s) = vm.sign(END_USER_PKEY, fullHash);
- op.signature = abi.encodePacked(r, s, v - 27);
-
- // Deposit funds for the transaction.
- entryPoint.depositTo{value: 10 ether}(address(paymaster));
-
- // Execute the user operation.
- UserOperation[] memory operations = new UserOperation[](1);
- operations[0] = op;
- entryPoint.handleOps(operations, payable(END_USER));
-
- // Assert that the greeting was set.
- assertEq("good day", Greeter(greeter).getGreeting());
- assertEq(SCA(toDeployAddress).s_nonce(), uint256(1));
- }
-
- /// @dev Test case for a VRF Request via LINK token paymaster and an SCA.
- function testEIP712EIP4337AndCreateSmartContractAccountWithPaymasterForVRFRequest() public {
- // Pre-calculate user smart contract account address.
- SmartContractAccountFactory factory = new SmartContractAccountFactory();
- address toDeployAddress = SmartContractAccountHelper.calculateSmartContractAccountAddress(
- END_USER,
- ENTRY_POINT,
- address(factory)
- );
-
- // Construct initCode byte array.
- bytes memory fullInitializeCode = SmartContractAccountHelper.getInitCode(address(factory), END_USER, ENTRY_POINT);
-
- // Create the calldata for a VRF request.
- bytes32 keyhash = bytes32(uint256(123));
- uint256 fee = 1 ether;
- bytes memory encodedVRFRequestCallData = bytes.concat(
- VRFConsumer.doRequestRandomness.selector,
- abi.encode(keyhash, fee)
- );
-
- // Create the VRF Contracts
- MockLinkToken linkToken = new MockLinkToken();
- VRFCoordinatorMock vrfCoordinator = new VRFCoordinatorMock(address(linkToken));
- VRFConsumer vrfConsumer = new VRFConsumer(address(vrfCoordinator), address(linkToken));
-
- // Produce the final full end-tx encoding, to be used as calldata in the user operation.
- bytes memory fullEncoding = SmartContractAccountHelper.getFullEndTxEncoding(
- address(vrfConsumer), // end-contract
- uint256(0), // value
- 0, // timeout (seconds)
- encodedVRFRequestCallData
- );
-
- // Create Link token, and deposit into paymaster.
- Paymaster paymaster = new Paymaster(LinkTokenInterface(address(linkToken)), linkEthFeed, ENTRY_POINT);
- linkToken.transferAndCall(address(paymaster), 1000 ether, abi.encode(address(toDeployAddress)));
-
- // Construct direct funding data.
- SCALibrary.DirectFundingData memory directFundingData = SCALibrary.DirectFundingData({
- recipient: address(vrfConsumer),
- topupThreshold: 1,
- topupAmount: 10 ether
- });
-
- // Construct the user operation.
- UserOperation memory op = UserOperation({
- sender: toDeployAddress,
- nonce: 0,
- initCode: fullInitializeCode,
- callData: fullEncoding,
- callGasLimit: 200_000,
- verificationGasLimit: 1_000_000,
- preVerificationGas: 10_000,
- maxFeePerGas: 10,
- maxPriorityFeePerGas: 10,
- paymasterAndData: abi.encodePacked(address(paymaster), uint8(0), abi.encode(directFundingData)),
- signature: ""
- });
-
- // Sign user operation.
- bytes32 fullHash = SCALibrary._getUserOpFullHash(entryPoint.getUserOpHash(op), toDeployAddress);
- op.signature = getSignature(fullHash);
-
- // Deposit funds for the transaction.
- entryPoint.depositTo{value: 10 ether}(address(paymaster));
-
- // Assert correct log is emitted for the end-contract vrf request.
- vm.expectEmit(true, true, true, true);
- emit RandomnessRequest(
- address(vrfConsumer),
- keyhash,
- 0, // seed - we use a zero seed
- fee
- );
-
- // Execute the user operation.
- UserOperation[] memory operations = new UserOperation[](1);
- operations[0] = op;
-
- // Execute user operation and ensure correct outcome.
- entryPoint.handleOps(operations, payable(END_USER));
- assertEq(SCA(toDeployAddress).s_nonce(), uint256(1));
- }
-
- function getSignature(bytes32 h) internal view returns (bytes memory) {
- (uint8 v, bytes32 r, bytes32 s) = vm.sign(END_USER_PKEY, h);
- return abi.encodePacked(r, s, v - 27);
- }
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/core/EntryPoint.sol b/contracts/src/v0.8/vendor/entrypoint/core/EntryPoint.sol
deleted file mode 100644
index 86a34b07bf7..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/core/EntryPoint.sol
+++ /dev/null
@@ -1,861 +0,0 @@
-/**
- ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.
- ** Only one instance required on each chain.
- **/
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity ^0.8.12;
-
-/* solhint-disable avoid-low-level-calls */
-/* solhint-disable no-inline-assembly */
-
-import "../interfaces/IAccount.sol";
-import "../interfaces/IPaymaster.sol";
-import "../interfaces/IEntryPoint.sol";
-
-import "../utils/Exec.sol";
-import "./StakeManager.sol";
-import "./SenderCreator.sol";
-import "./Helpers.sol";
-
-contract EntryPoint is IEntryPoint, StakeManager {
- using UserOperationLib for UserOperation;
-
- SenderCreator private immutable senderCreator = new SenderCreator();
-
- // internal value used during simulation: need to query aggregator.
- address private constant SIMULATE_FIND_AGGREGATOR = address(1);
-
- // marker for inner call revert on out of gas
- bytes32 private constant INNER_OUT_OF_GAS = hex"deaddead";
-
- uint256 private constant REVERT_REASON_MAX_LEN = 2048;
-
- /**
- * for simulation purposes, validateUserOp (and validatePaymasterUserOp) must return this value
- * in case of signature failure, instead of revert.
- */
- uint256 public constant SIG_VALIDATION_FAILED = 1;
-
- /**
- * compensate the caller's beneficiary address with the collected fees of all UserOperations.
- * @param beneficiary the address to receive the fees
- * @param amount amount to transfer.
- */
- function _compensate(address payable beneficiary, uint256 amount) internal {
- require(beneficiary != address(0), "AA90 invalid beneficiary");
- (bool success, ) = beneficiary.call{value: amount}("");
- require(success, "AA91 failed send to beneficiary");
- }
-
- /**
- * execute a user op
- * @param opIndex index into the opInfo array
- * @param userOp the userOp to execute
- * @param opInfo the opInfo filled by validatePrepayment for this userOp.
- * @return collected the total amount this userOp paid.
- */
- function _executeUserOp(
- uint256 opIndex,
- UserOperation calldata userOp,
- UserOpInfo memory opInfo
- ) private returns (uint256 collected) {
- uint256 preGas = gasleft();
- bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);
-
- try this.innerHandleOp(userOp.callData, opInfo, context) returns (
- uint256 _actualGasCost
- ) {
- collected = _actualGasCost;
- } catch {
- bytes32 innerRevertCode;
- assembly {
- returndatacopy(0, 0, 32)
- innerRevertCode := mload(0)
- }
- // handleOps was called with gas limit too low. abort entire bundle.
- if (innerRevertCode == INNER_OUT_OF_GAS) {
- //report paymaster, since if it is not deliberately caused by the bundler,
- // it must be a revert caused by paymaster.
- revert FailedOp(opIndex, "AA95 out of gas");
- }
-
- uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;
- collected = _handlePostOp(
- opIndex,
- IPaymaster.PostOpMode.postOpReverted,
- opInfo,
- context,
- actualGas
- );
- }
- }
-
- /**
- * Execute a batch of UserOperations.
- * no signature aggregator is used.
- * if any account requires an aggregator (that is, it returned an aggregator when
- * performing simulateValidation), then handleAggregatedOps() must be used instead.
- * @param ops the operations to execute
- * @param beneficiary the address to receive the fees
- */
- function handleOps(
- UserOperation[] calldata ops,
- address payable beneficiary
- ) public {
- uint256 opslen = ops.length;
- UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);
-
- unchecked {
- for (uint256 i = 0; i < opslen; i++) {
- UserOpInfo memory opInfo = opInfos[i];
- (
- uint256 validationData,
- uint256 pmValidationData
- ) = _validatePrepayment(i, ops[i], opInfo);
- _validateAccountAndPaymasterValidationData(
- i,
- validationData,
- pmValidationData,
- address(0)
- );
- }
-
- uint256 collected = 0;
-
- for (uint256 i = 0; i < opslen; i++) {
- collected += _executeUserOp(i, ops[i], opInfos[i]);
- }
-
- _compensate(beneficiary, collected);
- } //unchecked
- }
-
- /**
- * Execute a batch of UserOperation with Aggregators
- * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)
- * @param beneficiary the address to receive the fees
- */
- function handleAggregatedOps(
- UserOpsPerAggregator[] calldata opsPerAggregator,
- address payable beneficiary
- ) public {
- uint256 opasLen = opsPerAggregator.length;
- uint256 totalOps = 0;
- for (uint256 i = 0; i < opasLen; i++) {
- UserOpsPerAggregator calldata opa = opsPerAggregator[i];
- UserOperation[] calldata ops = opa.userOps;
- IAggregator aggregator = opa.aggregator;
-
- //address(1) is special marker of "signature error"
- require(
- address(aggregator) != address(1),
- "AA96 invalid aggregator"
- );
-
- if (address(aggregator) != address(0)) {
- // solhint-disable-next-line no-empty-blocks
- try aggregator.validateSignatures(ops, opa.signature) {} catch {
- revert SignatureValidationFailed(address(aggregator));
- }
- }
-
- totalOps += ops.length;
- }
-
- UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);
-
- uint256 opIndex = 0;
- for (uint256 a = 0; a < opasLen; a++) {
- UserOpsPerAggregator calldata opa = opsPerAggregator[a];
- UserOperation[] calldata ops = opa.userOps;
- IAggregator aggregator = opa.aggregator;
-
- uint256 opslen = ops.length;
- for (uint256 i = 0; i < opslen; i++) {
- UserOpInfo memory opInfo = opInfos[opIndex];
- (
- uint256 validationData,
- uint256 paymasterValidationData
- ) = _validatePrepayment(opIndex, ops[i], opInfo);
- _validateAccountAndPaymasterValidationData(
- i,
- validationData,
- paymasterValidationData,
- address(aggregator)
- );
- opIndex++;
- }
- }
-
- uint256 collected = 0;
- opIndex = 0;
- for (uint256 a = 0; a < opasLen; a++) {
- UserOpsPerAggregator calldata opa = opsPerAggregator[a];
- emit SignatureAggregatorChanged(address(opa.aggregator));
- UserOperation[] calldata ops = opa.userOps;
- uint256 opslen = ops.length;
-
- for (uint256 i = 0; i < opslen; i++) {
- collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);
- opIndex++;
- }
- }
- emit SignatureAggregatorChanged(address(0));
-
- _compensate(beneficiary, collected);
- }
-
- /// @inheritdoc IEntryPoint
- function simulateHandleOp(
- UserOperation calldata op,
- address target,
- bytes calldata targetCallData
- ) external override {
- UserOpInfo memory opInfo;
- _simulationOnlyValidations(op);
- (
- uint256 validationData,
- uint256 paymasterValidationData
- ) = _validatePrepayment(0, op, opInfo);
- ValidationData memory data = _intersectTimeRange(
- validationData,
- paymasterValidationData
- );
-
- numberMarker();
- uint256 paid = _executeUserOp(0, op, opInfo);
- numberMarker();
- bool targetSuccess;
- bytes memory targetResult;
- if (target != address(0)) {
- (targetSuccess, targetResult) = target.call(targetCallData);
- }
- revert ExecutionResult(
- opInfo.preOpGas,
- paid,
- data.validAfter,
- data.validUntil,
- targetSuccess,
- targetResult
- );
- }
-
- // A memory copy of UserOp static fields only.
- // Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.
- struct MemoryUserOp {
- address sender;
- uint256 nonce;
- uint256 callGasLimit;
- uint256 verificationGasLimit;
- uint256 preVerificationGas;
- address paymaster;
- uint256 maxFeePerGas;
- uint256 maxPriorityFeePerGas;
- }
-
- struct UserOpInfo {
- MemoryUserOp mUserOp;
- bytes32 userOpHash;
- uint256 prefund;
- uint256 contextOffset;
- uint256 preOpGas;
- }
-
- /**
- * inner function to handle a UserOperation.
- * Must be declared "external" to open a call context, but it can only be called by handleOps.
- */
- function innerHandleOp(
- bytes memory callData,
- UserOpInfo memory opInfo,
- bytes calldata context
- ) external returns (uint256 actualGasCost) {
- uint256 preGas = gasleft();
- require(msg.sender == address(this), "AA92 internal call only");
- MemoryUserOp memory mUserOp = opInfo.mUserOp;
-
- uint256 callGasLimit = mUserOp.callGasLimit;
- unchecked {
- // handleOps was called with gas limit too low. abort entire bundle.
- if (
- gasleft() < callGasLimit + mUserOp.verificationGasLimit + 5000
- ) {
- assembly {
- mstore(0, INNER_OUT_OF_GAS)
- revert(0, 32)
- }
- }
- }
-
- IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;
- if (callData.length > 0) {
- bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);
- if (!success) {
- bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);
- if (result.length > 0) {
- emit UserOperationRevertReason(
- opInfo.userOpHash,
- mUserOp.sender,
- mUserOp.nonce,
- result
- );
- }
- mode = IPaymaster.PostOpMode.opReverted;
- }
- }
-
- unchecked {
- uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;
- //note: opIndex is ignored (relevant only if mode==postOpReverted, which is only possible outside of innerHandleOp)
- return _handlePostOp(0, mode, opInfo, context, actualGas);
- }
- }
-
- /**
- * generate a request Id - unique identifier for this request.
- * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.
- */
- function getUserOpHash(UserOperation calldata userOp)
- public
- view
- returns (bytes32)
- {
- return
- keccak256(abi.encode(userOp.hash(), address(this), block.chainid));
- }
-
- /**
- * copy general fields from userOp into the memory opInfo structure.
- */
- function _copyUserOpToMemory(
- UserOperation calldata userOp,
- MemoryUserOp memory mUserOp
- ) internal pure {
- mUserOp.sender = userOp.sender;
- mUserOp.nonce = userOp.nonce;
- mUserOp.callGasLimit = userOp.callGasLimit;
- mUserOp.verificationGasLimit = userOp.verificationGasLimit;
- mUserOp.preVerificationGas = userOp.preVerificationGas;
- mUserOp.maxFeePerGas = userOp.maxFeePerGas;
- mUserOp.maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;
- bytes calldata paymasterAndData = userOp.paymasterAndData;
- if (paymasterAndData.length > 0) {
- require(
- paymasterAndData.length >= 20,
- "AA93 invalid paymasterAndData"
- );
- mUserOp.paymaster = address(bytes20(paymasterAndData[:20]));
- } else {
- mUserOp.paymaster = address(0);
- }
- }
-
- /**
- * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.
- * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.
- * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.
- * @param userOp the user operation to validate.
- */
- function simulateValidation(UserOperation calldata userOp) external {
- UserOpInfo memory outOpInfo;
-
- _simulationOnlyValidations(userOp);
- (
- uint256 validationData,
- uint256 paymasterValidationData
- ) = _validatePrepayment(0, userOp, outOpInfo);
- StakeInfo memory paymasterInfo = _getStakeInfo(
- outOpInfo.mUserOp.paymaster
- );
- StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);
- StakeInfo memory factoryInfo;
- {
- bytes calldata initCode = userOp.initCode;
- address factory = initCode.length >= 20
- ? address(bytes20(initCode[0:20]))
- : address(0);
- factoryInfo = _getStakeInfo(factory);
- }
-
- ValidationData memory data = _intersectTimeRange(
- validationData,
- paymasterValidationData
- );
- address aggregator = data.aggregator;
- bool sigFailed = aggregator == address(1);
- ReturnInfo memory returnInfo = ReturnInfo(
- outOpInfo.preOpGas,
- outOpInfo.prefund,
- sigFailed,
- data.validAfter,
- data.validUntil,
- getMemoryBytesFromOffset(outOpInfo.contextOffset)
- );
-
- if (aggregator != address(0) && aggregator != address(1)) {
- AggregatorStakeInfo memory aggregatorInfo = AggregatorStakeInfo(
- aggregator,
- _getStakeInfo(aggregator)
- );
- revert ValidationResultWithAggregation(
- returnInfo,
- senderInfo,
- factoryInfo,
- paymasterInfo,
- aggregatorInfo
- );
- }
- revert ValidationResult(
- returnInfo,
- senderInfo,
- factoryInfo,
- paymasterInfo
- );
- }
-
- function _getRequiredPrefund(MemoryUserOp memory mUserOp)
- internal
- pure
- returns (uint256 requiredPrefund)
- {
- unchecked {
- //when using a Paymaster, the verificationGasLimit is used also to as a limit for the postOp call.
- // our security model might call postOp eventually twice
- uint256 mul = mUserOp.paymaster != address(0) ? 3 : 1;
- uint256 requiredGas = mUserOp.callGasLimit +
- mUserOp.verificationGasLimit *
- mul +
- mUserOp.preVerificationGas;
-
- requiredPrefund = requiredGas * mUserOp.maxFeePerGas;
- }
- }
-
- // create the sender's contract if needed.
- function _createSenderIfNeeded(
- uint256 opIndex,
- UserOpInfo memory opInfo,
- bytes calldata initCode
- ) internal {
- if (initCode.length != 0) {
- address sender = opInfo.mUserOp.sender;
- if (sender.code.length != 0)
- revert FailedOp(opIndex, "AA10 sender already constructed");
- address sender1 = senderCreator.createSender{
- gas: opInfo.mUserOp.verificationGasLimit
- }(initCode);
- if (sender1 == address(0))
- revert FailedOp(opIndex, "AA13 initCode failed or OOG");
- if (sender1 != sender)
- revert FailedOp(opIndex, "AA14 initCode must return sender");
- if (sender1.code.length == 0)
- revert FailedOp(opIndex, "AA15 initCode must create sender");
- address factory = address(bytes20(initCode[0:20]));
- emit AccountDeployed(
- opInfo.userOpHash,
- sender,
- factory,
- opInfo.mUserOp.paymaster
- );
- }
- }
-
- /**
- * Get counterfactual sender address.
- * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.
- * this method always revert, and returns the address in SenderAddressResult error
- * @param initCode the constructor code to be passed into the UserOperation.
- */
- function getSenderAddress(bytes calldata initCode) public {
- revert SenderAddressResult(senderCreator.createSender(initCode));
- }
-
- function _simulationOnlyValidations(UserOperation calldata userOp)
- internal
- view
- {
- // solhint-disable-next-line no-empty-blocks
- try
- this._validateSenderAndPaymaster(
- userOp.initCode,
- userOp.sender,
- userOp.paymasterAndData
- )
- {} catch Error(string memory revertReason) {
- if (bytes(revertReason).length != 0) {
- revert FailedOp(0, revertReason);
- }
- }
- }
-
- /**
- * Called only during simulation.
- * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.
- */
- function _validateSenderAndPaymaster(
- bytes calldata initCode,
- address sender,
- bytes calldata paymasterAndData
- ) external view {
- if (initCode.length == 0 && sender.code.length == 0) {
- // it would revert anyway. but give a meaningful message
- revert("AA20 account not deployed");
- }
- if (paymasterAndData.length >= 20) {
- address paymaster = address(bytes20(paymasterAndData[0:20]));
- if (paymaster.code.length == 0) {
- // it would revert anyway. but give a meaningful message
- revert("AA30 paymaster not deployed");
- }
- }
- // always revert
- revert("");
- }
-
- /**
- * call account.validateUserOp.
- * revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.
- * decrement account's deposit if needed
- */
- function _validateAccountPrepayment(
- uint256 opIndex,
- UserOperation calldata op,
- UserOpInfo memory opInfo,
- uint256 requiredPrefund
- )
- internal
- returns (
- uint256 gasUsedByValidateAccountPrepayment,
- uint256 validationData
- )
- {
- unchecked {
- uint256 preGas = gasleft();
- MemoryUserOp memory mUserOp = opInfo.mUserOp;
- address sender = mUserOp.sender;
- _createSenderIfNeeded(opIndex, opInfo, op.initCode);
- address paymaster = mUserOp.paymaster;
- numberMarker();
- uint256 missingAccountFunds = 0;
- if (paymaster == address(0)) {
- uint256 bal = balanceOf(sender);
- missingAccountFunds = bal > requiredPrefund
- ? 0
- : requiredPrefund - bal;
- }
- try
- IAccount(sender).validateUserOp{
- gas: mUserOp.verificationGasLimit
- }(op, opInfo.userOpHash, missingAccountFunds)
- returns (uint256 _validationData) {
- validationData = _validationData;
- } catch Error(string memory revertReason) {
- revert FailedOp(
- opIndex,
- string.concat("AA23 reverted: ", revertReason)
- );
- } catch {
- revert FailedOp(opIndex, "AA23 reverted (or OOG)");
- }
- if (paymaster == address(0)) {
- DepositInfo storage senderInfo = deposits[sender];
- uint256 deposit = senderInfo.deposit;
- if (requiredPrefund > deposit) {
- revert FailedOp(opIndex, "AA21 didn't pay prefund");
- }
- senderInfo.deposit = uint112(deposit - requiredPrefund);
- }
- gasUsedByValidateAccountPrepayment = preGas - gasleft();
- }
- }
-
- /**
- * In case the request has a paymaster:
- * Validate paymaster has enough deposit.
- * Call paymaster.validatePaymasterUserOp.
- * Revert with proper FailedOp in case paymaster reverts.
- * Decrement paymaster's deposit
- */
- function _validatePaymasterPrepayment(
- uint256 opIndex,
- UserOperation calldata op,
- UserOpInfo memory opInfo,
- uint256 requiredPreFund,
- uint256 gasUsedByValidateAccountPrepayment
- ) internal returns (bytes memory context, uint256 validationData) {
- unchecked {
- MemoryUserOp memory mUserOp = opInfo.mUserOp;
- uint256 verificationGasLimit = mUserOp.verificationGasLimit;
- require(
- verificationGasLimit > gasUsedByValidateAccountPrepayment,
- "AA41 too little verificationGas"
- );
- uint256 gas = verificationGasLimit -
- gasUsedByValidateAccountPrepayment;
-
- address paymaster = mUserOp.paymaster;
- DepositInfo storage paymasterInfo = deposits[paymaster];
- uint256 deposit = paymasterInfo.deposit;
- if (deposit < requiredPreFund) {
- revert FailedOp(opIndex, "AA31 paymaster deposit too low");
- }
- paymasterInfo.deposit = uint112(deposit - requiredPreFund);
- try
- IPaymaster(paymaster).validatePaymasterUserOp{gas: gas}(
- op,
- opInfo.userOpHash,
- requiredPreFund
- )
- returns (bytes memory _context, uint256 _validationData) {
- context = _context;
- validationData = _validationData;
- } catch Error(string memory revertReason) {
- revert FailedOp(
- opIndex,
- string.concat("AA33 reverted: ", revertReason)
- );
- } catch {
- revert FailedOp(opIndex, "AA33 reverted (or OOG)");
- }
- }
- }
-
- /**
- * revert if either account validationData or paymaster validationData is expired
- */
- function _validateAccountAndPaymasterValidationData(
- uint256 opIndex,
- uint256 validationData,
- uint256 paymasterValidationData,
- address expectedAggregator
- ) internal view {
- (address aggregator, bool outOfTimeRange) = _getValidationData(
- validationData
- );
- if (expectedAggregator != aggregator) {
- revert FailedOp(opIndex, "AA24 signature error");
- }
- if (outOfTimeRange) {
- revert FailedOp(opIndex, "AA22 expired or not due");
- }
- //pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.
- // non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation)
- address pmAggregator;
- (pmAggregator, outOfTimeRange) = _getValidationData(
- paymasterValidationData
- );
- if (pmAggregator != address(0)) {
- revert FailedOp(opIndex, "AA34 signature error");
- }
- if (outOfTimeRange) {
- revert FailedOp(opIndex, "AA32 paymaster expired or not due");
- }
- }
-
- function _getValidationData(uint256 validationData)
- internal
- view
- returns (address aggregator, bool outOfTimeRange)
- {
- if (validationData == 0) {
- return (address(0), false);
- }
- ValidationData memory data = _parseValidationData(validationData);
- // solhint-disable-next-line not-rely-on-time
- outOfTimeRange =
- block.timestamp > data.validUntil ||
- block.timestamp < data.validAfter;
- aggregator = data.aggregator;
- }
-
- /**
- * validate account and paymaster (if defined).
- * also make sure total validation doesn't exceed verificationGasLimit
- * this method is called off-chain (simulateValidation()) and on-chain (from handleOps)
- * @param opIndex the index of this userOp into the "opInfos" array
- * @param userOp the userOp to validate
- */
- function _validatePrepayment(
- uint256 opIndex,
- UserOperation calldata userOp,
- UserOpInfo memory outOpInfo
- )
- private
- returns (uint256 validationData, uint256 paymasterValidationData)
- {
- uint256 preGas = gasleft();
- MemoryUserOp memory mUserOp = outOpInfo.mUserOp;
- _copyUserOpToMemory(userOp, mUserOp);
- outOpInfo.userOpHash = getUserOpHash(userOp);
-
- // validate all numeric values in userOp are well below 128 bit, so they can safely be added
- // and multiplied without causing overflow
- uint256 maxGasValues = mUserOp.preVerificationGas |
- mUserOp.verificationGasLimit |
- mUserOp.callGasLimit |
- userOp.maxFeePerGas |
- userOp.maxPriorityFeePerGas;
- require(maxGasValues <= type(uint120).max, "AA94 gas values overflow");
-
- uint256 gasUsedByValidateAccountPrepayment;
- uint256 requiredPreFund = _getRequiredPrefund(mUserOp);
- (
- gasUsedByValidateAccountPrepayment,
- validationData
- ) = _validateAccountPrepayment(
- opIndex,
- userOp,
- outOpInfo,
- requiredPreFund
- );
- //a "marker" where account opcode validation is done and paymaster opcode validation is about to start
- // (used only by off-chain simulateValidation)
- numberMarker();
-
- bytes memory context;
- if (mUserOp.paymaster != address(0)) {
- (context, paymasterValidationData) = _validatePaymasterPrepayment(
- opIndex,
- userOp,
- outOpInfo,
- requiredPreFund,
- gasUsedByValidateAccountPrepayment
- );
- }
- unchecked {
- uint256 gasUsed = preGas - gasleft();
-
- if (userOp.verificationGasLimit < gasUsed) {
- revert FailedOp(opIndex, "AA40 over verificationGasLimit");
- }
- outOpInfo.prefund = requiredPreFund;
- outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);
- outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;
- }
- }
-
- /**
- * process post-operation.
- * called just after the callData is executed.
- * if a paymaster is defined and its validation returned a non-empty context, its postOp is called.
- * the excess amount is refunded to the account (or paymaster - if it was used in the request)
- * @param opIndex index in the batch
- * @param mode - whether is called from innerHandleOp, or outside (postOpReverted)
- * @param opInfo userOp fields and info collected during validation
- * @param context the context returned in validatePaymasterUserOp
- * @param actualGas the gas used so far by this user operation
- */
- function _handlePostOp(
- uint256 opIndex,
- IPaymaster.PostOpMode mode,
- UserOpInfo memory opInfo,
- bytes memory context,
- uint256 actualGas
- ) private returns (uint256 actualGasCost) {
- uint256 preGas = gasleft();
- unchecked {
- address refundAddress;
- MemoryUserOp memory mUserOp = opInfo.mUserOp;
- uint256 gasPrice = getUserOpGasPrice(mUserOp);
-
- address paymaster = mUserOp.paymaster;
- if (paymaster == address(0)) {
- refundAddress = mUserOp.sender;
- } else {
- refundAddress = paymaster;
- if (context.length > 0) {
- actualGasCost = actualGas * gasPrice;
- if (mode != IPaymaster.PostOpMode.postOpReverted) {
- IPaymaster(paymaster).postOp{
- gas: mUserOp.verificationGasLimit
- }(mode, context, actualGasCost);
- } else {
- // solhint-disable-next-line no-empty-blocks
- try
- IPaymaster(paymaster).postOp{
- gas: mUserOp.verificationGasLimit
- }(mode, context, actualGasCost)
- {} catch Error(string memory reason) {
- revert FailedOp(
- opIndex,
- string.concat("AA50 postOp reverted: ", reason)
- );
- } catch {
- revert FailedOp(opIndex, "AA50 postOp revert");
- }
- }
- }
- }
- actualGas += preGas - gasleft();
- actualGasCost = actualGas * gasPrice;
- if (opInfo.prefund < actualGasCost) {
- revert FailedOp(opIndex, "AA51 prefund below actualGasCost");
- }
- uint256 refund = opInfo.prefund - actualGasCost;
- _incrementDeposit(refundAddress, refund);
- bool success = mode == IPaymaster.PostOpMode.opSucceeded;
- emit UserOperationEvent(
- opInfo.userOpHash,
- mUserOp.sender,
- mUserOp.paymaster,
- mUserOp.nonce,
- success,
- actualGasCost,
- actualGas
- );
- } // unchecked
- }
-
- /**
- * the gas price this UserOp agrees to pay.
- * relayer/block builder might submit the TX with higher priorityFee, but the user should not
- */
- function getUserOpGasPrice(MemoryUserOp memory mUserOp)
- internal
- view
- returns (uint256)
- {
- unchecked {
- uint256 maxFeePerGas = mUserOp.maxFeePerGas;
- uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;
- if (maxFeePerGas == maxPriorityFeePerGas) {
- //legacy mode (for networks that don't support basefee opcode)
- return maxFeePerGas;
- }
- return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);
- }
- }
-
- function min(uint256 a, uint256 b) internal pure returns (uint256) {
- return a < b ? a : b;
- }
-
- function getOffsetOfMemoryBytes(bytes memory data)
- internal
- pure
- returns (uint256 offset)
- {
- assembly {
- offset := data
- }
- }
-
- function getMemoryBytesFromOffset(uint256 offset)
- internal
- pure
- returns (bytes memory data)
- {
- assembly {
- data := offset
- }
- }
-
- //place the NUMBER opcode in the code.
- // this is used as a marker during simulation, as this OP is completely banned from the simulated code of the
- // account and paymaster.
- function numberMarker() internal view {
- assembly {
- mstore(0, number())
- }
- }
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/core/Helpers.sol b/contracts/src/v0.8/vendor/entrypoint/core/Helpers.sol
deleted file mode 100644
index 71a6dc3d16b..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/core/Helpers.sol
+++ /dev/null
@@ -1,68 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity ^0.8.12;
-
-/**
- * returned data from validateUserOp.
- * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`
- * @param aggregator - address(0) - the account validated the signature by itself.
- * address(1) - the account failed to validate the signature.
- * otherwise - this is an address of a signature aggregator that must be used to validate the signature.
- * @param validAfter - this UserOp is valid only after this timestamp.
- * @param validaUntil - this UserOp is valid only up to this timestamp.
- */
-struct ValidationData {
- address aggregator;
- uint48 validAfter;
- uint48 validUntil;
-}
-
-//extract sigFailed, validAfter, validUntil.
-// also convert zero validUntil to type(uint48).max
-function _parseValidationData(uint validationData) pure returns (ValidationData memory data) {
- address aggregator = address(uint160(validationData));
- uint48 validUntil = uint48(validationData >> 160);
- if (validUntil == 0) {
- validUntil = type(uint48).max;
- }
- uint48 validAfter = uint48(validationData >> (48 + 160));
- return ValidationData(aggregator, validAfter, validUntil);
-}
-
-// intersect account and paymaster ranges.
-function _intersectTimeRange(
- uint256 validationData,
- uint256 paymasterValidationData
-) pure returns (ValidationData memory) {
- ValidationData memory accountValidationData = _parseValidationData(validationData);
- ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);
- address aggregator = accountValidationData.aggregator;
- if (aggregator == address(0)) {
- aggregator = pmValidationData.aggregator;
- }
- uint48 validAfter = accountValidationData.validAfter;
- uint48 validUntil = accountValidationData.validUntil;
- uint48 pmValidAfter = pmValidationData.validAfter;
- uint48 pmValidUntil = pmValidationData.validUntil;
-
- if (validAfter < pmValidAfter) validAfter = pmValidAfter;
- if (validUntil > pmValidUntil) validUntil = pmValidUntil;
- return ValidationData(aggregator, validAfter, validUntil);
-}
-
-/**
- * helper to pack the return value for validateUserOp
- * @param data - the ValidationData to pack
- */
-function _packValidationData(ValidationData memory data) pure returns (uint256) {
- return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));
-}
-
-/**
- * helper to pack the return value for validateUserOp, when not using an aggregator
- * @param sigFailed - true for signature failure, false for success
- * @param validUntil last timestamp this UserOperation is valid (or zero for infinite)
- * @param validAfter first timestamp this UserOperation is valid
- */
-function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) {
- return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48));
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/core/SenderCreator.sol b/contracts/src/v0.8/vendor/entrypoint/core/SenderCreator.sol
deleted file mode 100644
index 36fad7b91f1..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/core/SenderCreator.sol
+++ /dev/null
@@ -1,28 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity ^0.8.12;
-
-/**
- * helper contract for EntryPoint, to call userOp.initCode from a "neutral" address,
- * which is explicitly not the entryPoint itself.
- */
-contract SenderCreator {
-
- /**
- * call the "initCode" factory to create and return the sender account address
- * @param initCode the initCode value from a UserOp. contains 20 bytes of factory address, followed by calldata
- * @return sender the returned address of the created account, or zero address on failure.
- */
- function createSender(bytes calldata initCode) external returns (address sender) {
- address factory = address(bytes20(initCode[0 : 20]));
- bytes memory initCallData = initCode[20 :];
- bool success;
- /* solhint-disable no-inline-assembly */
- assembly {
- success := call(gas(), factory, 0, add(initCallData, 0x20), mload(initCallData), 0, 32)
- sender := mload(0)
- }
- if (!success) {
- sender = address(0);
- }
- }
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/core/StakeManager.sol b/contracts/src/v0.8/vendor/entrypoint/core/StakeManager.sol
deleted file mode 100644
index e5ca2b97dd4..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/core/StakeManager.sol
+++ /dev/null
@@ -1,124 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0-only
-pragma solidity ^0.8.12;
-
-import "../interfaces/IStakeManager.sol";
-
-/* solhint-disable avoid-low-level-calls */
-/* solhint-disable not-rely-on-time */
-/**
- * manage deposits and stakes.
- * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)
- * stake is value locked for at least "unstakeDelay" by a paymaster.
- */
-abstract contract StakeManager is IStakeManager {
-
- /// maps paymaster to their deposits and stakes
- mapping(address => DepositInfo) public deposits;
-
- /// @inheritdoc IStakeManager
- function getDepositInfo(address account) public view returns (DepositInfo memory info) {
- return deposits[account];
- }
-
- // internal method to return just the stake info
- function _getStakeInfo(address addr) internal view returns (StakeInfo memory info) {
- DepositInfo storage depositInfo = deposits[addr];
- info.stake = depositInfo.stake;
- info.unstakeDelaySec = depositInfo.unstakeDelaySec;
- }
-
- /// return the deposit (for gas payment) of the account
- function balanceOf(address account) public view returns (uint256) {
- return deposits[account].deposit;
- }
-
- receive() external payable {
- depositTo(msg.sender);
- }
-
- function _incrementDeposit(address account, uint256 amount) internal {
- DepositInfo storage info = deposits[account];
- uint256 newAmount = info.deposit + amount;
- require(newAmount <= type(uint112).max, "deposit overflow");
- info.deposit = uint112(newAmount);
- }
-
- /**
- * add to the deposit of the given account
- */
- function depositTo(address account) public payable {
- _incrementDeposit(account, msg.value);
- DepositInfo storage info = deposits[account];
- emit Deposited(account, info.deposit);
- }
-
- /**
- * add to the account's stake - amount and delay
- * any pending unstake is first cancelled.
- * @param unstakeDelaySec the new lock duration before the deposit can be withdrawn.
- */
- function addStake(uint32 unstakeDelaySec) public payable {
- DepositInfo storage info = deposits[msg.sender];
- require(unstakeDelaySec > 0, "must specify unstake delay");
- require(unstakeDelaySec >= info.unstakeDelaySec, "cannot decrease unstake time");
- uint256 stake = info.stake + msg.value;
- require(stake > 0, "no stake specified");
- require(stake <= type(uint112).max, "stake overflow");
- deposits[msg.sender] = DepositInfo(
- info.deposit,
- true,
- uint112(stake),
- unstakeDelaySec,
- 0
- );
- emit StakeLocked(msg.sender, stake, unstakeDelaySec);
- }
-
- /**
- * attempt to unlock the stake.
- * the value can be withdrawn (using withdrawStake) after the unstake delay.
- */
- function unlockStake() external {
- DepositInfo storage info = deposits[msg.sender];
- require(info.unstakeDelaySec != 0, "not staked");
- require(info.staked, "already unstaking");
- uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;
- info.withdrawTime = withdrawTime;
- info.staked = false;
- emit StakeUnlocked(msg.sender, withdrawTime);
- }
-
-
- /**
- * withdraw from the (unlocked) stake.
- * must first call unlockStake and wait for the unstakeDelay to pass
- * @param withdrawAddress the address to send withdrawn value.
- */
- function withdrawStake(address payable withdrawAddress) external {
- DepositInfo storage info = deposits[msg.sender];
- uint256 stake = info.stake;
- require(stake > 0, "No stake to withdraw");
- require(info.withdrawTime > 0, "must call unlockStake() first");
- require(info.withdrawTime <= block.timestamp, "Stake withdrawal is not due");
- info.unstakeDelaySec = 0;
- info.withdrawTime = 0;
- info.stake = 0;
- emit StakeWithdrawn(msg.sender, withdrawAddress, stake);
- (bool success,) = withdrawAddress.call{value : stake}("");
- require(success, "failed to withdraw stake");
- }
-
- /**
- * withdraw from the deposit.
- * @param withdrawAddress the address to send withdrawn value.
- * @param withdrawAmount the amount to withdraw.
- */
- function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external {
- DepositInfo storage info = deposits[msg.sender];
- require(withdrawAmount <= info.deposit, "Withdraw amount too large");
- info.deposit = uint112(info.deposit - withdrawAmount);
- emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);
- (bool success,) = withdrawAddress.call{value : withdrawAmount}("");
- require(success, "failed to withdraw");
- }
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/interfaces/IAccount.sol b/contracts/src/v0.8/vendor/entrypoint/interfaces/IAccount.sol
deleted file mode 100644
index 1600de3d71e..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/interfaces/IAccount.sol
+++ /dev/null
@@ -1,34 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity ^0.8.12;
-
-import "./UserOperation.sol";
-
-interface IAccount {
-
- /**
- * Validate user's signature and nonce
- * the entryPoint will make the call to the recipient only if this validation call returns successfully.
- * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).
- * This allows making a "simulation call" without a valid signature
- * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.
- *
- * @dev Must validate caller is the entryPoint.
- * Must validate the signature and nonce
- * @param userOp the operation that is about to be executed.
- * @param userOpHash hash of the user's request data. can be used as the basis for signature.
- * @param missingAccountFunds missing funds on the account's deposit in the entrypoint.
- * This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.
- * The excess is left as a deposit in the entrypoint, for future calls.
- * can be withdrawn anytime using "entryPoint.withdrawTo()"
- * In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.
- * @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode
- * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,
- * otherwise, an address of an "authorizer" contract.
- * <6-byte> validUntil - last timestamp this operation is valid. 0 for "indefinite"
- * <6-byte> validAfter - first timestamp this operation is valid
- * If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.
- * Note that the validation code cannot use block.timestamp (or block.number) directly.
- */
- function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)
- external returns (uint256 validationData);
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/interfaces/IAggregator.sol b/contracts/src/v0.8/vendor/entrypoint/interfaces/IAggregator.sol
deleted file mode 100644
index 086c6f32241..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/interfaces/IAggregator.sol
+++ /dev/null
@@ -1,36 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity ^0.8.12;
-
-import "./UserOperation.sol";
-
-/**
- * Aggregated Signatures validator.
- */
-interface IAggregator {
-
- /**
- * validate aggregated signature.
- * revert if the aggregated signature does not match the given list of operations.
- */
- function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;
-
- /**
- * validate signature of a single userOp
- * This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation
- * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.
- * @param userOp the userOperation received from the user.
- * @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.
- * (usually empty, unless account and aggregator support some kind of "multisig"
- */
- function validateUserOpSignature(UserOperation calldata userOp)
- external view returns (bytes memory sigForUserOp);
-
- /**
- * aggregate multiple signatures into a single value.
- * This method is called off-chain to calculate the signature to pass with handleOps()
- * bundler MAY use optimized custom code perform this aggregation
- * @param userOps array of UserOperations to collect the signatures from.
- * @return aggregatedSignature the aggregated signature
- */
- function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/interfaces/IEntryPoint.sol b/contracts/src/v0.8/vendor/entrypoint/interfaces/IEntryPoint.sol
deleted file mode 100644
index 22bb1b7a6e7..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/interfaces/IEntryPoint.sol
+++ /dev/null
@@ -1,197 +0,0 @@
-/**
- ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.
- ** Only one instance required on each chain.
- **/
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity ^0.8.12;
-
-/* solhint-disable avoid-low-level-calls */
-/* solhint-disable no-inline-assembly */
-/* solhint-disable reason-string */
-
-import "./UserOperation.sol";
-import "./IStakeManager.sol";
-import "./IAggregator.sol";
-
-interface IEntryPoint is IStakeManager {
-
- /***
- * An event emitted after each successful request
- * @param userOpHash - unique identifier for the request (hash its entire content, except signature).
- * @param sender - the account that generates this request.
- * @param paymaster - if non-null, the paymaster that pays for this request.
- * @param nonce - the nonce value from the request.
- * @param success - true if the sender transaction succeeded, false if reverted.
- * @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.
- * @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).
- */
- event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);
-
- /**
- * account "sender" was deployed.
- * @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.
- * @param sender the account that is deployed
- * @param factory the factory used to deploy this account (in the initCode)
- * @param paymaster the paymaster used by this UserOp
- */
- event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);
-
- /**
- * An event emitted if the UserOperation "callData" reverted with non-zero length
- * @param userOpHash the request unique identifier.
- * @param sender the sender of this request
- * @param nonce the nonce used in the request
- * @param revertReason - the return bytes from the (reverted) call to "callData".
- */
- event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);
-
- /**
- * signature aggregator used by the following UserOperationEvents within this bundle.
- */
- event SignatureAggregatorChanged(address indexed aggregator);
-
- /**
- * a custom revert error of handleOps, to identify the offending op.
- * NOTE: if simulateValidation passes successfully, there should be no reason for handleOps to fail on it.
- * @param opIndex - index into the array of ops to the failed one (in simulateValidation, this is always zero)
- * @param reason - revert reason
- * The string starts with a unique code "AAmn", where "m" is "1" for factory, "2" for account and "3" for paymaster issues,
- * so a failure can be attributed to the correct entity.
- * Should be caught in off-chain handleOps simulation and not happen on-chain.
- * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.
- */
- error FailedOp(uint256 opIndex, string reason);
-
- /**
- * error case when a signature aggregator fails to verify the aggregated signature it had created.
- */
- error SignatureValidationFailed(address aggregator);
-
- /**
- * Successful result from simulateValidation.
- * @param returnInfo gas and time-range returned values
- * @param senderInfo stake information about the sender
- * @param factoryInfo stake information about the factory (if any)
- * @param paymasterInfo stake information about the paymaster (if any)
- */
- error ValidationResult(ReturnInfo returnInfo,
- StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo);
-
- /**
- * Successful result from simulateValidation, if the account returns a signature aggregator
- * @param returnInfo gas and time-range returned values
- * @param senderInfo stake information about the sender
- * @param factoryInfo stake information about the factory (if any)
- * @param paymasterInfo stake information about the paymaster (if any)
- * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator)
- * bundler MUST use it to verify the signature, or reject the UserOperation
- */
- error ValidationResultWithAggregation(ReturnInfo returnInfo,
- StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo,
- AggregatorStakeInfo aggregatorInfo);
-
- /**
- * return value of getSenderAddress
- */
- error SenderAddressResult(address sender);
-
- /**
- * return value of simulateHandleOp
- */
- error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult);
-
- //UserOps handled, per aggregator
- struct UserOpsPerAggregator {
- UserOperation[] userOps;
-
- // aggregator address
- IAggregator aggregator;
- // aggregated signature
- bytes signature;
- }
-
- /**
- * Execute a batch of UserOperation.
- * no signature aggregator is used.
- * if any account requires an aggregator (that is, it returned an aggregator when
- * performing simulateValidation), then handleAggregatedOps() must be used instead.
- * @param ops the operations to execute
- * @param beneficiary the address to receive the fees
- */
- function handleOps(UserOperation[] calldata ops, address payable beneficiary) external;
-
- /**
- * Execute a batch of UserOperation with Aggregators
- * @param opsPerAggregator the operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts)
- * @param beneficiary the address to receive the fees
- */
- function handleAggregatedOps(
- UserOpsPerAggregator[] calldata opsPerAggregator,
- address payable beneficiary
- ) external;
-
- /**
- * generate a request Id - unique identifier for this request.
- * the request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.
- */
- function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32);
-
- /**
- * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.
- * @dev this method always revert. Successful result is ValidationResult error. other errors are failures.
- * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data.
- * @param userOp the user operation to validate.
- */
- function simulateValidation(UserOperation calldata userOp) external;
-
- /**
- * gas and return values during simulation
- * @param preOpGas the gas used for validation (including preValidationGas)
- * @param prefund the required prefund for this operation
- * @param sigFailed validateUserOp's (or paymaster's) signature check failed
- * @param validAfter - first timestamp this UserOp is valid (merging account and paymaster time-range)
- * @param validUntil - last timestamp this UserOp is valid (merging account and paymaster time-range)
- * @param paymasterContext returned by validatePaymasterUserOp (to be passed into postOp)
- */
- struct ReturnInfo {
- uint256 preOpGas;
- uint256 prefund;
- bool sigFailed;
- uint48 validAfter;
- uint48 validUntil;
- bytes paymasterContext;
- }
-
- /**
- * returned aggregated signature info.
- * the aggregator returned by the account, and its current stake.
- */
- struct AggregatorStakeInfo {
- address aggregator;
- StakeInfo stakeInfo;
- }
-
- /**
- * Get counterfactual sender address.
- * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.
- * this method always revert, and returns the address in SenderAddressResult error
- * @param initCode the constructor code to be passed into the UserOperation.
- */
- function getSenderAddress(bytes memory initCode) external;
-
-
- /**
- * simulate full execution of a UserOperation (including both validation and target execution)
- * this method will always revert with "ExecutionResult".
- * it performs full validation of the UserOperation, but ignores signature error.
- * an optional target address is called after the userop succeeds, and its value is returned
- * (before the entire call is reverted)
- * Note that in order to collect the the success/failure of the target call, it must be executed
- * with trace enabled to track the emitted events.
- * @param op the UserOperation to simulate
- * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult
- * are set to the return from that call.
- * @param targetCallData callData to pass to target address
- */
- function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external;
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/interfaces/IPaymaster.sol b/contracts/src/v0.8/vendor/entrypoint/interfaces/IPaymaster.sol
deleted file mode 100644
index af50367acfc..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/interfaces/IPaymaster.sol
+++ /dev/null
@@ -1,51 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity ^0.8.12;
-
-import "./UserOperation.sol";
-
-/**
- * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.
- * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.
- */
-interface IPaymaster {
-
- enum PostOpMode {
- opSucceeded, // user op succeeded
- opReverted, // user op reverted. still has to pay for gas.
- postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted.
- }
-
- /**
- * payment validation: check if paymaster agrees to pay.
- * Must verify sender is the entryPoint.
- * Revert to reject this request.
- * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted)
- * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.
- * @param userOp the user operation
- * @param userOpHash hash of the user's request data.
- * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp)
- * @return context value to send to a postOp
- * zero length to signify postOp is not required.
- * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation
- * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,
- * otherwise, an address of an "authorizer" contract.
- * <6-byte> validUntil - last timestamp this operation is valid. 0 for "indefinite"
- * <6-byte> validAfter - first timestamp this operation is valid
- * Note that the validation code cannot use block.timestamp (or block.number) directly.
- */
- function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost)
- external returns (bytes memory context, uint256 validationData);
-
- /**
- * post-operation handler.
- * Must verify sender is the entryPoint
- * @param mode enum with the following options:
- * opSucceeded - user operation succeeded.
- * opReverted - user op reverted. still has to pay for gas.
- * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert.
- * Now this is the 2nd call, after user's op was deliberately reverted.
- * @param context - the context value returned by validatePaymasterUserOp
- * @param actualGasCost - actual gas used so far (without this postOp call).
- */
- function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/interfaces/IStakeManager.sol b/contracts/src/v0.8/vendor/entrypoint/interfaces/IStakeManager.sol
deleted file mode 100644
index c19c1bab88b..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/interfaces/IStakeManager.sol
+++ /dev/null
@@ -1,104 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0-only
-pragma solidity ^0.8.12;
-
-/**
- * manage deposits and stakes.
- * deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)
- * stake is value locked for at least "unstakeDelay" by the staked entity.
- */
-interface IStakeManager {
-
- event Deposited(
- address indexed account,
- uint256 totalDeposit
- );
-
- event Withdrawn(
- address indexed account,
- address withdrawAddress,
- uint256 amount
- );
-
- /// Emitted when stake or unstake delay are modified
- event StakeLocked(
- address indexed account,
- uint256 totalStaked,
- uint256 unstakeDelaySec
- );
-
- /// Emitted once a stake is scheduled for withdrawal
- event StakeUnlocked(
- address indexed account,
- uint256 withdrawTime
- );
-
- event StakeWithdrawn(
- address indexed account,
- address withdrawAddress,
- uint256 amount
- );
-
- /**
- * @param deposit the entity's deposit
- * @param staked true if this entity is staked.
- * @param stake actual amount of ether staked for this entity.
- * @param unstakeDelaySec minimum delay to withdraw the stake.
- * @param withdrawTime - first block timestamp where 'withdrawStake' will be callable, or zero if already locked
- * @dev sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps)
- * and the rest fit into a 2nd cell.
- * 112 bit allows for 10^15 eth
- * 48 bit for full timestamp
- * 32 bit allows 150 years for unstake delay
- */
- struct DepositInfo {
- uint112 deposit;
- bool staked;
- uint112 stake;
- uint32 unstakeDelaySec;
- uint48 withdrawTime;
- }
-
- //API struct used by getStakeInfo and simulateValidation
- struct StakeInfo {
- uint256 stake;
- uint256 unstakeDelaySec;
- }
-
- /// @return info - full deposit information of given account
- function getDepositInfo(address account) external view returns (DepositInfo memory info);
-
- /// @return the deposit (for gas payment) of the account
- function balanceOf(address account) external view returns (uint256);
-
- /**
- * add to the deposit of the given account
- */
- function depositTo(address account) external payable;
-
- /**
- * add to the account's stake - amount and delay
- * any pending unstake is first cancelled.
- * @param _unstakeDelaySec the new lock duration before the deposit can be withdrawn.
- */
- function addStake(uint32 _unstakeDelaySec) external payable;
-
- /**
- * attempt to unlock the stake.
- * the value can be withdrawn (using withdrawStake) after the unstake delay.
- */
- function unlockStake() external;
-
- /**
- * withdraw from the (unlocked) stake.
- * must first call unlockStake and wait for the unstakeDelay to pass
- * @param withdrawAddress the address to send withdrawn value.
- */
- function withdrawStake(address payable withdrawAddress) external;
-
- /**
- * withdraw from the deposit.
- * @param withdrawAddress the address to send withdrawn value.
- * @param withdrawAmount the amount to withdraw.
- */
- function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/interfaces/UserOperation.sol b/contracts/src/v0.8/vendor/entrypoint/interfaces/UserOperation.sol
deleted file mode 100644
index dfff42791f3..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/interfaces/UserOperation.sol
+++ /dev/null
@@ -1,84 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity ^0.8.12;
-
-/* solhint-disable no-inline-assembly */
-
- /**
- * User Operation struct
- * @param sender the sender account of this request.
- * @param nonce unique value the sender uses to verify it is not a replay.
- * @param initCode if set, the account contract will be created by this constructor/
- * @param callData the method call to execute on this account.
- * @param callGasLimit the gas limit passed to the callData method call.
- * @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.
- * @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.
- * @param maxFeePerGas same as EIP-1559 gas parameter.
- * @param maxPriorityFeePerGas same as EIP-1559 gas parameter.
- * @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.
- * @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.
- */
- struct UserOperation {
-
- address sender;
- uint256 nonce;
- bytes initCode;
- bytes callData;
- uint256 callGasLimit;
- uint256 verificationGasLimit;
- uint256 preVerificationGas;
- uint256 maxFeePerGas;
- uint256 maxPriorityFeePerGas;
- bytes paymasterAndData;
- bytes signature;
- }
-
-/**
- * Utility functions helpful when working with UserOperation structs.
- */
-library UserOperationLib {
-
- function getSender(UserOperation calldata userOp) internal pure returns (address) {
- address data;
- //read sender from userOp, which is first userOp member (saves 800 gas...)
- assembly {data := calldataload(userOp)}
- return address(uint160(data));
- }
-
- //relayer/block builder might submit the TX with higher priorityFee, but the user should not
- // pay above what he signed for.
- function gasPrice(UserOperation calldata userOp) internal view returns (uint256) {
- unchecked {
- uint256 maxFeePerGas = userOp.maxFeePerGas;
- uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas;
- if (maxFeePerGas == maxPriorityFeePerGas) {
- //legacy mode (for networks that don't support basefee opcode)
- return maxFeePerGas;
- }
- return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);
- }
- }
-
- function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) {
- //lighter signature scheme. must match UserOp.ts#packUserOp
- bytes calldata sig = userOp.signature;
- // copy directly the userOp from calldata up to (but not including) the signature.
- // this encoding depends on the ABI encoding of calldata, but is much lighter to copy
- // than referencing each field separately.
- assembly {
- let ofs := userOp
- let len := sub(sub(sig.offset, ofs), 32)
- ret := mload(0x40)
- mstore(0x40, add(ret, add(len, 32)))
- mstore(ret, len)
- calldatacopy(add(ret, 32), ofs, len)
- }
- }
-
- function hash(UserOperation calldata userOp) internal pure returns (bytes32) {
- return keccak256(pack(userOp));
- }
-
- function min(uint256 a, uint256 b) internal pure returns (uint256) {
- return a < b ? a : b;
- }
-}
diff --git a/contracts/src/v0.8/vendor/entrypoint/utils/Exec.sol b/contracts/src/v0.8/vendor/entrypoint/utils/Exec.sol
deleted file mode 100644
index 69d653d938a..00000000000
--- a/contracts/src/v0.8/vendor/entrypoint/utils/Exec.sol
+++ /dev/null
@@ -1,70 +0,0 @@
-// SPDX-License-Identifier: LGPL-3.0-only
-pragma solidity >=0.7.5 <0.9.0;
-
-// solhint-disable no-inline-assembly
-
-/**
- * Utility functions helpful when making different kinds of contract calls in Solidity.
- */
-library Exec {
-
- function call(
- address to,
- uint256 value,
- bytes memory data,
- uint256 txGas
- ) internal returns (bool success) {
- assembly {
- success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)
- }
- }
-
- function staticcall(
- address to,
- bytes memory data,
- uint256 txGas
- ) internal view returns (bool success) {
- assembly {
- success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)
- }
- }
-
- function delegateCall(
- address to,
- bytes memory data,
- uint256 txGas
- ) internal returns (bool success) {
- assembly {
- success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)
- }
- }
-
- // get returned data from last call or calldelegate
- function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {
- assembly {
- let len := returndatasize()
- if gt(len, maxLen) {
- len := maxLen
- }
- let ptr := mload(0x40)
- mstore(0x40, add(ptr, add(len, 0x20)))
- mstore(ptr, len)
- returndatacopy(add(ptr, 0x20), 0, len)
- returnData := ptr
- }
- }
-
- // revert with explicit byte array (probably reverted info from call)
- function revertWithData(bytes memory returnData) internal pure {
- assembly {
- revert(add(returnData, 32), mload(returnData))
- }
- }
-
- function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {
- bool success = call(to,0,data,gasleft());
- if (!success) {
- revertWithData(getReturnData(maxLen));
- }
- }
-}
diff --git a/contracts/src/v0.8/workflow/dev/WorkflowRegistry.sol b/contracts/src/v0.8/workflow/dev/WorkflowRegistry.sol
index 0e6ae3450ac..2454374b2fb 100644
--- a/contracts/src/v0.8/workflow/dev/WorkflowRegistry.sol
+++ b/contracts/src/v0.8/workflow/dev/WorkflowRegistry.sol
@@ -43,6 +43,8 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
/// @dev Mapping to track workflows by secretsURL hash (owner + secretsURL).
/// This is used to find all workflows that have the same secretsURL when a force secrets update event is requested.
mapping(bytes32 secretsURLHash => EnumerableSet.Bytes32Set workflowKeys) private s_secretsHashToWorkflows;
+ /// @dev Keep track of all workflowIDs to ensure uniqueness.
+ mapping(bytes32 workflowID => bool inUse) private s_workflowIDs;
/// @dev List of all authorized EOAs/contracts allowed to access this contract's state functions. All view functions are open access.
EnumerableSet.AddressSet private s_authorizedAddresses;
@@ -203,13 +205,15 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
) external registryNotLocked {
_validatePermissions(donID, msg.sender);
_validateWorkflowName(bytes(workflowName).length);
- _validateWorkflowMetadata(workflowID, bytes(binaryURL).length, bytes(configURL).length, bytes(secretsURL).length);
+ _validateWorkflowURLs(bytes(binaryURL).length, bytes(configURL).length, bytes(secretsURL).length);
bytes32 workflowKey = computeHashKey(msg.sender, workflowName);
if (s_workflows[workflowKey].owner != address(0)) {
revert WorkflowAlreadyRegistered();
}
+ _requireUniqueWorkflowID(workflowID);
+
// Create new workflow entry
s_workflows[workflowKey] = WorkflowMetadata({
workflowID: workflowID,
@@ -272,7 +276,7 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
string calldata configURL,
string calldata secretsURL
) external registryNotLocked {
- _validateWorkflowMetadata(newWorkflowID, bytes(binaryURL).length, bytes(configURL).length, bytes(secretsURL).length);
+ _validateWorkflowURLs(bytes(binaryURL).length, bytes(configURL).length, bytes(secretsURL).length);
WorkflowMetadata storage workflow = _getWorkflowFromStorage(msg.sender, workflowKey);
@@ -295,6 +299,12 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
revert WorkflowContentNotUpdated();
}
+ // Ensure the new workflowID is unique
+ _requireUniqueWorkflowID(newWorkflowID);
+
+ // Free the old workflowID
+ s_workflowIDs[currentWorkflowID] = false;
+
// Update all fields that have changed and the relevant sets
workflow.workflowID = newWorkflowID;
if (!sameBinaryURL) {
@@ -387,6 +397,9 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
revert AddressNotAuthorized(msg.sender);
}
+ // Release the workflowID for reuse
+ s_workflowIDs[workflow.workflowID] = false;
+
// Remove the workflow from the owner and DON mappings
s_ownerWorkflowKeys[msg.sender].remove(workflowKey);
s_donWorkflowKeys[workflow.donID].remove(workflowKey);
@@ -508,6 +521,20 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
return workflow;
}
+ /// @notice Ensures the given workflowID is unique and marks it as used.
+ /// @param workflowID The workflowID to validate and consume.
+ function _requireUniqueWorkflowID(
+ bytes32 workflowID
+ ) internal {
+ if (workflowID == bytes32(0)) revert InvalidWorkflowID();
+
+ if (s_workflowIDs[workflowID]) {
+ revert WorkflowIDAlreadyExists();
+ }
+
+ s_workflowIDs[workflowID] = true;
+ }
+
// ================================================================
// | Workflow Queries |
// ================================================================
@@ -636,16 +663,12 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
// | Validation |
// ================================================================
- /// @dev Internal function to validate the metadata for a workflow.
- /// @param workflowID The unique identifier for the workflow.
- function _validateWorkflowMetadata(
- bytes32 workflowID,
+ /// @dev Internal function to validate the urls for a workflow.
+ function _validateWorkflowURLs(
uint256 binaryURLLength,
uint256 configURLLength,
uint256 secretsURLLength
) internal pure {
- if (workflowID == bytes32(0)) revert InvalidWorkflowID();
-
if (binaryURLLength > MAX_URL_LENGTH) {
revert URLTooLong(binaryURLLength, MAX_URL_LENGTH);
}
diff --git a/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.registerWorkflow.t.sol b/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.registerWorkflow.t.sol
index 426fbfcc502..859437196cd 100644
--- a/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.registerWorkflow.t.sol
+++ b/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.registerWorkflow.t.sol
@@ -138,6 +138,35 @@ contract WorkflowRegistry_registerWorkflow is WorkflowRegistrySetup {
);
}
+ // whenTheCallerIsAnAuthorizedAddress whenTheRegistryIsNotLocked whenTheDonIDIsAllowed
+ function test_RevertWhen_TheWorkflowIDIsAlreadyInUsedByAnotherWorkflow() external {
+ vm.startPrank(s_authorizedAddress);
+
+ // Register a valid workflow first
+ s_registry.registerWorkflow(
+ s_validWorkflowName,
+ s_validWorkflowID,
+ s_allowedDonID,
+ WorkflowRegistry.WorkflowStatus.ACTIVE,
+ s_validBinaryURL,
+ s_validConfigURL,
+ s_validSecretsURL
+ );
+
+ vm.expectRevert(WorkflowRegistry.WorkflowIDAlreadyExists.selector);
+ s_registry.registerWorkflow(
+ "ValidWorkflow2",
+ s_validWorkflowID,
+ s_allowedDonID,
+ WorkflowRegistry.WorkflowStatus.ACTIVE,
+ s_validBinaryURL,
+ s_validConfigURL,
+ s_validSecretsURL
+ );
+
+ vm.stopPrank();
+ }
+
// whenTheCallerIsAnAuthorizedAddress whenTheRegistryIsNotLocked whenTheDonIDIsAllowed
function test_RevertWhen_TheWorkflowNameIsAlreadyUsedByTheOwner() external {
vm.startPrank(s_authorizedAddress);
diff --git a/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.registerWorkflow.tree b/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.registerWorkflow.tree
index 75cdf940575..eabbf58d464 100644
--- a/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.registerWorkflow.tree
+++ b/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.registerWorkflow.tree
@@ -18,6 +18,8 @@ WorkflowRegistry.registerWorkflow
│ └── it should revert
├── when the workflowID is invalid
│ └── it should revert
+ ├── when the workflowID is already in used by another workflow
+ │ └── it should revert
├── when the workflow name is already used by the owner
│ └── it should revert
└── when the workflow inputs are all valid
diff --git a/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.updateWorkflow.t.sol b/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.updateWorkflow.t.sol
index 5058512ba7b..4082874a91e 100644
--- a/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.updateWorkflow.t.sol
+++ b/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.updateWorkflow.t.sol
@@ -158,6 +158,32 @@ contract WorkflowRegistry_updateWorkflow is WorkflowRegistrySetup {
s_registry.updateWorkflow(s_validWorkflowKey, bytes32(0), s_validBinaryURL, s_validConfigURL, s_newValidSecretsURL);
}
+ // whenTheCallerIsAnAuthorizedAddress whenTheRegistryIsNotLocked whenTheDonIDIsAllowed whenTheCallerIsTheWorkflowOwner
+ function test_RevertWhen_TheWorkflowIDIsAlreadyInUsedByAnotherWorkflow() external {
+ // Register a workflow first
+ _registerValidWorkflow();
+
+ // Register another workflow with another workflow ID
+ vm.startPrank(s_authorizedAddress);
+ s_registry.registerWorkflow(
+ "ValidWorkflow2",
+ s_newValidWorkflowID,
+ s_allowedDonID,
+ WorkflowRegistry.WorkflowStatus.ACTIVE,
+ s_validBinaryURL,
+ s_validConfigURL,
+ s_validSecretsURL
+ );
+
+ // Update the workflow with a workflow ID that is already in use by another workflow.
+ vm.expectRevert(WorkflowRegistry.WorkflowIDAlreadyExists.selector);
+ s_registry.updateWorkflow(
+ s_validWorkflowKey, s_newValidWorkflowID, s_validBinaryURL, s_validConfigURL, s_newValidSecretsURL
+ );
+
+ vm.stopPrank();
+ }
+
// whenTheCallerIsAnAuthorizedAddress whenTheRegistryIsNotLocked whenTheDonIDIsAllowed whenTheCallerIsTheWorkflowOwner
function test_WhenTheWorkflowInputsAreAllValid() external {
// Register a workflow first.
diff --git a/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.updateWorkflow.tree b/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.updateWorkflow.tree
index 0d4da7cb32e..9b8243a8672 100644
--- a/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.updateWorkflow.tree
+++ b/contracts/src/v0.8/workflow/test/WorkflowRegistry/WorkflowRegistry.updateWorkflow.tree
@@ -25,6 +25,8 @@ WorkflowRegistry.updateWorkflow
│ └── it should revert
├── when the workflowID is invalid
│ └── it should revert
+ ├── when the workflowID is already in used by another workflow
+ │ └── it should revert
└── when the workflow inputs are all valid
├── it should update the existing workflow in s_workflows with the new values
├── it should emit {WorkflowUpdatedV1}
diff --git a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go
index ea52438edad..4d636af7406 100644
--- a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go
+++ b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go
@@ -33,7 +33,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_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"
diff --git a/core/capabilities/ccip/common/common_test.go b/core/capabilities/ccip/common/common_test.go
index a7484a83ad9..156499021fa 100644
--- a/core/capabilities/ccip/common/common_test.go
+++ b/core/capabilities/ccip/common/common_test.go
@@ -11,7 +11,7 @@ import (
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
)
diff --git a/core/capabilities/ccip/configs/evm/contract_reader.go b/core/capabilities/ccip/configs/evm/contract_reader.go
index dca590094f8..857235661a6 100644
--- a/core/capabilities/ccip/configs/evm/contract_reader.go
+++ b/core/capabilities/ccip/configs/evm/contract_reader.go
@@ -20,8 +20,8 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface"
evmrelaytypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
)
@@ -33,7 +33,7 @@ var (
nonceManagerABI = evmtypes.MustGetABI(nonce_manager.NonceManagerABI)
priceFeedABI = evmtypes.MustGetABI(aggregator_v3_interface.AggregatorV3InterfaceABI)
rmnRemoteABI = evmtypes.MustGetABI(rmn_remote.RMNRemoteABI)
- rmnProxyABI = evmtypes.MustGetABI(rmn_proxy_contract.RMNProxyContractABI)
+ rmnProxyABI = evmtypes.MustGetABI(rmn_proxy_contract.RMNProxyABI)
rmnHomeABI = evmtypes.MustGetABI(rmn_home.RMNHomeABI)
routerABI = evmtypes.MustGetABI(router.RouterABI)
)
@@ -190,7 +190,7 @@ var DestReaderConfig = evmrelaytypes.ChainReaderConfig{
},
},
consts.ContractNameRMNProxy: {
- ContractABI: rmn_proxy_contract.RMNProxyContractABI,
+ ContractABI: rmn_proxy_contract.RMNProxyABI,
Configs: map[string]*evmrelaytypes.ChainReaderDefinition{
consts.MethodNameGetARM: {
ChainSpecificName: mustGetMethodName("getARM", rmnProxyABI),
diff --git a/core/capabilities/ccip/delegate.go b/core/capabilities/ccip/delegate.go
index 1af4f44cd4a..536622978f6 100644
--- a/core/capabilities/ccip/delegate.go
+++ b/core/capabilities/ccip/delegate.go
@@ -35,7 +35,7 @@ import (
cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
"github.com/smartcontractkit/chainlink/v2/core/config"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore"
diff --git a/core/capabilities/ccip/launcher/deployment.go b/core/capabilities/ccip/launcher/deployment.go
index 870c0409494..c2d59a19cf2 100644
--- a/core/capabilities/ccip/launcher/deployment.go
+++ b/core/capabilities/ccip/launcher/deployment.go
@@ -2,6 +2,7 @@ package launcher
import (
"fmt"
+
mapset "github.com/deckarep/golang-set/v2"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
"golang.org/x/exp/maps"
diff --git a/core/capabilities/ccip/launcher/diff_test.go b/core/capabilities/ccip/launcher/diff_test.go
index a098bf816ab..1c049a0e3d1 100644
--- a/core/capabilities/ccip/launcher/diff_test.go
+++ b/core/capabilities/ccip/launcher/diff_test.go
@@ -9,7 +9,7 @@ import (
"github.com/stretchr/testify/require"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"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/capabilities/ccip/launcher/launcher.go b/core/capabilities/ccip/launcher/launcher.go
index 76a6c204058..5e4aef934a0 100644
--- a/core/capabilities/ccip/launcher/launcher.go
+++ b/core/capabilities/ccip/launcher/launcher.go
@@ -23,7 +23,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/services"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
var (
@@ -294,7 +294,6 @@ func (l *launcher) processRemoved(removed map[registrysyncer.DonID]registrysynce
if err := p.CloseAll(); err != nil {
return fmt.Errorf("failed to shutdown oracles for CCIP DON %d: %w", id, err)
-
}
// after a successful shutdown we can safely remove the DON deployment from the map.
diff --git a/core/capabilities/ccip/ocrimpls/contract_transmitter.go b/core/capabilities/ccip/ocrimpls/contract_transmitter.go
index e89acac7baa..478bdaed3ad 100644
--- a/core/capabilities/ccip/ocrimpls/contract_transmitter.go
+++ b/core/capabilities/ccip/ocrimpls/contract_transmitter.go
@@ -7,18 +7,30 @@ import (
"math/big"
"github.com/google/uuid"
+
"github.com/smartcontractkit/libocr/offchainreporting2/chains/evmutil"
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
"github.com/smartcontractkit/chainlink-ccip/pkg/consts"
+ "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
)
-type ToCalldataFunc func(rawReportCtx [2][32]byte, report []byte, rs, ss [][32]byte, vs [32]byte) any
-
-func ToCommitCalldata(rawReportCtx [2][32]byte, report []byte, rs, ss [][32]byte, vs [32]byte) any {
+type ToCalldataFunc func(
+ rawReportCtx [2][32]byte,
+ report ocr3types.ReportWithInfo[[]byte],
+ rs, ss [][32]byte,
+ vs [32]byte,
+) (any, error)
+
+func ToCommitCalldata(
+ rawReportCtx [2][32]byte,
+ report ocr3types.ReportWithInfo[[]byte],
+ rs, ss [][32]byte,
+ vs [32]byte,
+) (any, error) {
// Note that the name of the struct field is very important, since the encoder used
// by the chainwriter uses mapstructure, which will use the struct field name to map
// to the argument name in the function call.
@@ -36,14 +48,19 @@ func ToCommitCalldata(rawReportCtx [2][32]byte, report []byte, rs, ss [][32]byte
RawVs [32]byte
}{
ReportContext: rawReportCtx,
- Report: report,
+ Report: report.Report,
Rs: rs,
Ss: ss,
RawVs: vs,
- }
+ }, nil
}
-func ToExecCalldata(rawReportCtx [2][32]byte, report []byte, _, _ [][32]byte, _ [32]byte) any {
+func ToExecCalldata(
+ rawReportCtx [2][32]byte,
+ report ocr3types.ReportWithInfo[[]byte],
+ _, _ [][32]byte,
+ _ [32]byte,
+) (any, error) {
// Note that the name of the struct field is very important, since the encoder used
// by the chainwriter uses mapstructure, which will use the struct field name to map
// to the argument name in the function call.
@@ -53,18 +70,29 @@ func ToExecCalldata(rawReportCtx [2][32]byte, report []byte, _, _ [][32]byte, _
// WARNING: Be careful if you change the data types.
// Using a different type e.g. `type Foo [32]byte` instead of `[32]byte`
// will trigger undefined chainWriter behavior, e.g. transactions submitted with wrong arguments.
+ var info ccipocr3.ExecuteReportInfo
+ if len(report.Info) != 0 {
+ var err error
+ info, err = ccipocr3.DecodeExecuteReportInfo(report.Info)
+ if err != nil {
+ return nil, err
+ }
+ }
+
return struct {
ReportContext [2][32]byte
Report []byte
+ Info ccipocr3.ExecuteReportInfo
}{
ReportContext: rawReportCtx,
- Report: report,
- }
+ Report: report.Report,
+ Info: info,
+ }, nil
}
-var _ ocr3types.ContractTransmitter[[]byte] = &commitTransmitter[[]byte]{}
+var _ ocr3types.ContractTransmitter[[]byte] = &commitTransmitter{}
-type commitTransmitter[RI any] struct {
+type commitTransmitter struct {
cw commontypes.ContractWriter
fromAccount ocrtypes.Account
contractName string
@@ -73,15 +101,15 @@ type commitTransmitter[RI any] struct {
toCalldataFn ToCalldataFunc
}
-func XXXNewContractTransmitterTestsOnly[RI any](
+func XXXNewContractTransmitterTestsOnly(
cw commontypes.ContractWriter,
fromAccount ocrtypes.Account,
contractName string,
method string,
offrampAddress string,
toCalldataFn ToCalldataFunc,
-) ocr3types.ContractTransmitter[RI] {
- return &commitTransmitter[RI]{
+) ocr3types.ContractTransmitter[[]byte] {
+ return &commitTransmitter{
cw: cw,
fromAccount: fromAccount,
contractName: contractName,
@@ -91,12 +119,12 @@ func XXXNewContractTransmitterTestsOnly[RI any](
}
}
-func NewCommitContractTransmitter[RI any](
+func NewCommitContractTransmitter(
cw commontypes.ContractWriter,
fromAccount ocrtypes.Account,
offrampAddress string,
-) ocr3types.ContractTransmitter[RI] {
- return &commitTransmitter[RI]{
+) ocr3types.ContractTransmitter[[]byte] {
+ return &commitTransmitter{
cw: cw,
fromAccount: fromAccount,
contractName: consts.ContractNameOffRamp,
@@ -106,12 +134,12 @@ func NewCommitContractTransmitter[RI any](
}
}
-func NewExecContractTransmitter[RI any](
+func NewExecContractTransmitter(
cw commontypes.ContractWriter,
fromAccount ocrtypes.Account,
offrampAddress string,
-) ocr3types.ContractTransmitter[RI] {
- return &commitTransmitter[RI]{
+) ocr3types.ContractTransmitter[[]byte] {
+ return &commitTransmitter{
cw: cw,
fromAccount: fromAccount,
contractName: consts.ContractNameOffRamp,
@@ -122,16 +150,16 @@ func NewExecContractTransmitter[RI any](
}
// FromAccount implements ocr3types.ContractTransmitter.
-func (c *commitTransmitter[RI]) FromAccount(context.Context) (ocrtypes.Account, error) {
+func (c *commitTransmitter) FromAccount(context.Context) (ocrtypes.Account, error) {
return c.fromAccount, nil
}
// Transmit implements ocr3types.ContractTransmitter.
-func (c *commitTransmitter[RI]) Transmit(
+func (c *commitTransmitter) Transmit(
ctx context.Context,
configDigest ocrtypes.ConfigDigest,
seqNr uint64,
- reportWithInfo ocr3types.ReportWithInfo[RI],
+ reportWithInfo ocr3types.ReportWithInfo[[]byte],
sigs []ocrtypes.AttributedOnchainSignature,
) error {
var rs [][32]byte
@@ -160,7 +188,10 @@ func (c *commitTransmitter[RI]) Transmit(
}
// chain writer takes in the raw calldata and packs it on its own.
- args := c.toCalldataFn(rawReportCtx, reportWithInfo.Report, rs, ss, vs)
+ args, err := c.toCalldataFn(rawReportCtx, reportWithInfo, rs, ss, vs)
+ if err != nil {
+ return fmt.Errorf("failed to generate call data: %w", err)
+ }
// TODO: no meta fields yet, what should we add?
// probably whats in the info part of the report?
diff --git a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go
index 16546b26999..5e237ccbee0 100644
--- a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go
+++ b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go
@@ -103,7 +103,7 @@ func testTransmitter(
report []byte,
) {
ctx := tests.Context(t)
- uni := newTestUniverse[[]byte](t, nil)
+ uni := newTestUniverse(t, nil)
c, err := uni.wrapper.LatestConfigDetails(nil, pluginType)
require.NoError(t, err, "failed to get latest config details")
@@ -199,7 +199,7 @@ type keyringsAndSigners[RI any] struct {
signers []common.Address
}
-func newTestUniverse[RI any](t *testing.T, ks *keyringsAndSigners[RI]) *testUniverse[RI] {
+func newTestUniverse(t *testing.T, ks *keyringsAndSigners[[]byte]) *testUniverse[[]byte] {
t.Helper()
db := pgtest.NewSqlxDB(t)
@@ -233,7 +233,7 @@ func newTestUniverse[RI any](t *testing.T, ks *keyringsAndSigners[RI]) *testUniv
// create the oracle identities for setConfig
// need to create at least 4 identities otherwise setConfig will fail
var (
- keyrings []ocr3types.OnchainKeyring[RI]
+ keyrings []ocr3types.OnchainKeyring[[]byte]
signers []common.Address
)
if ks != nil {
@@ -243,7 +243,7 @@ func newTestUniverse[RI any](t *testing.T, ks *keyringsAndSigners[RI]) *testUniv
for i := 0; i < 4; i++ {
kb, err2 := ocr2key.New(kschaintype.EVM)
require.NoError(t, err2, "failed to create key")
- kr := ocrimpls.NewOnchainKeyring[RI](kb, logger.TestLogger(t))
+ kr := ocrimpls.NewOnchainKeyring[[]byte](kb, logger.TestLogger(t))
signers = append(signers, common.BytesToAddress(kr.PublicKey()))
keyrings = append(keyrings, kr)
}
@@ -309,7 +309,7 @@ func newTestUniverse[RI any](t *testing.T, ks *keyringsAndSigners[RI]) *testUniv
require.NoError(t, chainWriter.Start(testutils.Context(t)), "failed to start chain writer")
t.Cleanup(func() { require.NoError(t, chainWriter.Close()) })
- transmitterWithSigs := ocrimpls.XXXNewContractTransmitterTestsOnly[RI](
+ transmitterWithSigs := ocrimpls.XXXNewContractTransmitterTestsOnly(
chainWriter,
ocrtypes.Account(transmitters[0].Hex()),
contractName,
@@ -317,7 +317,7 @@ func newTestUniverse[RI any](t *testing.T, ks *keyringsAndSigners[RI]) *testUniv
ocr3HelperAddr.Hex(),
ocrimpls.ToCommitCalldata,
)
- transmitterWithoutSigs := ocrimpls.XXXNewContractTransmitterTestsOnly[RI](
+ transmitterWithoutSigs := ocrimpls.XXXNewContractTransmitterTestsOnly(
chainWriter,
ocrtypes.Account(transmitters[0].Hex()),
contractName,
@@ -326,7 +326,7 @@ func newTestUniverse[RI any](t *testing.T, ks *keyringsAndSigners[RI]) *testUniv
ocrimpls.ToExecCalldata,
)
- return &testUniverse[RI]{
+ return &testUniverse[[]byte]{
simClient: simClient,
backend: backend,
deployer: owner,
diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go
index a716d96418a..d4c5596aeaf 100644
--- a/core/capabilities/ccip/oraclecreator/plugin.go
+++ b/core/capabilities/ccip/oraclecreator/plugin.go
@@ -271,7 +271,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter(
rmnCrypto,
)
factory = promwrapper.NewReportingPluginFactory[[]byte](factory, i.lggr, chainID, "CCIPCommit")
- transmitter = ocrimpls.NewCommitContractTransmitter[[]byte](destChainWriter,
+ transmitter = ocrimpls.NewCommitContractTransmitter(destChainWriter,
ocrtypes.Account(destFromAccounts[0]),
hexutil.Encode(config.Config.OfframpAddress), // TODO: this works for evm only, how about non-evm?
)
@@ -292,7 +292,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter(
chainWriters,
)
factory = promwrapper.NewReportingPluginFactory[[]byte](factory, i.lggr, chainID, "CCIPExec")
- transmitter = ocrimpls.NewExecContractTransmitter[[]byte](destChainWriter,
+ transmitter = ocrimpls.NewExecContractTransmitter(destChainWriter,
ocrtypes.Account(destFromAccounts[0]),
hexutil.Encode(config.Config.OfframpAddress), // TODO: this works for evm only, how about non-evm?
)
diff --git a/core/capabilities/compute/compute.go b/core/capabilities/compute/compute.go
index 316e4f00eea..2ba5daefaa6 100644
--- a/core/capabilities/compute/compute.go
+++ b/core/capabilities/compute/compute.go
@@ -318,18 +318,13 @@ func (c *Compute) createFetcher() func(ctx context.Context, req *wasmpb.FetchReq
headersReq[k] = v.String()
}
- payloadBytes, err := json.Marshal(ghcapabilities.Request{
+ resp, err := c.outgoingConnectorHandler.HandleSingleNodeRequest(ctx, messageID, ghcapabilities.Request{
URL: req.Url,
Method: req.Method,
Headers: headersReq,
Body: req.Body,
TimeoutMs: req.TimeoutMs,
})
- if err != nil {
- return nil, fmt.Errorf("failed to marshal fetch request: %w", err)
- }
-
- resp, err := c.outgoingConnectorHandler.HandleSingleNodeRequest(ctx, messageID, payloadBytes)
if err != nil {
return nil, err
}
diff --git a/core/capabilities/compute/compute_test.go b/core/capabilities/compute/compute_test.go
index c4146b7408e..3e5f501fa61 100644
--- a/core/capabilities/compute/compute_test.go
+++ b/core/capabilities/compute/compute_test.go
@@ -14,6 +14,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/capabilities"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/wasmtest"
"github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/utils/matches"
cappkg "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
@@ -188,6 +189,7 @@ func TestComputeFetch(t *testing.T) {
th := setup(t, defaultConfig)
th.connector.EXPECT().DonID().Return("don-id")
+ th.connector.EXPECT().AwaitConnection(matches.AnyContext, "gateway1").Return(nil)
th.connector.EXPECT().GatewayIDs().Return([]string{"gateway1", "gateway2"})
msgID := strings.Join([]string{
diff --git a/core/capabilities/integration_tests/framework/capabilities_registry.go b/core/capabilities/integration_tests/framework/capabilities_registry.go
index 5c23d2ebc1a..3ebbb5081d3 100644
--- a/core/capabilities/integration_tests/framework/capabilities_registry.go
+++ b/core/capabilities/integration_tests/framework/capabilities_registry.go
@@ -11,7 +11,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink-common/pkg/values"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/stretchr/testify/require"
)
diff --git a/core/capabilities/integration_tests/framework/don.go b/core/capabilities/integration_tests/framework/don.go
index 999966bdc1d..c9b78a0db96 100644
--- a/core/capabilities/integration_tests/framework/don.go
+++ b/core/capabilities/integration_tests/framework/don.go
@@ -28,7 +28,7 @@ import (
remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/logger"
diff --git a/core/capabilities/integration_tests/framework/peer.go b/core/capabilities/integration_tests/framework/peer.go
index d97abadf646..c4f73629450 100644
--- a/core/capabilities/integration_tests/framework/peer.go
+++ b/core/capabilities/integration_tests/framework/peer.go
@@ -11,7 +11,7 @@ import (
ragetypes "github.com/smartcontractkit/libocr/ragep2p/types"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
diff --git a/core/capabilities/integration_tests/keystone/contracts_setup.go b/core/capabilities/integration_tests/keystone/contracts_setup.go
index d7b98327889..ad87850bf5f 100644
--- a/core/capabilities/integration_tests/keystone/contracts_setup.go
+++ b/core/capabilities/integration_tests/keystone/contracts_setup.go
@@ -7,8 +7,8 @@ import (
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/integration_tests/framework"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
+ feeds_consumer "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer_1_0_0"
+ forwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0"
)
func SetupForwarderContract(t *testing.T, reportCreator *framework.DON,
diff --git a/core/capabilities/integration_tests/keystone/keystone_test.go b/core/capabilities/integration_tests/keystone/keystone_test.go
index 17bfde7cda9..6cfa8c9f0df 100644
--- a/core/capabilities/integration_tests/keystone/keystone_test.go
+++ b/core/capabilities/integration_tests/keystone/keystone_test.go
@@ -16,7 +16,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/datastreams"
"github.com/smartcontractkit/chainlink-common/pkg/values"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/integration_tests/framework"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer"
+ feeds_consumer "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer_1_0_0"
"github.com/smartcontractkit/chainlink/v2/core/logger"
reporttypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/v3/types"
)
diff --git a/core/capabilities/integration_tests/keystone/setup.go b/core/capabilities/integration_tests/keystone/setup.go
index f4b29323537..690e176e491 100644
--- a/core/capabilities/integration_tests/keystone/setup.go
+++ b/core/capabilities/integration_tests/keystone/setup.go
@@ -18,7 +18,7 @@ import (
v3 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v3"
"github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/integration_tests/framework"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer"
+ feeds_consumer "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer_1_0_0"
ocrTypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
diff --git a/core/capabilities/launcher.go b/core/capabilities/launcher.go
index 98318853e2a..51df7eeebfc 100644
--- a/core/capabilities/launcher.go
+++ b/core/capabilities/launcher.go
@@ -19,6 +19,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/services"
"github.com/smartcontractkit/chainlink-common/pkg/values"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/aggregation"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/executable"
remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/streams"
@@ -280,7 +281,7 @@ func (w *launcher) addRemoteCapabilities(ctx context.Context, myDON registrysync
w.lggr,
)
} else {
- aggregator = remote.NewDefaultModeAggregator(uint32(remoteDON.F) + 1)
+ aggregator = aggregation.NewDefaultModeAggregator(uint32(remoteDON.F) + 1)
}
// TODO: We need to implement a custom, Mercury-specific
diff --git a/core/capabilities/launcher_test.go b/core/capabilities/launcher_test.go
index c130f9833d9..167a2fcbd1b 100644
--- a/core/capabilities/launcher_test.go
+++ b/core/capabilities/launcher_test.go
@@ -23,7 +23,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote"
remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
remoteMocks "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types/mocks"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
diff --git a/core/capabilities/remote/aggregation/default_mode.go b/core/capabilities/remote/aggregation/default_mode.go
new file mode 100644
index 00000000000..3d5e262920f
--- /dev/null
+++ b/core/capabilities/remote/aggregation/default_mode.go
@@ -0,0 +1,58 @@
+package aggregation
+
+import (
+ "crypto/sha256"
+ "encoding/hex"
+ "errors"
+ "fmt"
+
+ commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
+ remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
+)
+
+// Default MODE Aggregator needs a configurable number of identical responses for aggregation to succeed
+type defaultModeAggregator struct {
+ minIdenticalResponses uint32
+}
+
+var _ remotetypes.Aggregator = &defaultModeAggregator{}
+
+func NewDefaultModeAggregator(minIdenticalResponses uint32) *defaultModeAggregator {
+ return &defaultModeAggregator{
+ minIdenticalResponses: minIdenticalResponses,
+ }
+}
+
+func (a *defaultModeAggregator) Aggregate(_ string, responses [][]byte) (commoncap.TriggerResponse, error) {
+ found, err := AggregateModeRaw(responses, a.minIdenticalResponses)
+ if err != nil {
+ return commoncap.TriggerResponse{}, fmt.Errorf("failed to aggregate responses, err: %w", err)
+ }
+
+ unmarshaled, err := pb.UnmarshalTriggerResponse(found)
+ if err != nil {
+ return commoncap.TriggerResponse{}, fmt.Errorf("failed to unmarshal aggregated responses, err: %w", err)
+ }
+ return unmarshaled, nil
+}
+
+func AggregateModeRaw(elemList [][]byte, minIdenticalResponses uint32) ([]byte, error) {
+ hashToCount := make(map[string]uint32)
+ var found []byte
+ for _, elem := range elemList {
+ hasher := sha256.New()
+ hasher.Write(elem)
+ sha := hex.EncodeToString(hasher.Sum(nil))
+ hashToCount[sha]++
+ if hashToCount[sha] >= minIdenticalResponses {
+ found = elem
+ // update in case we find another elem with an even higher count
+ minIdenticalResponses = hashToCount[sha]
+ }
+ }
+ if found == nil {
+ return nil, errors.New("not enough identical responses found")
+ }
+ return found, nil
+}
diff --git a/core/capabilities/remote/aggregation/default_mode_test.go b/core/capabilities/remote/aggregation/default_mode_test.go
new file mode 100644
index 00000000000..7c7d615e17a
--- /dev/null
+++ b/core/capabilities/remote/aggregation/default_mode_test.go
@@ -0,0 +1,51 @@
+package aggregation
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
+ "github.com/smartcontractkit/chainlink-common/pkg/values"
+)
+
+var (
+ triggerEvent1 = map[string]any{"event": "triggerEvent1"}
+ triggerEvent2 = map[string]any{"event": "triggerEvent2"}
+)
+
+func TestDefaultModeAggregator_Aggregate(t *testing.T) {
+ val, err := values.NewMap(triggerEvent1)
+ require.NoError(t, err)
+ capResponse1 := commoncap.TriggerResponse{
+ Event: commoncap.TriggerEvent{
+ Outputs: val,
+ },
+ Err: nil,
+ }
+ marshaled1, err := pb.MarshalTriggerResponse(capResponse1)
+ require.NoError(t, err)
+
+ val2, err := values.NewMap(triggerEvent2)
+ require.NoError(t, err)
+ capResponse2 := commoncap.TriggerResponse{
+ Event: commoncap.TriggerEvent{
+ Outputs: val2,
+ },
+ Err: nil,
+ }
+ marshaled2, err := pb.MarshalTriggerResponse(capResponse2)
+ require.NoError(t, err)
+
+ agg := NewDefaultModeAggregator(2)
+ _, err = agg.Aggregate("", [][]byte{marshaled1})
+ require.Error(t, err)
+
+ _, err = agg.Aggregate("", [][]byte{marshaled1, marshaled2})
+ require.Error(t, err)
+
+ res, err := agg.Aggregate("", [][]byte{marshaled1, marshaled2, marshaled1})
+ require.NoError(t, err)
+ require.Equal(t, res, capResponse1)
+}
diff --git a/core/capabilities/remote/dispatcher.go b/core/capabilities/remote/dispatcher.go
index e3229d35c1e..905eda9d72d 100644
--- a/core/capabilities/remote/dispatcher.go
+++ b/core/capabilities/remote/dispatcher.go
@@ -3,6 +3,7 @@ package remote
import (
"context"
"fmt"
+ "strconv"
"sync"
"time"
@@ -42,8 +43,8 @@ type dispatcher struct {
}
type key struct {
- capId string
- donId uint32
+ capID string
+ donID uint32
}
var _ services.Service = &dispatcher{}
@@ -74,7 +75,7 @@ func (d *dispatcher) Start(ctx context.Context) error {
d.peer = d.peerWrapper.GetPeer()
d.peerID = d.peer.ID()
if d.peer == nil {
- return fmt.Errorf("peer is not initialized")
+ return errors.New("peer is not initialized")
}
d.wg.Add(1)
go func() {
@@ -103,13 +104,13 @@ type receiver struct {
ch chan *types.MessageBody
}
-func (d *dispatcher) SetReceiver(capabilityId string, donId uint32, rec types.Receiver) error {
+func (d *dispatcher) SetReceiver(capabilityID string, donID uint32, rec types.Receiver) error {
d.mu.Lock()
defer d.mu.Unlock()
- k := key{capabilityId, donId}
+ k := key{capabilityID, donID}
_, ok := d.receivers[k]
if ok {
- return fmt.Errorf("%w: receiver already exists for capability %s and don %d", ErrReceiverExists, capabilityId, donId)
+ return fmt.Errorf("%w: receiver already exists for capability %s and don %d", ErrReceiverExists, capabilityID, donID)
}
receiverCh := make(chan *types.MessageBody, d.cfg.ReceiverBufferSize())
@@ -134,23 +135,24 @@ func (d *dispatcher) SetReceiver(capabilityId string, donId uint32, rec types.Re
ch: receiverCh,
}
- d.lggr.Debugw("receiver set", "capabilityId", capabilityId, "donId", donId)
+ d.lggr.Debugw("receiver set", "capabilityId", capabilityID, "donId", donID)
return nil
}
-func (d *dispatcher) RemoveReceiver(capabilityId string, donId uint32) {
+func (d *dispatcher) RemoveReceiver(capabilityID string, donID uint32) {
d.mu.Lock()
defer d.mu.Unlock()
- receiverKey := key{capabilityId, donId}
+ receiverKey := key{capabilityID, donID}
if receiver, ok := d.receivers[receiverKey]; ok {
receiver.cancel()
delete(d.receivers, receiverKey)
- d.lggr.Debugw("receiver removed", "capabilityId", capabilityId, "donId", donId)
+ d.lggr.Debugw("receiver removed", "capabilityId", capabilityID, "donId", donID)
}
}
func (d *dispatcher) Send(peerID p2ptypes.PeerID, msgBody *types.MessageBody) error {
+ //nolint:gosec // disable G115
msgBody.Version = uint32(d.cfg.SupportedVersion())
msgBody.Sender = d.peerID[:]
msgBody.Receiver = peerID[:]
@@ -194,17 +196,17 @@ func (d *dispatcher) receive() {
receiver, ok := d.receivers[k]
d.mu.RUnlock()
if !ok {
- d.lggr.Debugw("received message for unregistered capability", "capabilityId", SanitizeLogString(k.capId), "donId", k.donId)
+ d.lggr.Debugw("received message for unregistered capability", "capabilityId", SanitizeLogString(k.capID), "donId", k.donID)
d.tryRespondWithError(msg.Sender, body, types.Error_CAPABILITY_NOT_FOUND)
continue
}
receiverQueueUsage := float64(len(receiver.ch)) / float64(d.cfg.ReceiverBufferSize())
- capReceiveChannelUsage.WithLabelValues(k.capId, fmt.Sprint(k.donId)).Set(receiverQueueUsage)
+ capReceiveChannelUsage.WithLabelValues(k.capID, strconv.FormatUint(uint64(k.donID), 10)).Set(receiverQueueUsage)
select {
case receiver.ch <- body:
default:
- d.lggr.Warnw("receiver channel full, dropping message", "capabilityId", k.capId, "donId", k.donId)
+ d.lggr.Warnw("receiver channel full, dropping message", "capabilityId", k.capID, "donId", k.donID)
}
}
}
diff --git a/core/capabilities/remote/dispatcher_test.go b/core/capabilities/remote/dispatcher_test.go
index 50edc5f3530..fbc9dbb4b49 100644
--- a/core/capabilities/remote/dispatcher_test.go
+++ b/core/capabilities/remote/dispatcher_test.go
@@ -104,13 +104,13 @@ func TestDispatcher_CleanStartClose(t *testing.T) {
func TestDispatcher_Receive(t *testing.T) {
lggr := logger.TestLogger(t)
ctx := testutils.Context(t)
- privKey1, peerId1 := newKeyPair(t)
- _, peerId2 := newKeyPair(t)
+ privKey1, peerID1 := newKeyPair(t)
+ _, peerID2 := newKeyPair(t)
peer := mocks.NewPeer(t)
recvCh := make(chan p2ptypes.Message)
peer.On("Receive", mock.Anything).Return((<-chan p2ptypes.Message)(recvCh))
- peer.On("ID", mock.Anything).Return(peerId2)
+ peer.On("ID", mock.Anything).Return(peerID2)
wrapper := mocks.NewPeerWrapper(t)
wrapper.On("GetPeer").Return(peer)
signer := mocks.NewSigner(t)
@@ -131,39 +131,39 @@ func TestDispatcher_Receive(t *testing.T) {
require.NoError(t, dispatcher.Start(ctx))
rcv := newReceiver()
- err = dispatcher.SetReceiver(capId1, donId1, rcv)
+ err = dispatcher.SetReceiver(capID1, donID1, rcv)
require.NoError(t, err)
// supported capability
- recvCh <- encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))
+ recvCh <- encodeAndSign(t, privKey1, peerID1, peerID2, capID1, donID1, []byte(payload1))
// unknown capability
- recvCh <- encodeAndSign(t, privKey1, peerId1, peerId2, capId2, donId1, []byte(payload1))
+ recvCh <- encodeAndSign(t, privKey1, peerID1, peerID2, capID2, donID1, []byte(payload1))
// sender doesn't match
- invalid := encodeAndSign(t, privKey1, peerId1, peerId2, capId2, donId1, []byte(payload1))
- invalid.Sender = peerId2
+ invalid := encodeAndSign(t, privKey1, peerID1, peerID2, capID2, donID1, []byte(payload1))
+ invalid.Sender = peerID2
recvCh <- invalid
// supported capability again
- recvCh <- encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload2))
+ recvCh <- encodeAndSign(t, privKey1, peerID1, peerID2, capID1, donID1, []byte(payload2))
m := <-rcv.ch
require.Equal(t, payload1, string(m.Payload))
m = <-rcv.ch
require.Equal(t, payload2, string(m.Payload))
- dispatcher.RemoveReceiver(capId1, donId1)
+ dispatcher.RemoveReceiver(capID1, donID1)
require.NoError(t, dispatcher.Close())
}
func TestDispatcher_RespondWithError(t *testing.T) {
lggr := logger.TestLogger(t)
ctx := testutils.Context(t)
- privKey1, peerId1 := newKeyPair(t)
- _, peerId2 := newKeyPair(t)
+ privKey1, peerID1 := newKeyPair(t)
+ _, peerID2 := newKeyPair(t)
peer := mocks.NewPeer(t)
recvCh := make(chan p2ptypes.Message)
peer.On("Receive", mock.Anything).Return((<-chan p2ptypes.Message)(recvCh))
- peer.On("ID", mock.Anything).Return(peerId2)
+ peer.On("ID", mock.Anything).Return(peerID2)
sendCh := make(chan p2ptypes.PeerID)
peer.On("Send", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
peerID := args.Get(0).(p2ptypes.PeerID)
@@ -189,9 +189,9 @@ func TestDispatcher_RespondWithError(t *testing.T) {
require.NoError(t, dispatcher.Start(ctx))
// unknown capability
- recvCh <- encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))
+ recvCh <- encodeAndSign(t, privKey1, peerID1, peerID2, capID1, donID1, []byte(payload1))
responseDestPeerID := <-sendCh
- require.Equal(t, peerId1, responseDestPeerID)
+ require.Equal(t, peerID1, responseDestPeerID)
require.NoError(t, dispatcher.Close())
}
diff --git a/core/capabilities/remote/executable/client.go b/core/capabilities/remote/executable/client.go
index 776ddb692ad..9f23ff4ce4a 100644
--- a/core/capabilities/remote/executable/client.go
+++ b/core/capabilities/remote/executable/client.go
@@ -43,6 +43,11 @@ var _ services.Service = &client{}
const expiryCheckInterval = 30 * time.Second
+var (
+ ErrRequestExpired = errors.New("request expired by executable client")
+ ErrContextDoneBeforeResponseQuorum = errors.New("context done before remote client received a quorum of responses")
+)
+
func NewClient(remoteCapabilityInfo commoncap.CapabilityInfo, localDonInfo commoncap.DON, dispatcher types.Dispatcher,
requestTimeout time.Duration, lggr logger.Logger) *client {
return &client{
@@ -122,7 +127,7 @@ func (c *client) expireRequests() {
for messageID, req := range c.requestIDToCallerRequest {
if req.Expired() {
- req.Cancel(errors.New("request expired by executable client"))
+ req.Cancel(ErrRequestExpired)
delete(c.requestIDToCallerRequest, messageID)
}
@@ -164,12 +169,22 @@ func (c *client) Execute(ctx context.Context, capReq commoncap.CapabilityRequest
return commoncap.CapabilityResponse{}, fmt.Errorf("failed to send request: %w", err)
}
- resp := <-req.ResponseChan()
- if resp.Err != nil {
- return commoncap.CapabilityResponse{}, fmt.Errorf("error executing request: %w", resp.Err)
+ var respResult []byte
+ var respErr error
+ select {
+ case resp := <-req.ResponseChan():
+ respResult = resp.Result
+ respErr = resp.Err
+ case <-ctx.Done():
+ // NOTE: ClientRequest will not block on sending to ResponseChan() because that channel is buffered (with size 1)
+ return commoncap.CapabilityResponse{}, errors.Join(ErrContextDoneBeforeResponseQuorum, ctx.Err())
+ }
+
+ if respErr != nil {
+ return commoncap.CapabilityResponse{}, fmt.Errorf("error executing request: %w", respErr)
}
- capabilityResponse, err := pb.UnmarshalCapabilityResponse(resp.Result)
+ capabilityResponse, err := pb.UnmarshalCapabilityResponse(respResult)
if err != nil {
return commoncap.CapabilityResponse{}, fmt.Errorf("failed to unmarshal capability response: %w", err)
}
diff --git a/core/capabilities/remote/executable/client_test.go b/core/capabilities/remote/executable/client_test.go
index 5c4da350b9e..4e7d940a3b9 100644
--- a/core/capabilities/remote/executable/client_test.go
+++ b/core/capabilities/remote/executable/client_test.go
@@ -13,6 +13,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
"github.com/smartcontractkit/chainlink-common/pkg/values"
+
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/executable"
remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/transmission"
@@ -56,18 +57,6 @@ func Test_Client_DonTopologies(t *testing.T) {
executeMethod(ctx, caller, transmissionSchedule, executeInputs, responseTest, t)
})
- methods = append(methods, func(caller commoncap.ExecutableCapability) {
- registerToWorkflowMethod(ctx, caller, transmissionSchedule, func(t *testing.T, responseError error) {
- require.NoError(t, responseError)
- }, t)
- })
-
- methods = append(methods, func(caller commoncap.ExecutableCapability) {
- unregisterFromWorkflowMethod(ctx, caller, transmissionSchedule, func(t *testing.T, responseError error) {
- require.NoError(t, responseError)
- }, t)
- })
-
for _, method := range methods {
testClient(t, 1, responseTimeOut, 1, 0,
capability, method)
@@ -143,7 +132,8 @@ func Test_Client_TimesOutIfInsufficientCapabilityPeerResponses(t *testing.T) {
ctx := testutils.Context(t)
responseTest := func(t *testing.T, response commoncap.CapabilityResponse, responseError error) {
- assert.Error(t, responseError)
+ require.Error(t, responseError)
+ require.ErrorIs(t, responseError, executable.ErrRequestExpired)
}
capability := &TestCapability{}
@@ -165,6 +155,31 @@ func Test_Client_TimesOutIfInsufficientCapabilityPeerResponses(t *testing.T) {
})
}
+func Test_Client_ContextCanceledBeforeQuorumReached(t *testing.T) {
+ ctx, cancel := context.WithCancel(testutils.Context(t))
+
+ responseTest := func(t *testing.T, response commoncap.CapabilityResponse, responseError error) {
+ require.Error(t, responseError)
+ require.ErrorIs(t, responseError, executable.ErrContextDoneBeforeResponseQuorum)
+ }
+
+ capability := &TestCapability{}
+ transmissionSchedule, err := values.NewMap(map[string]any{
+ "schedule": transmission.Schedule_AllAtOnce,
+ "deltaStage": "20s",
+ })
+ require.NoError(t, err)
+
+ cancel()
+ testClient(t, 2, 20*time.Second, 2, 2,
+ capability,
+ func(caller commoncap.ExecutableCapability) {
+ executeInputs, err := values.NewMap(map[string]any{"executeValue1": "aValue1"})
+ require.NoError(t, err)
+ executeMethod(ctx, caller, transmissionSchedule, executeInputs, responseTest, t)
+ })
+}
+
func testClient(t *testing.T, numWorkflowPeers int, workflowNodeResponseTimeout time.Duration,
numCapabilityPeers int, capabilityDonF uint8, underlying commoncap.ExecutableCapability,
method func(caller commoncap.ExecutableCapability)) {
@@ -234,34 +249,6 @@ func testClient(t *testing.T, numWorkflowPeers int, workflowNodeResponseTimeout
wg.Wait()
}
-func registerToWorkflowMethod(ctx context.Context, caller commoncap.ExecutableCapability, transmissionSchedule *values.Map,
- responseTest func(t *testing.T, responseError error), t *testing.T) {
- err := caller.RegisterToWorkflow(ctx, commoncap.RegisterToWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- ReferenceID: stepReferenceID1,
- WorkflowOwner: workflowOwnerID,
- },
- Config: transmissionSchedule,
- })
-
- responseTest(t, err)
-}
-
-func unregisterFromWorkflowMethod(ctx context.Context, caller commoncap.ExecutableCapability, transmissionSchedule *values.Map,
- responseTest func(t *testing.T, responseError error), t *testing.T) {
- err := caller.UnregisterFromWorkflow(ctx, commoncap.UnregisterFromWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- ReferenceID: stepReferenceID1,
- WorkflowOwner: workflowOwnerID,
- },
- Config: transmissionSchedule,
- })
-
- responseTest(t, err)
-}
-
func executeMethod(ctx context.Context, caller commoncap.ExecutableCapability, transmissionSchedule *values.Map,
executeInputs *values.Map, responseTest func(t *testing.T, responseCh commoncap.CapabilityResponse, responseError error), t *testing.T) {
responseCh, err := caller.Execute(ctx,
@@ -332,21 +319,6 @@ func (t *clientTestServer) Receive(_ context.Context, msg *remotetypes.MessageBo
resp, responseErr := t.executableCapability.Execute(context.Background(), capabilityRequest)
payload, marshalErr := pb.MarshalCapabilityResponse(resp)
t.sendResponse(messageID, responseErr, payload, marshalErr)
-
- case remotetypes.MethodRegisterToWorkflow:
- registerRequest, err := pb.UnmarshalRegisterToWorkflowRequest(msg.Payload)
- if err != nil {
- panic(err)
- }
- responseErr := t.executableCapability.RegisterToWorkflow(context.Background(), registerRequest)
- t.sendResponse(messageID, responseErr, nil, nil)
- case remotetypes.MethodUnregisterFromWorkflow:
- unregisterRequest, err := pb.UnmarshalUnregisterFromWorkflowRequest(msg.Payload)
- if err != nil {
- panic(err)
- }
- responseErr := t.executableCapability.UnregisterFromWorkflow(context.Background(), unregisterRequest)
- t.sendResponse(messageID, responseErr, nil, nil)
default:
panic("unknown method")
}
diff --git a/core/capabilities/remote/executable/endtoend_test.go b/core/capabilities/remote/executable/endtoend_test.go
index 5f445db4235..886bde9d33d 100644
--- a/core/capabilities/remote/executable/endtoend_test.go
+++ b/core/capabilities/remote/executable/endtoend_test.go
@@ -224,9 +224,9 @@ func (a *testAsyncMessageBroker) start(ctx context.Context) error {
case <-ctx.Done():
return
case msg := <-a.sendCh:
- receiverId := toPeerID(msg.Receiver)
+ receiverID := toPeerID(msg.Receiver)
- receiver, ok := a.nodes[receiverId]
+ receiver, ok := a.nodes[receiverID]
if !ok {
panic("server not found for peer id")
}
@@ -299,10 +299,10 @@ func (t *nodeDispatcher) Send(peerID p2ptypes.PeerID, msgBody *remotetypes.Messa
return nil
}
-func (t *nodeDispatcher) SetReceiver(capabilityId string, donId uint32, receiver remotetypes.Receiver) error {
+func (t *nodeDispatcher) SetReceiver(capabilityID string, donID uint32, receiver remotetypes.Receiver) error {
return nil
}
-func (t *nodeDispatcher) RemoveReceiver(capabilityId string, donId uint32) {}
+func (t *nodeDispatcher) RemoveReceiver(capabilityID string, donID uint32) {}
type abstractTestCapability struct {
}
@@ -407,29 +407,3 @@ func executeCapability(ctx context.Context, t *testing.T, caller commoncap.Execu
responseTest(t, response, err)
}
-
-func registerWorkflow(ctx context.Context, t *testing.T, caller commoncap.ExecutableCapability, transmissionSchedule *values.Map, responseTest func(t *testing.T, responseError error)) {
- err := caller.RegisterToWorkflow(ctx, commoncap.RegisterToWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- ReferenceID: stepReferenceID1,
- WorkflowOwner: workflowOwnerID,
- },
- Config: transmissionSchedule,
- })
-
- responseTest(t, err)
-}
-
-func unregisterWorkflow(ctx context.Context, t *testing.T, caller commoncap.ExecutableCapability, transmissionSchedule *values.Map, responseTest func(t *testing.T, responseError error)) {
- err := caller.UnregisterFromWorkflow(ctx, commoncap.UnregisterFromWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- ReferenceID: stepReferenceID1,
- WorkflowOwner: workflowOwnerID,
- },
- Config: transmissionSchedule,
- })
-
- responseTest(t, err)
-}
diff --git a/core/capabilities/remote/executable/request/client_request.go b/core/capabilities/remote/executable/request/client_request.go
index 6b4b9e3a0cd..1d98e3366f1 100644
--- a/core/capabilities/remote/executable/request/client_request.go
+++ b/core/capabilities/remote/executable/request/client_request.go
@@ -48,54 +48,6 @@ type ClientRequest struct {
wg *sync.WaitGroup
}
-func NewClientRegisterToWorkflowRequest(ctx context.Context, lggr logger.Logger, req commoncap.RegisterToWorkflowRequest,
- remoteCapabilityInfo commoncap.CapabilityInfo, localDonInfo capabilities.DON, dispatcher types.Dispatcher,
- requestTimeout time.Duration) (*ClientRequest, error) {
- rawRequest, err := proto.MarshalOptions{Deterministic: true}.Marshal(pb.RegisterToWorkflowRequestToProto(req))
- if err != nil {
- return nil, fmt.Errorf("failed to marshal register to workflow request: %w", err)
- }
-
- workflowID := req.Metadata.WorkflowID
- if err := validation.ValidateWorkflowOrExecutionID(workflowID); err != nil {
- return nil, fmt.Errorf("workflow ID is invalid: %w", err)
- }
-
- requestID := types.MethodRegisterToWorkflow + ":" + workflowID
-
- tc := transmission.TransmissionConfig{
- Schedule: transmission.Schedule_AllAtOnce,
- DeltaStage: 0,
- }
-
- return newClientRequest(ctx, lggr, requestID, remoteCapabilityInfo, localDonInfo, dispatcher, requestTimeout,
- tc, types.MethodRegisterToWorkflow, rawRequest)
-}
-
-func NewClientUnregisterFromWorkflowRequest(ctx context.Context, lggr logger.Logger, req commoncap.UnregisterFromWorkflowRequest,
- remoteCapabilityInfo commoncap.CapabilityInfo, localDonInfo capabilities.DON, dispatcher types.Dispatcher,
- requestTimeout time.Duration) (*ClientRequest, error) {
- rawRequest, err := proto.MarshalOptions{Deterministic: true}.Marshal(pb.UnregisterFromWorkflowRequestToProto(req))
- if err != nil {
- return nil, fmt.Errorf("failed to marshal unregister from workflow request: %w", err)
- }
-
- workflowID := req.Metadata.WorkflowID
- if err := validation.ValidateWorkflowOrExecutionID(workflowID); err != nil {
- return nil, fmt.Errorf("workflow ID is invalid: %w", err)
- }
-
- requestID := types.MethodUnregisterFromWorkflow + ":" + workflowID
-
- tc := transmission.TransmissionConfig{
- Schedule: transmission.Schedule_AllAtOnce,
- DeltaStage: 0,
- }
-
- return newClientRequest(ctx, lggr, requestID, remoteCapabilityInfo, localDonInfo, dispatcher, requestTimeout,
- tc, types.MethodUnregisterFromWorkflow, rawRequest)
-}
-
func NewClientExecuteRequest(ctx context.Context, lggr logger.Logger, req commoncap.CapabilityRequest,
remoteCapabilityInfo commoncap.CapabilityInfo, localDonInfo capabilities.DON, dispatcher types.Dispatcher,
requestTimeout time.Duration) (*ClientRequest, error) {
@@ -212,7 +164,7 @@ func (c *ClientRequest) OnMessage(_ context.Context, msg *types.MessageBody) err
}
if msg.Sender == nil {
- return fmt.Errorf("sender missing from message")
+ return errors.New("sender missing from message")
}
c.lggr.Debugw("OnMessage called for client request", "messageID", msg.MessageId)
diff --git a/core/capabilities/remote/executable/request/client_request_test.go b/core/capabilities/remote/executable/request/client_request_test.go
index c46fd1363a0..212b7265e4f 100644
--- a/core/capabilities/remote/executable/request/client_request_test.go
+++ b/core/capabilities/remote/executable/request/client_request_test.go
@@ -80,15 +80,6 @@ func Test_ClientRequest_MessageValidation(t *testing.T) {
Config: transmissionSchedule,
}
- registerToWorkflowRequest := commoncap.RegisterToWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- WorkflowOwner: "0xaa",
- ReferenceID: "refID",
- },
- Config: transmissionSchedule,
- }
-
m, err := values.NewMap(map[string]any{"response": "response1"})
require.NoError(t, err)
capabilityResponse := commoncap.CapabilityResponse{
@@ -167,7 +158,7 @@ func Test_ClientRequest_MessageValidation(t *testing.T) {
nonDonPeer := NewP2PPeerID(t)
msg.Sender = nonDonPeer[:]
err = request.OnMessage(ctx, msg)
- require.NotNil(t, err)
+ require.Error(t, err)
select {
case <-request.ResponseChan():
@@ -190,7 +181,7 @@ func Test_ClientRequest_MessageValidation(t *testing.T) {
err = request.OnMessage(ctx, msg)
require.NoError(t, err)
err = request.OnMessage(ctx, msg)
- require.NotNil(t, err)
+ require.Error(t, err)
select {
case <-request.ResponseChan():
@@ -211,7 +202,7 @@ func Test_ClientRequest_MessageValidation(t *testing.T) {
<-dispatcher.msgs
<-dispatcher.msgs
- assert.Equal(t, 0, len(dispatcher.msgs))
+ assert.Empty(t, dispatcher.msgs)
msgWithError := &types.MessageBody{
CapabilityId: capInfo.ID,
@@ -249,7 +240,7 @@ func Test_ClientRequest_MessageValidation(t *testing.T) {
<-dispatcher.msgs
<-dispatcher.msgs
- assert.Equal(t, 0, len(dispatcher.msgs))
+ assert.Empty(t, dispatcher.msgs)
msgWithError := &types.MessageBody{
CapabilityId: capInfo.ID,
@@ -299,7 +290,7 @@ func Test_ClientRequest_MessageValidation(t *testing.T) {
<-dispatcher.msgs
<-dispatcher.msgs
- assert.Equal(t, 0, len(dispatcher.msgs))
+ assert.Empty(t, dispatcher.msgs)
msg.Sender = capabilityPeers[0][:]
err = request.OnMessage(ctx, msg)
@@ -317,160 +308,6 @@ func Test_ClientRequest_MessageValidation(t *testing.T) {
assert.Equal(t, resp, values.NewString("response1"))
})
-
- t.Run("Register To Workflow Request", func(t *testing.T) {
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)}
- request, err := request.NewClientRegisterToWorkflowRequest(ctx, lggr, registerToWorkflowRequest, capInfo,
- workflowDonInfo, dispatcher, 10*time.Minute)
- require.NoError(t, err)
- defer request.Cancel(errors.New("test end"))
-
- <-dispatcher.msgs
- <-dispatcher.msgs
- assert.Empty(t, dispatcher.msgs)
-
- msg := &types.MessageBody{
- CapabilityId: capInfo.ID,
- CapabilityDonId: capDonInfo.ID,
- CallerDonId: workflowDonInfo.ID,
- Method: types.MethodRegisterToWorkflow,
- Payload: nil,
- MessageId: []byte("messageID"),
- }
-
- msg.Sender = capabilityPeers[0][:]
- err = request.OnMessage(ctx, msg)
- require.NoError(t, err)
-
- msg.Sender = capabilityPeers[1][:]
- err = request.OnMessage(ctx, msg)
- require.NoError(t, err)
-
- response := <-request.ResponseChan()
- require.Nil(t, response.Result)
- require.NoError(t, response.Err)
- })
-
- t.Run("Register To Workflow Request with error", func(t *testing.T) {
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)}
- request, err := request.NewClientRegisterToWorkflowRequest(ctx, lggr, registerToWorkflowRequest, capInfo,
- workflowDonInfo, dispatcher, 10*time.Minute)
- require.NoError(t, err)
- defer request.Cancel(errors.New("test end"))
-
- <-dispatcher.msgs
- <-dispatcher.msgs
- assert.Empty(t, dispatcher.msgs)
-
- msg := &types.MessageBody{
- CapabilityId: capInfo.ID,
- CapabilityDonId: capDonInfo.ID,
- CallerDonId: workflowDonInfo.ID,
- Method: types.MethodRegisterToWorkflow,
- Payload: nil,
- MessageId: []byte("messageID"),
- Error: types.Error_INTERNAL_ERROR,
- ErrorMsg: "an error",
- }
-
- msg.Sender = capabilityPeers[0][:]
- err = request.OnMessage(ctx, msg)
- require.NoError(t, err)
-
- msg.Sender = capabilityPeers[1][:]
- err = request.OnMessage(ctx, msg)
- require.NoError(t, err)
-
- response := <-request.ResponseChan()
- require.Nil(t, response.Result)
- assert.Equal(t, "an error", response.Err.Error())
- })
-
- t.Run("Unregister From Workflow Request", func(t *testing.T) {
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)}
- request, err := request.NewClientUnregisterFromWorkflowRequest(ctx, lggr, commoncap.UnregisterFromWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- },
- }, capInfo, workflowDonInfo, dispatcher, 10*time.Minute)
- require.NoError(t, err)
- defer request.Cancel(errors.New("test end"))
-
- <-dispatcher.msgs
- <-dispatcher.msgs
- assert.Empty(t, dispatcher.msgs)
-
- msg := &types.MessageBody{
- CapabilityId: capInfo.ID,
- CapabilityDonId: capDonInfo.ID,
- CallerDonId: workflowDonInfo.ID,
- Method: types.MethodUnregisterFromWorkflow,
- Payload: nil,
- MessageId: []byte("messageID"),
- }
-
- msg.Sender = capabilityPeers[0][:]
- err = request.OnMessage(ctx, msg)
- require.NoError(t, err)
-
- msg.Sender = capabilityPeers[1][:]
- err = request.OnMessage(ctx, msg)
- require.NoError(t, err)
-
- response := <-request.ResponseChan()
- require.Nil(t, response.Result)
- require.NoError(t, response.Err)
- })
-
- t.Run("Unregister From Workflow Request with error", func(t *testing.T) {
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- dispatcher := &clientRequestTestDispatcher{msgs: make(chan *types.MessageBody, 100)}
- request, err := request.NewClientUnregisterFromWorkflowRequest(ctx, lggr, commoncap.UnregisterFromWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- },
- }, capInfo, workflowDonInfo, dispatcher, 10*time.Minute)
- require.NoError(t, err)
- defer request.Cancel(errors.New("test end"))
-
- <-dispatcher.msgs
- <-dispatcher.msgs
- assert.Empty(t, dispatcher.msgs)
-
- msg := &types.MessageBody{
- CapabilityId: capInfo.ID,
- CapabilityDonId: capDonInfo.ID,
- CallerDonId: workflowDonInfo.ID,
- Method: types.MethodUnregisterFromWorkflow,
- Payload: nil,
- MessageId: []byte("messageID"),
- Error: types.Error_INTERNAL_ERROR,
- ErrorMsg: "an error",
- }
-
- msg.Sender = capabilityPeers[0][:]
- err = request.OnMessage(ctx, msg)
- require.NoError(t, err)
-
- msg.Sender = capabilityPeers[1][:]
- err = request.OnMessage(ctx, msg)
- require.NoError(t, err)
-
- response := <-request.ResponseChan()
- require.Nil(t, response.Result)
- assert.Equal(t, "an error", response.Err.Error())
- })
}
type clientRequestTestDispatcher struct {
@@ -497,11 +334,11 @@ func (t *clientRequestTestDispatcher) HealthReport() map[string]error {
return nil
}
-func (t *clientRequestTestDispatcher) SetReceiver(capabilityId string, donId uint32, receiver types.Receiver) error {
+func (t *clientRequestTestDispatcher) SetReceiver(capabilityID string, donID uint32, receiver types.Receiver) error {
return nil
}
-func (t *clientRequestTestDispatcher) RemoveReceiver(capabilityId string, donId uint32) {}
+func (t *clientRequestTestDispatcher) RemoveReceiver(capabilityID string, donID uint32) {}
func (t *clientRequestTestDispatcher) Send(peerID p2ptypes.PeerID, msgBody *types.MessageBody) error {
t.msgs <- msgBody
diff --git a/core/capabilities/remote/executable/request/server_request.go b/core/capabilities/remote/executable/request/server_request.go
index 629622494a4..a4f58194328 100644
--- a/core/capabilities/remote/executable/request/server_request.go
+++ b/core/capabilities/remote/executable/request/server_request.go
@@ -26,7 +26,7 @@ type response struct {
type ServerRequest struct {
capability capabilities.ExecutableCapability
- capabilityPeerId p2ptypes.PeerID
+ capabilityPeerID p2ptypes.PeerID
capabilityID string
capabilityDonID uint32
@@ -60,7 +60,7 @@ func NewServerRequest(capability capabilities.ExecutableCapability, method strin
createdTime: time.Now(),
capabilityID: capabilityID,
capabilityDonID: capabilityDonID,
- capabilityPeerId: capabilityPeerID,
+ capabilityPeerID: capabilityPeerID,
dispatcher: dispatcher,
requesters: map[p2ptypes.PeerID]bool{},
responseSentToRequester: map[p2ptypes.PeerID]bool{},
@@ -77,7 +77,7 @@ func (e *ServerRequest) OnMessage(ctx context.Context, msg *types.MessageBody) e
defer e.mux.Unlock()
if msg.Sender == nil {
- return fmt.Errorf("sender missing from message")
+ return errors.New("sender missing from message")
}
requester, err := remote.ToPeerID(msg.Sender)
@@ -94,10 +94,6 @@ func (e *ServerRequest) OnMessage(ctx context.Context, msg *types.MessageBody) e
switch e.method {
case types.MethodExecute:
e.executeRequest(ctx, msg.Payload, executeCapabilityRequest)
- case types.MethodRegisterToWorkflow:
- e.executeRequest(ctx, msg.Payload, registerToWorkflow)
- case types.MethodUnregisterFromWorkflow:
- e.executeRequest(ctx, msg.Payload, unregisterFromWorkflow)
default:
e.setError(types.Error_INTERNAL_ERROR, "unknown method %s"+e.method)
}
@@ -206,7 +202,7 @@ func (e *ServerRequest) sendResponse(requester p2ptypes.PeerID) error {
CallerDonId: e.callingDon.ID,
Method: types.MethodExecute,
MessageId: []byte(e.requestMessageID),
- Sender: e.capabilityPeerId[:],
+ Sender: e.capabilityPeerID[:],
Receiver: requester[:],
}
@@ -252,33 +248,3 @@ func executeCapabilityRequest(ctx context.Context, lggr logger.Logger, capabilit
lggr.Debugw("received execution results", "workflowExecutionID", capabilityRequest.Metadata.WorkflowExecutionID)
return responsePayload, nil
}
-
-func registerToWorkflow(ctx context.Context, _ logger.Logger, capability capabilities.ExecutableCapability,
- payload []byte) ([]byte, error) {
- registerRequest, err := pb.UnmarshalRegisterToWorkflowRequest(payload)
- if err != nil {
- return nil, fmt.Errorf("failed to unmarshal register to workflow request: %w", err)
- }
-
- err = capability.RegisterToWorkflow(ctx, registerRequest)
- if err != nil {
- return nil, fmt.Errorf("failed to register to workflow: %w", err)
- }
-
- return nil, nil
-}
-
-func unregisterFromWorkflow(ctx context.Context, _ logger.Logger, capability capabilities.ExecutableCapability,
- payload []byte) ([]byte, error) {
- unregisterRequest, err := pb.UnmarshalUnregisterFromWorkflowRequest(payload)
- if err != nil {
- return nil, fmt.Errorf("failed to unmarshal unregister from workflow request: %w", err)
- }
-
- err = capability.UnregisterFromWorkflow(ctx, unregisterRequest)
- if err != nil {
- return nil, fmt.Errorf("failed to unregister from workflow: %w", err)
- }
-
- return nil, nil
-}
diff --git a/core/capabilities/remote/executable/request/server_request_test.go b/core/capabilities/remote/executable/request/server_request_test.go
index ce539154d93..d58b6edf3f2 100644
--- a/core/capabilities/remote/executable/request/server_request_test.go
+++ b/core/capabilities/remote/executable/request/server_request_test.go
@@ -165,107 +165,6 @@ func Test_ServerRequest_MessageValidation(t *testing.T) {
assert.Equal(t, types.Error_OK, dispatcher.msgs[0].Error)
assert.Equal(t, types.Error_OK, dispatcher.msgs[1].Error)
})
- t.Run("Register to workflow request", func(t *testing.T) {
- dispatcher := &testDispatcher{}
- request := request.NewServerRequest(capability, types.MethodRegisterToWorkflow, "capabilityID", 2,
- capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)
-
- err := sendValidRequest(request, workflowPeers, capabilityPeerID, rawRequest)
- require.NoError(t, err)
-
- err = request.OnMessage(context.Background(), &types.MessageBody{
- Version: 0,
- Sender: workflowPeers[1][:],
- Receiver: capabilityPeerID[:],
- MessageId: []byte("workflowID" + "workflowExecutionID"),
- CapabilityId: "capabilityID",
- CapabilityDonId: 2,
- CallerDonId: 1,
- Method: types.MethodRegisterToWorkflow,
- Payload: rawRequest,
- })
- require.NoError(t, err)
- assert.Len(t, dispatcher.msgs, 2)
- assert.Equal(t, types.Error_OK, dispatcher.msgs[0].Error)
- assert.Equal(t, types.Error_OK, dispatcher.msgs[1].Error)
- })
- t.Run("Register to workflow request errors", func(t *testing.T) {
- dispatcher := &testDispatcher{}
- req := request.NewServerRequest(TestErrorCapability{}, types.MethodRegisterToWorkflow, "capabilityID", 2,
- capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)
-
- err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest)
- require.NoError(t, err)
-
- err = req.OnMessage(context.Background(), &types.MessageBody{
- Version: 0,
- Sender: workflowPeers[1][:],
- Receiver: capabilityPeerID[:],
- MessageId: []byte("workflowID" + "workflowExecutionID"),
- CapabilityId: "capabilityID",
- CapabilityDonId: 2,
- CallerDonId: 1,
- Method: types.MethodRegisterToWorkflow,
- Payload: rawRequest,
- })
- require.NoError(t, err)
- assert.Len(t, dispatcher.msgs, 2)
- assert.Equal(t, types.Error_INTERNAL_ERROR, dispatcher.msgs[0].Error)
- assert.Equal(t, "failed to register to workflow: an error", dispatcher.msgs[0].ErrorMsg)
- assert.Equal(t, types.Error_INTERNAL_ERROR, dispatcher.msgs[1].Error)
- assert.Equal(t, "failed to register to workflow: an error", dispatcher.msgs[1].ErrorMsg)
- })
- t.Run("Unregister from workflow request", func(t *testing.T) {
- dispatcher := &testDispatcher{}
- request := request.NewServerRequest(capability, types.MethodUnregisterFromWorkflow, "capabilityID", 2,
- capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)
-
- err := sendValidRequest(request, workflowPeers, capabilityPeerID, rawRequest)
- require.NoError(t, err)
-
- err = request.OnMessage(context.Background(), &types.MessageBody{
- Version: 0,
- Sender: workflowPeers[1][:],
- Receiver: capabilityPeerID[:],
- MessageId: []byte("workflowID" + "workflowExecutionID"),
- CapabilityId: "capabilityID",
- CapabilityDonId: 2,
- CallerDonId: 1,
- Method: types.MethodUnregisterFromWorkflow,
- Payload: rawRequest,
- })
- require.NoError(t, err)
- assert.Len(t, dispatcher.msgs, 2)
- assert.Equal(t, types.Error_OK, dispatcher.msgs[0].Error)
- assert.Equal(t, types.Error_OK, dispatcher.msgs[1].Error)
- })
-
- t.Run("Unregister from workflow request errors", func(t *testing.T) {
- dispatcher := &testDispatcher{}
- req := request.NewServerRequest(TestErrorCapability{}, types.MethodUnregisterFromWorkflow, "capabilityID", 2,
- capabilityPeerID, callingDon, "requestMessageID", dispatcher, 10*time.Minute, lggr)
-
- err := sendValidRequest(req, workflowPeers, capabilityPeerID, rawRequest)
- require.NoError(t, err)
-
- err = req.OnMessage(context.Background(), &types.MessageBody{
- Version: 0,
- Sender: workflowPeers[1][:],
- Receiver: capabilityPeerID[:],
- MessageId: []byte("workflowID" + "workflowExecutionID"),
- CapabilityId: "capabilityID",
- CapabilityDonId: 2,
- CallerDonId: 1,
- Method: types.MethodUnregisterFromWorkflow,
- Payload: rawRequest,
- })
- require.NoError(t, err)
- assert.Len(t, dispatcher.msgs, 2)
- assert.Equal(t, types.Error_INTERNAL_ERROR, dispatcher.msgs[0].Error)
- assert.Equal(t, "failed to unregister from workflow: an error", dispatcher.msgs[0].ErrorMsg)
- assert.Equal(t, types.Error_INTERNAL_ERROR, dispatcher.msgs[1].Error)
- assert.Equal(t, "failed to unregister from workflow: an error", dispatcher.msgs[1].ErrorMsg)
- })
}
type serverRequest interface {
@@ -311,11 +210,11 @@ func (t *testDispatcher) HealthReport() map[string]error {
return nil
}
-func (t *testDispatcher) SetReceiver(capabilityId string, donId uint32, receiver types.Receiver) error {
+func (t *testDispatcher) SetReceiver(capabilityID string, donID uint32, receiver types.Receiver) error {
return nil
}
-func (t *testDispatcher) RemoveReceiver(capabilityId string, donId uint32) {}
+func (t *testDispatcher) RemoveReceiver(capabilityID string, donID uint32) {}
func (t *testDispatcher) Send(peerID p2ptypes.PeerID, msgBody *types.MessageBody) error {
t.msgs = append(t.msgs, msgBody)
diff --git a/core/capabilities/remote/executable/server.go b/core/capabilities/remote/executable/server.go
index d43c7ab5c41..5d6a0aff490 100644
--- a/core/capabilities/remote/executable/server.go
+++ b/core/capabilities/remote/executable/server.go
@@ -4,6 +4,7 @@ import (
"context"
"crypto/sha256"
"encoding/hex"
+ "errors"
"fmt"
"sync"
"time"
@@ -137,12 +138,13 @@ func (r *server) Receive(ctx context.Context, msg *types.MessageBody) {
defer r.receiveLock.Unlock()
switch msg.Method {
- case types.MethodExecute, types.MethodRegisterToWorkflow, types.MethodUnregisterFromWorkflow:
+ case types.MethodExecute:
default:
r.lggr.Errorw("received request for unsupported method type", "method", remote.SanitizeLogString(msg.Method))
+ return
}
- messageId, err := GetMessageID(msg)
+ messageID, err := GetMessageID(msg)
if err != nil {
r.lggr.Errorw("invalid message id", "err", err, "id", remote.SanitizeLogString(string(msg.MessageId)))
return
@@ -156,21 +158,21 @@ func (r *server) Receive(ctx context.Context, msg *types.MessageBody) {
// A request is uniquely identified by the message id and the hash of the payload to prevent a malicious
// actor from sending a different payload with the same message id
- requestID := messageId + hex.EncodeToString(msgHash[:])
+ requestID := messageID + hex.EncodeToString(msgHash[:])
r.lggr.Debugw("received request", "msgId", msg.MessageId, "requestID", requestID)
- if requestIDs, ok := r.messageIDToRequestIDsCount[messageId]; ok {
- requestIDs[requestID] = requestIDs[requestID] + 1
+ if requestIDs, ok := r.messageIDToRequestIDsCount[messageID]; ok {
+ requestIDs[requestID]++
} else {
- r.messageIDToRequestIDsCount[messageId] = map[string]int{requestID: 1}
+ r.messageIDToRequestIDsCount[messageID] = map[string]int{requestID: 1}
}
- requestIDs := r.messageIDToRequestIDsCount[messageId]
+ requestIDs := r.messageIDToRequestIDsCount[messageID]
if len(requestIDs) > 1 {
// This is a potential attack vector as well as a situation that will occur if the client is sending non-deterministic payloads
// so a warning is logged
- r.lggr.Warnw("received messages with the same id and different payloads", "messageID", messageId, "lenRequestIDs", len(requestIDs))
+ r.lggr.Warnw("received messages with the same id and different payloads", "messageID", messageID, "lenRequestIDs", len(requestIDs))
}
if _, ok := r.requestIDToRequest[requestID]; !ok {
@@ -182,8 +184,8 @@ func (r *server) Receive(ctx context.Context, msg *types.MessageBody) {
r.requestIDToRequest[requestID] = requestAndMsgID{
request: request.NewServerRequest(r.underlying, msg.Method, r.capInfo.ID, r.localDonInfo.ID, r.peerID,
- callingDon, messageId, r.dispatcher, r.requestTimeout, r.lggr),
- messageID: messageId,
+ callingDon, messageID, r.dispatcher, r.requestTimeout, r.lggr),
+ messageID: messageID,
}
}
@@ -218,7 +220,7 @@ func (r *server) getMessageHash(msg *types.MessageBody) ([32]byte, error) {
func GetMessageID(msg *types.MessageBody) (string, error) {
idStr := string(msg.MessageId)
if !validation.IsValidID(idStr) {
- return "", fmt.Errorf("invalid message id")
+ return "", errors.New("invalid message id")
}
return idStr, nil
}
diff --git a/core/capabilities/remote/executable/server_test.go b/core/capabilities/remote/executable/server_test.go
index 1fb5c2dd413..c92a996f846 100644
--- a/core/capabilities/remote/executable/server_test.go
+++ b/core/capabilities/remote/executable/server_test.go
@@ -83,89 +83,6 @@ func Test_Server_Execute_RespondsAfterSufficientRequests(t *testing.T) {
closeServices(t, srvcs)
}
-func Test_Server_RegisterToWorkflow_RespondsAfterSufficientRequests(t *testing.T) {
- ctx := testutils.Context(t)
-
- numCapabilityPeers := 4
-
- callers, srvcs := testRemoteExecutableCapabilityServer(ctx, t, &commoncap.RemoteExecutableConfig{}, &TestCapability{}, 10, 9, numCapabilityPeers, 3, 10*time.Minute)
-
- for _, caller := range callers {
- err := caller.RegisterToWorkflow(context.Background(), commoncap.RegisterToWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- ReferenceID: stepReferenceID1,
- WorkflowOwner: workflowOwnerID,
- },
- })
-
- require.NoError(t, err)
- }
-
- for _, caller := range callers {
- for i := 0; i < numCapabilityPeers; i++ {
- msg := <-caller.receivedMessages
- assert.Equal(t, remotetypes.Error_OK, msg.Error)
- }
- }
- closeServices(t, srvcs)
-}
-
-func Test_Server_RegisterToWorkflow_Error(t *testing.T) {
- ctx := testutils.Context(t)
-
- numCapabilityPeers := 4
-
- callers, srvcs := testRemoteExecutableCapabilityServer(ctx, t, &commoncap.RemoteExecutableConfig{}, &TestErrorCapability{}, 10, 9, numCapabilityPeers, 3, 10*time.Minute)
-
- for _, caller := range callers {
- err := caller.RegisterToWorkflow(context.Background(), commoncap.RegisterToWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- ReferenceID: stepReferenceID1,
- WorkflowOwner: workflowOwnerID,
- },
- })
-
- require.NoError(t, err)
- }
-
- for _, caller := range callers {
- for i := 0; i < numCapabilityPeers; i++ {
- msg := <-caller.receivedMessages
- assert.Equal(t, remotetypes.Error_INTERNAL_ERROR, msg.Error)
- }
- }
- closeServices(t, srvcs)
-}
-
-func Test_Server_UnregisterFromWorkflow_RespondsAfterSufficientRequests(t *testing.T) {
- ctx := testutils.Context(t)
-
- numCapabilityPeers := 4
-
- callers, srvcs := testRemoteExecutableCapabilityServer(ctx, t, &commoncap.RemoteExecutableConfig{}, &TestCapability{}, 10, 9, numCapabilityPeers, 3, 10*time.Minute)
-
- for _, caller := range callers {
- err := caller.UnregisterFromWorkflow(context.Background(), commoncap.UnregisterFromWorkflowRequest{
- Metadata: commoncap.RegistrationMetadata{
- WorkflowID: workflowID1,
- ReferenceID: stepReferenceID1,
- WorkflowOwner: workflowOwnerID,
- },
- })
- require.NoError(t, err)
- }
-
- for _, caller := range callers {
- for i := 0; i < numCapabilityPeers; i++ {
- msg := <-caller.receivedMessages
- assert.Equal(t, remotetypes.Error_OK, msg.Error)
- }
- }
- closeServices(t, srvcs)
-}
-
func Test_Server_InsufficientCallers(t *testing.T) {
ctx := testutils.Context(t)
@@ -319,62 +236,6 @@ func (r *serverTestClient) Info(ctx context.Context) (commoncap.CapabilityInfo,
panic("not implemented")
}
-func (r *serverTestClient) RegisterToWorkflow(ctx context.Context, req commoncap.RegisterToWorkflowRequest) error {
- rawRequest, err := pb.MarshalRegisterToWorkflowRequest(req)
- if err != nil {
- return err
- }
-
- messageID := remotetypes.MethodRegisterToWorkflow + ":" + req.Metadata.WorkflowID
-
- for _, node := range r.capabilityDonInfo.Members {
- message := &remotetypes.MessageBody{
- CapabilityId: "capability-id",
- CapabilityDonId: 1,
- CallerDonId: 2,
- Method: remotetypes.MethodRegisterToWorkflow,
- Payload: rawRequest,
- MessageId: []byte(messageID),
- Sender: r.peerID[:],
- Receiver: node[:],
- }
-
- if err = r.dispatcher.Send(node, message); err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (r *serverTestClient) UnregisterFromWorkflow(ctx context.Context, req commoncap.UnregisterFromWorkflowRequest) error {
- rawRequest, err := pb.MarshalUnregisterFromWorkflowRequest(req)
- if err != nil {
- return err
- }
-
- messageID := remotetypes.MethodUnregisterFromWorkflow + ":" + req.Metadata.WorkflowID
-
- for _, node := range r.capabilityDonInfo.Members {
- message := &remotetypes.MessageBody{
- CapabilityId: "capability-id",
- CapabilityDonId: 1,
- CallerDonId: 2,
- Method: remotetypes.MethodUnregisterFromWorkflow,
- Payload: rawRequest,
- MessageId: []byte(messageID),
- Sender: r.peerID[:],
- Receiver: node[:],
- }
-
- if err = r.dispatcher.Send(node, message); err != nil {
- return err
- }
- }
-
- return nil
-}
-
func (r *serverTestClient) Execute(ctx context.Context, req commoncap.CapabilityRequest) (<-chan commoncap.CapabilityResponse, error) {
rawRequest, err := pb.MarshalCapabilityRequest(req)
if err != nil {
diff --git a/core/capabilities/remote/message_cache.go b/core/capabilities/remote/messagecache/message_cache.go
similarity index 81%
rename from core/capabilities/remote/message_cache.go
rename to core/capabilities/remote/messagecache/message_cache.go
index f3a3a79b2c6..28ef57ab875 100644
--- a/core/capabilities/remote/message_cache.go
+++ b/core/capabilities/remote/messagecache/message_cache.go
@@ -1,9 +1,9 @@
-package remote
+package messagecache
// MessageCache is a simple store for messages, grouped by event ID and peer ID.
// It is used to collect messages from multiple peers until they are ready for aggregation
// based on quantity and freshness.
-type messageCache[EventID comparable, PeerID comparable] struct {
+type MessageCache[EventID comparable, PeerID comparable] struct {
events map[EventID]*eventState[PeerID]
}
@@ -18,14 +18,14 @@ type msgState struct {
payload []byte
}
-func NewMessageCache[EventID comparable, PeerID comparable]() *messageCache[EventID, PeerID] {
- return &messageCache[EventID, PeerID]{
+func NewMessageCache[EventID comparable, PeerID comparable]() *MessageCache[EventID, PeerID] {
+ return &MessageCache[EventID, PeerID]{
events: make(map[EventID]*eventState[PeerID]),
}
}
// Insert or overwrite a message for . Return creation timestamp of the event.
-func (c *messageCache[EventID, PeerID]) Insert(eventID EventID, peerID PeerID, timestamp int64, payload []byte) int64 {
+func (c *MessageCache[EventID, PeerID]) Insert(eventID EventID, peerID PeerID, timestamp int64, payload []byte) int64 {
if _, ok := c.events[eventID]; !ok {
c.events[eventID] = &eventState[PeerID]{
peerMsgs: make(map[PeerID]*msgState),
@@ -43,7 +43,7 @@ func (c *messageCache[EventID, PeerID]) Insert(eventID EventID, peerID PeerID, t
// received more recently than .
// Return all messages that satisfy the above condition.
// Ready() will return true at most once per event if is true.
-func (c *messageCache[EventID, PeerID]) Ready(eventID EventID, minCount uint32, minTimestamp int64, once bool) (bool, [][]byte) {
+func (c *MessageCache[EventID, PeerID]) Ready(eventID EventID, minCount uint32, minTimestamp int64, once bool) (bool, [][]byte) {
ev, ok := c.events[eventID]
if !ok {
return false, nil
@@ -51,6 +51,7 @@ func (c *messageCache[EventID, PeerID]) Ready(eventID EventID, minCount uint32,
if ev.wasReady && once {
return false, nil
}
+ //nolint:gosec // G115
if uint32(len(ev.peerMsgs)) < minCount {
return false, nil
}
@@ -69,13 +70,13 @@ func (c *messageCache[EventID, PeerID]) Ready(eventID EventID, minCount uint32,
return false, nil
}
-func (c *messageCache[EventID, PeerID]) Delete(eventID EventID) {
+func (c *MessageCache[EventID, PeerID]) Delete(eventID EventID) {
delete(c.events, eventID)
}
// Return the number of events deleted.
// Scans all keys, which might be slow for large caches.
-func (c *messageCache[EventID, PeerID]) DeleteOlderThan(cutoffTimestamp int64) int {
+func (c *MessageCache[EventID, PeerID]) DeleteOlderThan(cutoffTimestamp int64) int {
nDeleted := 0
for id, event := range c.events {
if event.creationTimestamp < cutoffTimestamp {
diff --git a/core/capabilities/remote/message_cache_test.go b/core/capabilities/remote/messagecache/message_cache_test.go
similarity index 59%
rename from core/capabilities/remote/message_cache_test.go
rename to core/capabilities/remote/messagecache/message_cache_test.go
index 5ca909ca4ec..2d059adef32 100644
--- a/core/capabilities/remote/message_cache_test.go
+++ b/core/capabilities/remote/messagecache/message_cache_test.go
@@ -1,53 +1,53 @@
-package remote_test
+package messagecache_test
import (
"testing"
"github.com/stretchr/testify/require"
- "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/messagecache"
)
const (
- eventId1 = "event1"
- eventId2 = "event2"
- peerId1 = "peer1"
- peerId2 = "peer2"
+ eventID1 = "event1"
+ eventID2 = "event2"
+ peerID1 = "peer1"
+ peerID2 = "peer2"
payloadA = "payloadA"
)
func TestMessageCache_InsertReady(t *testing.T) {
- cache := remote.NewMessageCache[string, string]()
+ cache := messagecache.NewMessageCache[string, string]()
// not ready with one message
- ts := cache.Insert(eventId1, peerId1, 100, []byte(payloadA))
+ ts := cache.Insert(eventID1, peerID1, 100, []byte(payloadA))
require.Equal(t, int64(100), ts)
- ready, _ := cache.Ready(eventId1, 2, 100, true)
+ ready, _ := cache.Ready(eventID1, 2, 100, true)
require.False(t, ready)
// not ready with two messages but only one fresh enough
- ts = cache.Insert(eventId1, peerId2, 200, []byte(payloadA))
+ ts = cache.Insert(eventID1, peerID2, 200, []byte(payloadA))
require.Equal(t, int64(100), ts)
- ready, _ = cache.Ready(eventId1, 2, 150, true)
+ ready, _ = cache.Ready(eventID1, 2, 150, true)
require.False(t, ready)
// ready with two messages (once only)
- ready, messages := cache.Ready(eventId1, 2, 100, true)
+ ready, messages := cache.Ready(eventID1, 2, 100, true)
require.True(t, ready)
require.Equal(t, []byte(payloadA), messages[0])
require.Equal(t, []byte(payloadA), messages[1])
// not ready again for the same event ID
- ready, _ = cache.Ready(eventId1, 2, 100, true)
+ ready, _ = cache.Ready(eventID1, 2, 100, true)
require.False(t, ready)
}
func TestMessageCache_DeleteOlderThan(t *testing.T) {
- cache := remote.NewMessageCache[string, string]()
+ cache := messagecache.NewMessageCache[string, string]()
- ts := cache.Insert(eventId1, peerId1, 100, []byte(payloadA))
+ ts := cache.Insert(eventID1, peerID1, 100, []byte(payloadA))
require.Equal(t, int64(100), ts)
- ts = cache.Insert(eventId2, peerId2, 200, []byte(payloadA))
+ ts = cache.Insert(eventID2, peerID2, 200, []byte(payloadA))
require.Equal(t, int64(200), ts)
deleted := cache.DeleteOlderThan(150)
diff --git a/core/capabilities/remote/trigger_publisher.go b/core/capabilities/remote/trigger_publisher.go
index 315959605e8..24bd26757ac 100644
--- a/core/capabilities/remote/trigger_publisher.go
+++ b/core/capabilities/remote/trigger_publisher.go
@@ -10,6 +10,8 @@ import (
commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/aggregation"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/messagecache"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/validation"
"github.com/smartcontractkit/chainlink/v2/core/logger"
@@ -30,7 +32,7 @@ type triggerPublisher struct {
workflowDONs map[uint32]commoncap.DON
membersCache map[uint32]map[p2ptypes.PeerID]bool
dispatcher types.Dispatcher
- messageCache *messageCache[registrationKey, p2ptypes.PeerID]
+ messageCache *messagecache.MessageCache[registrationKey, p2ptypes.PeerID]
registrations map[registrationKey]*pubRegState
mu sync.RWMutex // protects messageCache and registrations
batchingQueue map[[32]byte]*batchedResponse
@@ -42,8 +44,8 @@ type triggerPublisher struct {
}
type registrationKey struct {
- callerDonId uint32
- workflowId string
+ callerDonID uint32
+ workflowID string
}
type pubRegState struct {
@@ -84,7 +86,7 @@ func NewTriggerPublisher(config *commoncap.RemoteTriggerConfig, underlying commo
workflowDONs: workflowDONs,
membersCache: membersCache,
dispatcher: dispatcher,
- messageCache: NewMessageCache[registrationKey, p2ptypes.PeerID](),
+ messageCache: messagecache.NewMessageCache[registrationKey, p2ptypes.PeerID](),
registrations: make(map[registrationKey]*pubRegState),
batchingQueue: make(map[[32]byte]*batchedResponse),
batchingEnabled: config.MaxBatchSize > 1 && config.BatchCollectionPeriod >= minAllowedBatchCollectionPeriod,
@@ -148,7 +150,7 @@ func (p *triggerPublisher) Receive(_ context.Context, msg *types.MessageBody) {
p.lggr.Debugw("not ready to aggregate yet", "capabilityId", p.capInfo.ID, "workflowId", req.Metadata.WorkflowID, "minRequired", minRequired)
return
}
- aggregated, err := AggregateModeRaw(payloads, uint32(callerDon.F+1))
+ aggregated, err := aggregation.AggregateModeRaw(payloads, uint32(callerDon.F+1))
if err != nil {
p.lggr.Errorw("failed to aggregate trigger registrations", "capabilityId", p.capInfo.ID, "workflowId", req.Metadata.WorkflowID, "err", err)
return
@@ -189,14 +191,14 @@ func (p *triggerPublisher) registrationCleanupLoop() {
now := time.Now().UnixMilli()
p.mu.Lock()
for key, req := range p.registrations {
- callerDon := p.workflowDONs[key.callerDonId]
+ callerDon := p.workflowDONs[key.callerDonID]
ready, _ := p.messageCache.Ready(key, uint32(2*callerDon.F+1), now-p.config.RegistrationExpiry.Milliseconds(), false)
if !ready {
- p.lggr.Infow("trigger registration expired", "capabilityId", p.capInfo.ID, "callerDonID", key.callerDonId, "workflowId", key.workflowId)
+ p.lggr.Infow("trigger registration expired", "capabilityId", p.capInfo.ID, "callerDonID", key.callerDonID, "workflowId", key.workflowID)
ctx, cancel := p.stopCh.NewCtx()
err := p.underlying.UnregisterTrigger(ctx, req.request)
cancel()
- p.lggr.Infow("unregistered trigger", "capabilityId", p.capInfo.ID, "callerDonID", key.callerDonId, "workflowId", key.workflowId, "err", err)
+ p.lggr.Infow("unregistered trigger", "capabilityId", p.capInfo.ID, "callerDonID", key.callerDonID, "workflowId", key.workflowID, "err", err)
// after calling UnregisterTrigger, the underlying trigger will not send any more events to the channel
delete(p.registrations, key)
p.messageCache.Delete(key)
@@ -215,11 +217,11 @@ func (p *triggerPublisher) triggerEventLoop(callbackCh <-chan commoncap.TriggerR
return
case response, ok := <-callbackCh:
if !ok {
- p.lggr.Infow("triggerEventLoop channel closed", "capabilityId", p.capInfo.ID, "workflowId", key.workflowId)
+ p.lggr.Infow("triggerEventLoop channel closed", "capabilityId", p.capInfo.ID, "workflowId", key.workflowID)
return
}
triggerEvent := response.Event
- p.lggr.Debugw("received trigger event", "capabilityId", p.capInfo.ID, "workflowId", key.workflowId, "triggerEventID", triggerEvent.ID)
+ p.lggr.Debugw("received trigger event", "capabilityId", p.capInfo.ID, "workflowId", key.workflowID, "triggerEventID", triggerEvent.ID)
marshaledResponse, err := pb.MarshalTriggerResponse(response)
if err != nil {
p.lggr.Debugw("can't marshal trigger event", "err", err)
@@ -232,9 +234,9 @@ func (p *triggerPublisher) triggerEventLoop(callbackCh <-chan commoncap.TriggerR
// a single-element "batch"
p.sendBatch(&batchedResponse{
rawResponse: marshaledResponse,
- callerDonID: key.callerDonId,
+ callerDonID: key.callerDonID,
triggerEventID: triggerEvent.ID,
- workflowIDs: []string{key.workflowId},
+ workflowIDs: []string{key.workflowID},
})
}
}
@@ -244,7 +246,7 @@ func (p *triggerPublisher) triggerEventLoop(callbackCh <-chan commoncap.TriggerR
func (p *triggerPublisher) enqueueForBatching(rawResponse []byte, key registrationKey, triggerEventID string) {
// put in batching queue, group by hash(callerDonId, triggerEventID, response)
combined := make([]byte, 4)
- binary.LittleEndian.PutUint32(combined, key.callerDonId)
+ binary.LittleEndian.PutUint32(combined, key.callerDonID)
combined = append(combined, []byte(triggerEventID)...)
combined = append(combined, rawResponse...)
sha := sha256.Sum256(combined)
@@ -253,13 +255,13 @@ func (p *triggerPublisher) enqueueForBatching(rawResponse []byte, key registrati
if !exists {
elem = &batchedResponse{
rawResponse: rawResponse,
- callerDonID: key.callerDonId,
+ callerDonID: key.callerDonID,
triggerEventID: triggerEventID,
- workflowIDs: []string{key.workflowId},
+ workflowIDs: []string{key.workflowID},
}
p.batchingQueue[sha] = elem
} else {
- elem.workflowIDs = append(elem.workflowIDs, key.workflowId)
+ elem.workflowIDs = append(elem.workflowIDs, key.workflowID)
}
p.bqMu.Unlock()
}
diff --git a/core/capabilities/remote/trigger_subscriber.go b/core/capabilities/remote/trigger_subscriber.go
index 2638d9ca5f3..7edcbf5eba7 100644
--- a/core/capabilities/remote/trigger_subscriber.go
+++ b/core/capabilities/remote/trigger_subscriber.go
@@ -9,6 +9,8 @@ import (
commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/aggregation"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/messagecache"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
"github.com/smartcontractkit/chainlink/v2/core/logger"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
@@ -29,7 +31,7 @@ type triggerSubscriber struct {
localDonInfo commoncap.DON
dispatcher types.Dispatcher
aggregator types.Aggregator
- messageCache *messageCache[triggerEventKey, p2ptypes.PeerID]
+ messageCache *messagecache.MessageCache[triggerEventKey, p2ptypes.PeerID]
registeredWorkflows map[string]*subRegState
mu sync.RWMutex // protects registeredWorkflows and messageCache
stopCh services.StopChan
@@ -38,8 +40,8 @@ type triggerSubscriber struct {
}
type triggerEventKey struct {
- triggerEventId string
- workflowId string
+ triggerEventID string
+ workflowID string
}
type subRegState struct {
@@ -65,7 +67,7 @@ const (
func NewTriggerSubscriber(config *commoncap.RemoteTriggerConfig, capInfo commoncap.CapabilityInfo, capDonInfo commoncap.DON, localDonInfo commoncap.DON, dispatcher types.Dispatcher, aggregator types.Aggregator, lggr logger.Logger) *triggerSubscriber {
if aggregator == nil {
lggr.Warnw("no aggregator provided, using default MODE aggregator", "capabilityId", capInfo.ID)
- aggregator = NewDefaultModeAggregator(uint32(capDonInfo.F + 1))
+ aggregator = aggregation.NewDefaultModeAggregator(uint32(capDonInfo.F + 1))
}
if config == nil {
lggr.Info("no config provided, using default values")
@@ -84,7 +86,7 @@ func NewTriggerSubscriber(config *commoncap.RemoteTriggerConfig, capInfo commonc
localDonInfo: localDonInfo,
dispatcher: dispatcher,
aggregator: aggregator,
- messageCache: NewMessageCache[triggerEventKey, p2ptypes.PeerID](),
+ messageCache: messagecache.NewMessageCache[triggerEventKey, p2ptypes.PeerID](),
registeredWorkflows: make(map[string]*subRegState),
stopCh: make(services.StopChan),
lggr: lggr.Named("TriggerSubscriber"),
@@ -200,17 +202,17 @@ func (s *triggerSubscriber) Receive(_ context.Context, msg *types.MessageBody) {
s.lggr.Errorw("received message with too many workflow IDs - truncating", "capabilityId", s.capInfo.ID, "nWorkflows", len(meta.WorkflowIds), "sender", sender)
meta.WorkflowIds = meta.WorkflowIds[:maxBatchedWorkflowIDs]
}
- for _, workflowId := range meta.WorkflowIds {
+ for _, workflowID := range meta.WorkflowIds {
s.mu.RLock()
- registration, found := s.registeredWorkflows[workflowId]
+ registration, found := s.registeredWorkflows[workflowID]
s.mu.RUnlock()
if !found {
- s.lggr.Errorw("received message for unregistered workflow", "capabilityId", s.capInfo.ID, "workflowID", SanitizeLogString(workflowId), "sender", sender)
+ s.lggr.Errorw("received message for unregistered workflow", "capabilityId", s.capInfo.ID, "workflowID", SanitizeLogString(workflowID), "sender", sender)
continue
}
key := triggerEventKey{
- triggerEventId: meta.TriggerEventId,
- workflowId: workflowId,
+ triggerEventID: meta.TriggerEventId,
+ workflowID: workflowID,
}
nowMs := time.Now().UnixMilli()
s.mu.Lock()
@@ -218,17 +220,17 @@ func (s *triggerSubscriber) Receive(_ context.Context, msg *types.MessageBody) {
ready, payloads := s.messageCache.Ready(key, s.config.MinResponsesToAggregate, nowMs-s.config.MessageExpiry.Milliseconds(), true)
s.mu.Unlock()
if nowMs-creationTs > s.config.RegistrationExpiry.Milliseconds() {
- s.lggr.Warnw("received trigger event for an expired ID", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowId, "sender", sender)
+ s.lggr.Warnw("received trigger event for an expired ID", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowID, "sender", sender)
continue
}
if ready {
- s.lggr.Debugw("trigger event ready to aggregate", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowId)
+ s.lggr.Debugw("trigger event ready to aggregate", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowID)
aggregatedResponse, err := s.aggregator.Aggregate(meta.TriggerEventId, payloads)
if err != nil {
- s.lggr.Errorw("failed to aggregate responses", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowId, "err", err)
+ s.lggr.Errorw("failed to aggregate responses", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowID, "err", err)
continue
}
- s.lggr.Infow("remote trigger event aggregated", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowId)
+ s.lggr.Infow("remote trigger event aggregated", "triggerEventID", meta.TriggerEventId, "capabilityId", s.capInfo.ID, "workflowId", workflowID)
registration.callback <- aggregatedResponse
}
}
diff --git a/core/capabilities/remote/trigger_subscriber_test.go b/core/capabilities/remote/trigger_subscriber_test.go
index b8cc3ddc7bd..d5b48bc1dc8 100644
--- a/core/capabilities/remote/trigger_subscriber_test.go
+++ b/core/capabilities/remote/trigger_subscriber_test.go
@@ -26,7 +26,6 @@ const (
var (
triggerEvent1 = map[string]any{"event": "triggerEvent1"}
- triggerEvent2 = map[string]any{"event": "triggerEvent2"}
)
func TestTriggerSubscriber_RegisterAndReceive(t *testing.T) {
diff --git a/core/capabilities/remote/types/mocks/dispatcher.go b/core/capabilities/remote/types/mocks/dispatcher.go
index 0948698b935..d7f2ab45bac 100644
--- a/core/capabilities/remote/types/mocks/dispatcher.go
+++ b/core/capabilities/remote/types/mocks/dispatcher.go
@@ -206,9 +206,9 @@ func (_c *Dispatcher_Ready_Call) RunAndReturn(run func() error) *Dispatcher_Read
return _c
}
-// RemoveReceiver provides a mock function with given fields: capabilityId, donId
-func (_m *Dispatcher) RemoveReceiver(capabilityId string, donId uint32) {
- _m.Called(capabilityId, donId)
+// RemoveReceiver provides a mock function with given fields: capabilityID, donID
+func (_m *Dispatcher) RemoveReceiver(capabilityID string, donID uint32) {
+ _m.Called(capabilityID, donID)
}
// Dispatcher_RemoveReceiver_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RemoveReceiver'
@@ -217,13 +217,13 @@ type Dispatcher_RemoveReceiver_Call struct {
}
// RemoveReceiver is a helper method to define mock.On call
-// - capabilityId string
-// - donId uint32
-func (_e *Dispatcher_Expecter) RemoveReceiver(capabilityId interface{}, donId interface{}) *Dispatcher_RemoveReceiver_Call {
- return &Dispatcher_RemoveReceiver_Call{Call: _e.mock.On("RemoveReceiver", capabilityId, donId)}
+// - capabilityID string
+// - donID uint32
+func (_e *Dispatcher_Expecter) RemoveReceiver(capabilityID interface{}, donID interface{}) *Dispatcher_RemoveReceiver_Call {
+ return &Dispatcher_RemoveReceiver_Call{Call: _e.mock.On("RemoveReceiver", capabilityID, donID)}
}
-func (_c *Dispatcher_RemoveReceiver_Call) Run(run func(capabilityId string, donId uint32)) *Dispatcher_RemoveReceiver_Call {
+func (_c *Dispatcher_RemoveReceiver_Call) Run(run func(capabilityID string, donID uint32)) *Dispatcher_RemoveReceiver_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(string), args[1].(uint32))
})
@@ -287,9 +287,9 @@ func (_c *Dispatcher_Send_Call) RunAndReturn(run func(p2ptypes.PeerID, *types.Me
return _c
}
-// SetReceiver provides a mock function with given fields: capabilityId, donId, receiver
-func (_m *Dispatcher) SetReceiver(capabilityId string, donId uint32, receiver types.Receiver) error {
- ret := _m.Called(capabilityId, donId, receiver)
+// SetReceiver provides a mock function with given fields: capabilityID, donID, receiver
+func (_m *Dispatcher) SetReceiver(capabilityID string, donID uint32, receiver types.Receiver) error {
+ ret := _m.Called(capabilityID, donID, receiver)
if len(ret) == 0 {
panic("no return value specified for SetReceiver")
@@ -297,7 +297,7 @@ func (_m *Dispatcher) SetReceiver(capabilityId string, donId uint32, receiver ty
var r0 error
if rf, ok := ret.Get(0).(func(string, uint32, types.Receiver) error); ok {
- r0 = rf(capabilityId, donId, receiver)
+ r0 = rf(capabilityID, donID, receiver)
} else {
r0 = ret.Error(0)
}
@@ -311,14 +311,14 @@ type Dispatcher_SetReceiver_Call struct {
}
// SetReceiver is a helper method to define mock.On call
-// - capabilityId string
-// - donId uint32
+// - capabilityID string
+// - donID uint32
// - receiver types.Receiver
-func (_e *Dispatcher_Expecter) SetReceiver(capabilityId interface{}, donId interface{}, receiver interface{}) *Dispatcher_SetReceiver_Call {
- return &Dispatcher_SetReceiver_Call{Call: _e.mock.On("SetReceiver", capabilityId, donId, receiver)}
+func (_e *Dispatcher_Expecter) SetReceiver(capabilityID interface{}, donID interface{}, receiver interface{}) *Dispatcher_SetReceiver_Call {
+ return &Dispatcher_SetReceiver_Call{Call: _e.mock.On("SetReceiver", capabilityID, donID, receiver)}
}
-func (_c *Dispatcher_SetReceiver_Call) Run(run func(capabilityId string, donId uint32, receiver types.Receiver)) *Dispatcher_SetReceiver_Call {
+func (_c *Dispatcher_SetReceiver_Call) Run(run func(capabilityID string, donID uint32, receiver types.Receiver)) *Dispatcher_SetReceiver_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(string), args[1].(uint32), args[2].(types.Receiver))
})
diff --git a/core/capabilities/remote/types/types.go b/core/capabilities/remote/types/types.go
index fefc9a9b5fe..983ac6a8ed2 100644
--- a/core/capabilities/remote/types/types.go
+++ b/core/capabilities/remote/types/types.go
@@ -13,18 +13,16 @@ import (
)
const (
- MethodRegisterTrigger = "RegisterTrigger"
- MethodUnRegisterTrigger = "UnregisterTrigger"
- MethodTriggerEvent = "TriggerEvent"
- MethodExecute = "Execute"
- MethodRegisterToWorkflow = "RegisterToWorkflow"
- MethodUnregisterFromWorkflow = "UnregisterFromWorkflow"
+ MethodRegisterTrigger = "RegisterTrigger"
+ MethodUnRegisterTrigger = "UnregisterTrigger"
+ MethodTriggerEvent = "TriggerEvent"
+ MethodExecute = "Execute"
)
type Dispatcher interface {
services.Service
- SetReceiver(capabilityId string, donId uint32, receiver Receiver) error
- RemoveReceiver(capabilityId string, donId uint32)
+ SetReceiver(capabilityID string, donID uint32, receiver Receiver) error
+ RemoveReceiver(capabilityID string, donID uint32)
Send(peerID p2ptypes.PeerID, msgBody *MessageBody) error
}
diff --git a/core/capabilities/remote/utils.go b/core/capabilities/remote/utils.go
index ea6a3efb186..7af34c5c946 100644
--- a/core/capabilities/remote/utils.go
+++ b/core/capabilities/remote/utils.go
@@ -3,7 +3,6 @@ package remote
import (
"bytes"
"crypto/ed25519"
- "crypto/sha256"
"encoding/hex"
"errors"
"fmt"
@@ -11,8 +10,6 @@ import (
"google.golang.org/protobuf/proto"
- commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
- "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
)
@@ -25,25 +22,25 @@ func ValidateMessage(msg p2ptypes.Message, expectedReceiver p2ptypes.PeerID) (*r
var topLevelMessage remotetypes.Message
err := proto.Unmarshal(msg.Payload, &topLevelMessage)
if err != nil {
- return nil, fmt.Errorf("failed to unmarshal message, err: %v", err)
+ return nil, fmt.Errorf("failed to unmarshal message, err: %w", err)
}
var body remotetypes.MessageBody
err = proto.Unmarshal(topLevelMessage.Body, &body)
if err != nil {
- return nil, fmt.Errorf("failed to unmarshal message body, err: %v", err)
+ return nil, fmt.Errorf("failed to unmarshal message body, err: %w", err)
}
if len(body.Sender) != p2ptypes.PeerIDLength || len(body.Receiver) != p2ptypes.PeerIDLength {
return &body, fmt.Errorf("invalid sender length (%d) or receiver length (%d)", len(body.Sender), len(body.Receiver))
}
if !ed25519.Verify(body.Sender, topLevelMessage.Body, topLevelMessage.Signature) {
- return &body, fmt.Errorf("failed to verify message signature")
+ return &body, errors.New("failed to verify message signature")
}
// NOTE we currently don't support relaying messages so the p2p message sender needs to be the message author
if !bytes.Equal(body.Sender, msg.Sender[:]) {
- return &body, fmt.Errorf("sender in message body does not match sender of p2p message")
+ return &body, errors.New("sender in message body does not match sender of p2p message")
}
if !bytes.Equal(body.Receiver, expectedReceiver[:]) {
- return &body, fmt.Errorf("receiver in message body does not match expected receiver")
+ return &body, errors.New("receiver in message body does not match expected receiver")
}
return &body, nil
}
@@ -58,52 +55,6 @@ func ToPeerID(peerID []byte) (p2ptypes.PeerID, error) {
return id, nil
}
-// Default MODE Aggregator needs a configurable number of identical responses for aggregation to succeed
-type defaultModeAggregator struct {
- minIdenticalResponses uint32
-}
-
-var _ remotetypes.Aggregator = &defaultModeAggregator{}
-
-func NewDefaultModeAggregator(minIdenticalResponses uint32) *defaultModeAggregator {
- return &defaultModeAggregator{
- minIdenticalResponses: minIdenticalResponses,
- }
-}
-
-func (a *defaultModeAggregator) Aggregate(_ string, responses [][]byte) (commoncap.TriggerResponse, error) {
- found, err := AggregateModeRaw(responses, a.minIdenticalResponses)
- if err != nil {
- return commoncap.TriggerResponse{}, fmt.Errorf("failed to aggregate responses, err: %w", err)
- }
-
- unmarshaled, err := pb.UnmarshalTriggerResponse(found)
- if err != nil {
- return commoncap.TriggerResponse{}, fmt.Errorf("failed to unmarshal aggregated responses, err: %w", err)
- }
- return unmarshaled, nil
-}
-
-func AggregateModeRaw(elemList [][]byte, minIdenticalResponses uint32) ([]byte, error) {
- hashToCount := make(map[string]uint32)
- var found []byte
- for _, elem := range elemList {
- hasher := sha256.New()
- hasher.Write(elem)
- sha := hex.EncodeToString(hasher.Sum(nil))
- hashToCount[sha]++
- if hashToCount[sha] >= minIdenticalResponses {
- found = elem
- // update in case we find another elem with an even higher count
- minIdenticalResponses = hashToCount[sha]
- }
- }
- if found == nil {
- return nil, errors.New("not enough identical responses found")
- }
- return found, nil
-}
-
func SanitizeLogString(s string) string {
tooLongSuffix := ""
if len(s) > maxLoggedStringLen {
diff --git a/core/capabilities/remote/utils_test.go b/core/capabilities/remote/utils_test.go
index 6707e6ffb25..360ef9000ba 100644
--- a/core/capabilities/remote/utils_test.go
+++ b/core/capabilities/remote/utils_test.go
@@ -10,43 +10,39 @@ import (
ragetypes "github.com/smartcontractkit/libocr/ragep2p/types"
- commoncap "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
- "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
- "github.com/smartcontractkit/chainlink-common/pkg/values"
-
"github.com/smartcontractkit/chainlink/v2/core/capabilities/remote"
remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
)
const (
- capId1 = "cap1"
- capId2 = "cap2"
- donId1 = uint32(1)
+ capID1 = "cap1"
+ capID2 = "cap2"
+ donID1 = uint32(1)
payload1 = "hello world"
payload2 = "goodbye world"
)
func TestValidateMessage(t *testing.T) {
- privKey1, peerId1 := newKeyPair(t)
- _, peerId2 := newKeyPair(t)
+ privKey1, peerID1 := newKeyPair(t)
+ _, peerID2 := newKeyPair(t)
// valid
- p2pMsg := encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))
- body, err := remote.ValidateMessage(p2pMsg, peerId2)
+ p2pMsg := encodeAndSign(t, privKey1, peerID1, peerID2, capID1, donID1, []byte(payload1))
+ body, err := remote.ValidateMessage(p2pMsg, peerID2)
require.NoError(t, err)
- require.Equal(t, peerId1[:], body.Sender)
+ require.Equal(t, peerID1[:], body.Sender)
require.Equal(t, payload1, string(body.Payload))
// invalid sender
- p2pMsg = encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))
- p2pMsg.Sender = peerId2
- _, err = remote.ValidateMessage(p2pMsg, peerId2)
+ p2pMsg = encodeAndSign(t, privKey1, peerID1, peerID2, capID1, donID1, []byte(payload1))
+ p2pMsg.Sender = peerID2
+ _, err = remote.ValidateMessage(p2pMsg, peerID2)
require.Error(t, err)
// invalid receiver
- p2pMsg = encodeAndSign(t, privKey1, peerId1, peerId2, capId1, donId1, []byte(payload1))
- _, err = remote.ValidateMessage(p2pMsg, peerId1)
+ p2pMsg = encodeAndSign(t, privKey1, peerID1, peerID2, capID1, donID1, []byte(payload1))
+ _, err = remote.ValidateMessage(p2pMsg, peerID1)
require.Error(t, err)
}
@@ -58,12 +54,12 @@ func newKeyPair(t *testing.T) (ed25519.PrivateKey, ragetypes.PeerID) {
return privKey, peerID
}
-func encodeAndSign(t *testing.T, senderPrivKey ed25519.PrivateKey, senderId p2ptypes.PeerID, receiverId p2ptypes.PeerID, capabilityId string, donId uint32, payload []byte) p2ptypes.Message {
+func encodeAndSign(t *testing.T, senderPrivKey ed25519.PrivateKey, senderID p2ptypes.PeerID, receiverID p2ptypes.PeerID, capabilityID string, donID uint32, payload []byte) p2ptypes.Message {
body := remotetypes.MessageBody{
- Sender: senderId[:],
- Receiver: receiverId[:],
- CapabilityId: capabilityId,
- CapabilityDonId: donId,
+ Sender: senderID[:],
+ Receiver: receiverID[:],
+ CapabilityId: capabilityID,
+ CapabilityDonId: donID,
Payload: payload,
}
rawBody, err := proto.Marshal(&body)
@@ -78,7 +74,7 @@ func encodeAndSign(t *testing.T, senderPrivKey ed25519.PrivateKey, senderId p2pt
require.NoError(t, err)
return p2ptypes.Message{
- Sender: senderId,
+ Sender: senderID,
Payload: rawMsg,
}
}
@@ -89,41 +85,6 @@ func TestToPeerID(t *testing.T) {
require.Equal(t, "12D3KooWD8QYTQVYjB6oog4Ej8PcPpqTrPRnxLQap8yY8KUQRVvq", id.String())
}
-func TestDefaultModeAggregator_Aggregate(t *testing.T) {
- val, err := values.NewMap(triggerEvent1)
- require.NoError(t, err)
- capResponse1 := commoncap.TriggerResponse{
- Event: commoncap.TriggerEvent{
- Outputs: val,
- },
- Err: nil,
- }
- marshaled1, err := pb.MarshalTriggerResponse(capResponse1)
- require.NoError(t, err)
-
- val2, err := values.NewMap(triggerEvent2)
- require.NoError(t, err)
- capResponse2 := commoncap.TriggerResponse{
- Event: commoncap.TriggerEvent{
- Outputs: val2,
- },
- Err: nil,
- }
- marshaled2, err := pb.MarshalTriggerResponse(capResponse2)
- require.NoError(t, err)
-
- agg := remote.NewDefaultModeAggregator(2)
- _, err = agg.Aggregate("", [][]byte{marshaled1})
- require.Error(t, err)
-
- _, err = agg.Aggregate("", [][]byte{marshaled1, marshaled2})
- require.Error(t, err)
-
- res, err := agg.Aggregate("", [][]byte{marshaled1, marshaled2, marshaled1})
- require.NoError(t, err)
- require.Equal(t, res, capResponse1)
-}
-
func TestSanitizeLogString(t *testing.T) {
require.Equal(t, "hello", remote.SanitizeLogString("hello"))
require.Equal(t, "[UNPRINTABLE] 0a", remote.SanitizeLogString("\n"))
diff --git a/core/capabilities/webapi/outgoing_connector_handler.go b/core/capabilities/webapi/outgoing_connector_handler.go
index d18ee971d1a..a9ff9ee3aae 100644
--- a/core/capabilities/webapi/outgoing_connector_handler.go
+++ b/core/capabilities/webapi/outgoing_connector_handler.go
@@ -6,6 +6,7 @@ import (
"fmt"
"sort"
"sync"
+ "time"
"github.com/pkg/errors"
@@ -17,6 +18,10 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/handlers/common"
)
+const (
+ defaultFetchTimeoutMs = 20_000
+)
+
var _ connector.GatewayConnectorHandler = &OutgoingConnectorHandler{}
type OutgoingConnectorHandler struct {
@@ -51,8 +56,24 @@ func NewOutgoingConnectorHandler(gc connector.GatewayConnector, config ServiceCo
}
// HandleSingleNodeRequest sends a request to first available gateway node and blocks until response is received
-// TODO: handle retries and timeouts
-func (c *OutgoingConnectorHandler) HandleSingleNodeRequest(ctx context.Context, messageID string, payload []byte) (*api.Message, error) {
+// TODO: handle retries
+func (c *OutgoingConnectorHandler) HandleSingleNodeRequest(ctx context.Context, messageID string, req capabilities.Request) (*api.Message, error) {
+ // set default timeout if not provided for all outgoing requests
+ if req.TimeoutMs == 0 {
+ req.TimeoutMs = defaultFetchTimeoutMs
+ }
+
+ // Create a subcontext with the timeout plus some margin for the gateway to process the request
+ timeoutDuration := time.Duration(req.TimeoutMs) * time.Millisecond
+ margin := 100 * time.Millisecond
+ ctx, cancel := context.WithTimeout(ctx, timeoutDuration+margin)
+ defer cancel()
+
+ payload, err := json.Marshal(req)
+ if err != nil {
+ return nil, fmt.Errorf("failed to marshal fetch request: %w", err)
+ }
+
ch := make(chan *api.Message, 1)
c.responseChsMu.Lock()
c.responseChs[messageID] = ch
@@ -75,8 +96,15 @@ func (c *OutgoingConnectorHandler) HandleSingleNodeRequest(ctx context.Context,
}
sort.Strings(gatewayIDs)
- err := c.gc.SignAndSendToGateway(ctx, gatewayIDs[0], body)
- if err != nil {
+ selectedGateway := gatewayIDs[0]
+
+ l.Infow("selected gateway, awaiting connection", "gatewayID", selectedGateway)
+
+ if err := c.gc.AwaitConnection(ctx, selectedGateway); err != nil {
+ return nil, errors.Wrap(err, "await connection canceled")
+ }
+
+ if err := c.gc.SignAndSendToGateway(ctx, selectedGateway, body); err != nil {
return nil, errors.Wrap(err, "failed to send request to gateway")
}
diff --git a/core/capabilities/webapi/outgoing_connector_handler_test.go b/core/capabilities/webapi/outgoing_connector_handler_test.go
new file mode 100644
index 00000000000..4a8c425d4f1
--- /dev/null
+++ b/core/capabilities/webapi/outgoing_connector_handler_test.go
@@ -0,0 +1,135 @@
+package webapi
+
+import (
+ "context"
+ "encoding/json"
+ "testing"
+
+ "github.com/stretchr/testify/mock"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/utils/matches"
+
+ "github.com/smartcontractkit/chainlink/v2/core/services/gateway/api"
+ gcmocks "github.com/smartcontractkit/chainlink/v2/core/services/gateway/connector/mocks"
+ ghcapabilities "github.com/smartcontractkit/chainlink/v2/core/services/gateway/handlers/capabilities"
+ "github.com/smartcontractkit/chainlink/v2/core/services/gateway/handlers/common"
+)
+
+func TestHandleSingleNodeRequest(t *testing.T) {
+ t.Run("OK-timeout_is_not_specify_default_timeout_is_expected", func(t *testing.T) {
+ ctx := tests.Context(t)
+ log := logger.TestLogger(t)
+ connector := gcmocks.NewGatewayConnector(t)
+ var defaultConfig = ServiceConfig{
+ RateLimiter: common.RateLimiterConfig{
+ GlobalRPS: 100.0,
+ GlobalBurst: 100,
+ PerSenderRPS: 100.0,
+ PerSenderBurst: 100,
+ },
+ }
+ connectorHandler, err := NewOutgoingConnectorHandler(connector, defaultConfig, ghcapabilities.MethodComputeAction, log)
+ require.NoError(t, err)
+
+ msgID := "msgID"
+ testURL := "http://localhost:8080"
+ connector.EXPECT().DonID().Return("donID")
+ connector.EXPECT().AwaitConnection(matches.AnyContext, "gateway1").Return(nil)
+ connector.EXPECT().GatewayIDs().Return([]string{"gateway1"})
+
+ // build the expected body with the default timeout
+ req := ghcapabilities.Request{
+ URL: testURL,
+ TimeoutMs: defaultFetchTimeoutMs,
+ }
+ payload, err := json.Marshal(req)
+ require.NoError(t, err)
+
+ expectedBody := &api.MessageBody{
+ MessageId: msgID,
+ DonId: connector.DonID(),
+ Method: ghcapabilities.MethodComputeAction,
+ Payload: payload,
+ }
+
+ // expect the request body to contain the default timeout
+ connector.EXPECT().SignAndSendToGateway(mock.Anything, "gateway1", expectedBody).Run(func(ctx context.Context, gatewayID string, msg *api.MessageBody) {
+ connectorHandler.HandleGatewayMessage(ctx, "gateway1", gatewayResponse(t, msgID))
+ }).Return(nil).Times(1)
+
+ _, err = connectorHandler.HandleSingleNodeRequest(ctx, msgID, ghcapabilities.Request{
+ URL: testURL,
+ })
+ require.NoError(t, err)
+ })
+
+ t.Run("OK-timeout_is_specified", func(t *testing.T) {
+ ctx := tests.Context(t)
+ log := logger.TestLogger(t)
+ connector := gcmocks.NewGatewayConnector(t)
+ var defaultConfig = ServiceConfig{
+ RateLimiter: common.RateLimiterConfig{
+ GlobalRPS: 100.0,
+ GlobalBurst: 100,
+ PerSenderRPS: 100.0,
+ PerSenderBurst: 100,
+ },
+ }
+ connectorHandler, err := NewOutgoingConnectorHandler(connector, defaultConfig, ghcapabilities.MethodComputeAction, log)
+ require.NoError(t, err)
+
+ msgID := "msgID"
+ testURL := "http://localhost:8080"
+ connector.EXPECT().DonID().Return("donID")
+ connector.EXPECT().AwaitConnection(matches.AnyContext, "gateway1").Return(nil)
+ connector.EXPECT().GatewayIDs().Return([]string{"gateway1"})
+
+ // build the expected body with the defined timeout
+ req := ghcapabilities.Request{
+ URL: testURL,
+ TimeoutMs: 40000,
+ }
+ payload, err := json.Marshal(req)
+ require.NoError(t, err)
+
+ expectedBody := &api.MessageBody{
+ MessageId: msgID,
+ DonId: connector.DonID(),
+ Method: ghcapabilities.MethodComputeAction,
+ Payload: payload,
+ }
+
+ // expect the request body to contain the defined timeout
+ connector.EXPECT().SignAndSendToGateway(mock.Anything, "gateway1", expectedBody).Run(func(ctx context.Context, gatewayID string, msg *api.MessageBody) {
+ connectorHandler.HandleGatewayMessage(ctx, "gateway1", gatewayResponse(t, msgID))
+ }).Return(nil).Times(1)
+
+ _, err = connectorHandler.HandleSingleNodeRequest(ctx, msgID, ghcapabilities.Request{
+ URL: testURL,
+ TimeoutMs: 40000,
+ })
+ require.NoError(t, err)
+ })
+}
+
+func gatewayResponse(t *testing.T, msgID string) *api.Message {
+ headers := map[string]string{"Content-Type": "application/json"}
+ body := []byte("response body")
+ responsePayload, err := json.Marshal(ghcapabilities.Response{
+ StatusCode: 200,
+ Headers: headers,
+ Body: body,
+ ExecutionError: false,
+ })
+ require.NoError(t, err)
+ return &api.Message{
+ Body: api.MessageBody{
+ MessageId: msgID,
+ Method: ghcapabilities.MethodWebAPITarget,
+ Payload: responsePayload,
+ },
+ }
+}
diff --git a/core/capabilities/webapi/target/target.go b/core/capabilities/webapi/target/target.go
index b211e0fe837..4934ab382d5 100644
--- a/core/capabilities/webapi/target/target.go
+++ b/core/capabilities/webapi/target/target.go
@@ -135,18 +135,13 @@ func (c *Capability) Execute(ctx context.Context, req capabilities.CapabilityReq
return capabilities.CapabilityResponse{}, err
}
- payloadBytes, err := json.Marshal(payload)
- if err != nil {
- return capabilities.CapabilityResponse{}, err
- }
-
// Default to SingleNode delivery mode
deliveryMode := defaultIfNil(workflowCfg.DeliveryMode, webapi.SingleNode)
switch deliveryMode {
case webapi.SingleNode:
// blocking call to handle single node request. waits for response from gateway
- resp, err := c.connectorHandler.HandleSingleNodeRequest(ctx, messageID, payloadBytes)
+ resp, err := c.connectorHandler.HandleSingleNodeRequest(ctx, messageID, payload)
if err != nil {
return capabilities.CapabilityResponse{}, err
}
diff --git a/core/capabilities/webapi/target/target_test.go b/core/capabilities/webapi/target/target_test.go
index f51cdcd0d70..1af9a107054 100644
--- a/core/capabilities/webapi/target/target_test.go
+++ b/core/capabilities/webapi/target/target_test.go
@@ -194,7 +194,7 @@ func TestCapability_Execute(t *testing.T) {
require.NoError(t, err)
gatewayResp := gatewayResponse(t, msgID)
-
+ th.connector.EXPECT().AwaitConnection(mock.Anything, "gateway1").Return(nil)
th.connector.On("SignAndSendToGateway", mock.Anything, "gateway1", mock.Anything).Return(nil).Run(func(args mock.Arguments) {
th.connectorHandler.HandleGatewayMessage(ctx, "gateway1", gatewayResp)
}).Once()
diff --git a/core/chains/evm/client/errors.go b/core/chains/evm/client/errors.go
index 1075dc40606..bde97185580 100644
--- a/core/chains/evm/client/errors.go
+++ b/core/chains/evm/client/errors.go
@@ -64,6 +64,7 @@ const (
ServiceUnavailable
TerminallyStuck
TooManyResults
+ ServiceTimeout
)
type ClientErrors map[int]*regexp.Regexp
@@ -160,7 +161,8 @@ var arbitrum = ClientErrors{
Fatal: arbitrumFatal,
L2FeeTooLow: regexp.MustCompile(`(: |^)max fee per gas less than block base fee(:|$)`),
L2Full: regexp.MustCompile(`(: |^)(queue full|sequencer pending tx pool full, please try again)(:|$)`),
- ServiceUnavailable: regexp.MustCompile(`(: |^)502 Bad Gateway: [\s\S]*$|network is unreachable|i/o timeout`),
+ ServiceUnavailable: regexp.MustCompile(`(: |^)502 Bad Gateway: [\s\S]*$|network is unreachable|i/o timeout|(: |^)503 Service Temporarily Unavailable(:|$)`),
+ ServiceTimeout: regexp.MustCompile(`(: |^)408 Request Timeout(:|$)`),
}
// Treasure
@@ -398,6 +400,11 @@ func (s *SendError) IsServiceUnavailable(configErrors *ClientErrors) bool {
return s.is(ServiceUnavailable, configErrors) || pkgerrors.Is(s.err, commonclient.ErroringNodeError)
}
+// IsServiceTimeout indicates if the error was caused by a service timeout
+func (s *SendError) IsServiceTimeout(configErrors *ClientErrors) bool {
+ return s.is(ServiceTimeout, configErrors)
+}
+
// IsTerminallyStuck indicates if a transaction was stuck without any chance of inclusion
func (s *SendError) IsTerminallyStuckConfigError(configErrors *ClientErrors) bool {
return s.is(TerminallyStuck, configErrors)
@@ -619,6 +626,10 @@ func ClassifySendError(err error, clientErrors config.ClientErrors, lggr logger.
lggr.Errorw(fmt.Sprintf("service unavailable while sending transaction %x", tx.Hash()), "err", sendError, "etx", tx)
return commonclient.Retryable
}
+ if sendError.IsServiceTimeout(configErrors) {
+ lggr.Errorw(fmt.Sprintf("service timed out while sending transaction %x", tx.Hash()), "err", sendError, "etx", tx)
+ return commonclient.Retryable
+ }
if sendError.IsTimeout() {
lggr.Errorw(fmt.Sprintf("timeout while sending transaction %x", tx.Hash()), "err", sendError, "etx", tx)
return commonclient.Retryable
@@ -666,7 +677,7 @@ var drpc = ClientErrors{
// Linkpool, Blockdaemon, and Chainstack all return "request timed out" if the log results are too large for them to process
var defaultClient = ClientErrors{
- TooManyResults: regexp.MustCompile(`request timed out`),
+ TooManyResults: regexp.MustCompile(`request timed out|408 Request Timed Out`),
}
// JSON-RPC error codes which can indicate a refusal of the server to process an eth_getLogs request because the result set is too large
diff --git a/core/chains/evm/client/errors_test.go b/core/chains/evm/client/errors_test.go
index 75ac21597d8..1f9aaa53365 100644
--- a/core/chains/evm/client/errors_test.go
+++ b/core/chains/evm/client/errors_test.go
@@ -245,6 +245,7 @@ func Test_Eth_Errors(t *testing.T) {
{"network is unreachable", true, "Arbitrum"},
{"client error service unavailable", true, "tomlConfig"},
{"[Request ID: 825608a8-fd8a-4b5b-aea7-92999509306d] Error invoking RPC: [Request ID: 825608a8-fd8a-4b5b-aea7-92999509306d] Transaction execution returns a null value for transaction", true, "hedera"},
+ {"call failed: 503 Service Temporarily Unavailable: \r\n503 Service Temporarily Unavailable\r\n\r\n503 Service Temporarily Unavailable
\r\n\r\n\r\n", true, "Arbitrum"},
}
for _, test := range tests {
err = evmclient.NewSendErrorS(test.message)
@@ -260,6 +261,20 @@ func Test_Eth_Errors(t *testing.T) {
}
})
+ t.Run("IsServiceTimeout", func(t *testing.T) {
+ tests := []errorCase{
+ {"call failed: 408 Request Timeout: {", true, "Arbitrum"},
+ {"408 Request Timeout: {\"id\":303,\"jsonrpc\":\"2.0\",\"error\":{\"code\\\":-32009,\\\"message\\\":\\\"request timeout\\\"}}\",\"errVerbose\":\"408 Request Timeout:\n", true, "Arbitrum"},
+ {"request timeout", false, "tomlConfig"},
+ }
+ for _, test := range tests {
+ err = evmclient.NewSendErrorS(test.message)
+ assert.Equal(t, err.IsServiceTimeout(clientErrors), test.expect)
+ err = newSendErrorWrapped(test.message)
+ assert.Equal(t, err.IsServiceTimeout(clientErrors), test.expect)
+ }
+ })
+
t.Run("IsTxFeeExceedsCap", func(t *testing.T) {
tests := []errorCase{
{"tx fee (1.10 ether) exceeds the configured cap (1.00 ether)", true, "geth"},
diff --git a/core/chains/evm/client/rpc_client_test.go b/core/chains/evm/client/rpc_client_test.go
index 109a49d6e2f..d5286e9acf0 100644
--- a/core/chains/evm/client/rpc_client_test.go
+++ b/core/chains/evm/client/rpc_client_test.go
@@ -8,6 +8,7 @@ import (
"math/big"
"net/url"
"sync"
+ "sync/atomic"
"testing"
"time"
@@ -400,7 +401,7 @@ func TestRPCClient_LatestFinalizedBlock(t *testing.T) {
lggr := logger.Test(t)
type rpcServer struct {
- Head *evmtypes.Head
+ Head atomic.Pointer[evmtypes.Head]
URL *url.URL
}
createRPCServer := func() *rpcServer {
@@ -408,7 +409,7 @@ func TestRPCClient_LatestFinalizedBlock(t *testing.T) {
server.URL = testutils.NewWSServer(t, chainId, func(method string, params gjson.Result) (resp testutils.JSONRPCResponse) {
assert.Equal(t, "eth_getBlockByNumber", method)
if assert.True(t, params.IsArray()) && assert.Equal(t, "finalized", params.Array()[0].String()) {
- head := server.Head
+ head := server.Head.Load()
jsonHead, err := json.Marshal(head)
if err != nil {
panic(fmt.Errorf("failed to marshal head: %w", err))
@@ -426,7 +427,7 @@ func TestRPCClient_LatestFinalizedBlock(t *testing.T) {
rpc := client.NewRPCClient(nodePoolCfg, lggr, server.URL, nil, "rpc", 1, chainId, commonclient.Primary, commonclient.QueryTimeout, commonclient.QueryTimeout, "")
require.NoError(t, rpc.Dial(ctx))
defer rpc.Close()
- server.Head = &evmtypes.Head{Number: 128}
+ server.Head.Store(&evmtypes.Head{Number: 128})
// updates chain info
_, err := rpc.LatestFinalizedBlock(ctx)
require.NoError(t, err)
@@ -439,7 +440,7 @@ func TestRPCClient_LatestFinalizedBlock(t *testing.T) {
assert.Equal(t, int64(128), latest.FinalizedBlockNumber)
// lower block number does not update highestUserObservations
- server.Head = &evmtypes.Head{Number: 127}
+ server.Head.Store(&evmtypes.Head{Number: 127})
_, err = rpc.LatestFinalizedBlock(ctx)
require.NoError(t, err)
latest, highestUserObservations = rpc.GetInterceptedChainInfo()
@@ -451,7 +452,7 @@ func TestRPCClient_LatestFinalizedBlock(t *testing.T) {
assert.Equal(t, int64(127), latest.FinalizedBlockNumber)
// health check flg prevents change in highestUserObservations
- server.Head = &evmtypes.Head{Number: 256}
+ server.Head.Store(&evmtypes.Head{Number: 256})
_, err = rpc.LatestFinalizedBlock(commonclient.CtxAddHealthCheckFlag(ctx))
require.NoError(t, err)
latest, highestUserObservations = rpc.GetInterceptedChainInfo()
@@ -463,7 +464,7 @@ func TestRPCClient_LatestFinalizedBlock(t *testing.T) {
assert.Equal(t, int64(256), latest.FinalizedBlockNumber)
// subscription updates chain info
- server.Head = &evmtypes.Head{Number: 512}
+ server.Head.Store(&evmtypes.Head{Number: 512})
ch, sub, err := rpc.SubscribeToFinalizedHeads(ctx)
require.NoError(t, err)
defer sub.Unsubscribe()
@@ -479,7 +480,7 @@ func TestRPCClient_LatestFinalizedBlock(t *testing.T) {
// health check subscription only updates latest
sub.Unsubscribe() // close previous one
- server.Head = &evmtypes.Head{Number: 1024}
+ server.Head.Store(&evmtypes.Head{Number: 1024})
ch, sub, err = rpc.SubscribeToFinalizedHeads(commonclient.CtxAddHealthCheckFlag(ctx))
require.NoError(t, err)
defer sub.Unsubscribe()
diff --git a/core/chains/evm/client/simulated_backend_client.go b/core/chains/evm/client/simulated_backend_client.go
index a67670df318..fd645203856 100644
--- a/core/chains/evm/client/simulated_backend_client.go
+++ b/core/chains/evm/client/simulated_backend_client.go
@@ -363,7 +363,7 @@ func (c *SimulatedBackendClient) SubscribeToHeads(
}
head = &evmtypes.Head{
Difficulty: h.Difficulty,
- Timestamp: time.Unix(int64(h.Time), 0), //nolint:gosec // G115 false positive
+ Timestamp: time.Unix(int64(h.Time), 0),
Number: h.Number.Int64(),
Hash: h.Hash(),
ParentHash: h.ParentHash,
diff --git a/core/chains/evm/config/chain_scoped_transactions.go b/core/chains/evm/config/chain_scoped_transactions.go
index 27edb12648a..8cddce20e65 100644
--- a/core/chains/evm/config/chain_scoped_transactions.go
+++ b/core/chains/evm/config/chain_scoped_transactions.go
@@ -11,6 +11,10 @@ type transactionsConfig struct {
c toml.Transactions
}
+func (t *transactionsConfig) Enabled() bool {
+ return *t.c.Enabled
+}
+
func (t *transactionsConfig) ForwardersEnabled() bool {
return *t.c.ForwardersEnabled
}
diff --git a/core/chains/evm/config/config.go b/core/chains/evm/config/config.go
index f2a571f94b0..fbaf1ff6dda 100644
--- a/core/chains/evm/config/config.go
+++ b/core/chains/evm/config/config.go
@@ -103,6 +103,7 @@ type ClientErrors interface {
}
type Transactions interface {
+ Enabled() bool
ForwardersEnabled() bool
ReaperInterval() time.Duration
ResendAfterThreshold() time.Duration
diff --git a/core/chains/evm/config/config_test.go b/core/chains/evm/config/config_test.go
index 7eb13458f56..ab0d600efe0 100644
--- a/core/chains/evm/config/config_test.go
+++ b/core/chains/evm/config/config_test.go
@@ -219,9 +219,20 @@ func TestChainScopedConfig(t *testing.T) {
assert.Equal(t, false, cfg3.EVM().LogBroadcasterEnabled())
})
+ })
+
+ t.Run("EVM.Transactions.Enabled", func(t *testing.T) {
+ t.Run("turn on EVM.Transactions.Enabled by default", func(t *testing.T) {
+ assert.True(t, cfg.EVM().Transactions().Enabled())
+ })
- t.Run("use Noop logBroadcaster when LogBroadcaster is disabled", func(t *testing.T) {
+ t.Run("verify EVM.Transactions.Enabled is set correctly", func(t *testing.T) {
+ val := false
+ cfg3 := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) {
+ c.Transactions.Enabled = ptr(val)
+ })
+ assert.False(t, cfg3.EVM().Transactions().Enabled())
})
})
}
diff --git a/core/chains/evm/config/toml/config.go b/core/chains/evm/config/toml/config.go
index 0505449943e..807e1141791 100644
--- a/core/chains/evm/config/toml/config.go
+++ b/core/chains/evm/config/toml/config.go
@@ -472,6 +472,7 @@ func (c *Chain) ValidateConfig() (err error) {
}
type Transactions struct {
+ Enabled *bool
ForwardersEnabled *bool
MaxInFlight *uint32
MaxQueued *uint32
@@ -483,6 +484,9 @@ type Transactions struct {
}
func (t *Transactions) setFrom(f *Transactions) {
+ if v := f.Enabled; v != nil {
+ t.Enabled = v
+ }
if v := f.ForwardersEnabled; v != nil {
t.ForwardersEnabled = v
}
diff --git a/core/chains/evm/config/toml/defaults.go b/core/chains/evm/config/toml/defaults.go
index 0885d94e6df..6f03575056b 100644
--- a/core/chains/evm/config/toml/defaults.go
+++ b/core/chains/evm/config/toml/defaults.go
@@ -236,7 +236,6 @@ func (c *Chain) SetFrom(f *Chain) {
if v := f.FinalizedBlockOffset; v != nil {
c.FinalizedBlockOffset = v
}
-
if v := f.NoNewFinalizedHeadsThreshold; v != nil {
c.NoNewFinalizedHeadsThreshold = v
}
diff --git a/core/chains/evm/config/toml/defaults/Avalanche_Fuji.toml b/core/chains/evm/config/toml/defaults/Avalanche_Fuji.toml
index fbcc8e6f058..2fd63004531 100644
--- a/core/chains/evm/config/toml/defaults/Avalanche_Fuji.toml
+++ b/core/chains/evm/config/toml/defaults/Avalanche_Fuji.toml
@@ -11,9 +11,8 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '1m'
[GasEstimator]
-PriceDefault = '25 gwei'
-PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '25 gwei'
+PriceMin = '1 gwei'
+PriceDefault = '1 gwei'
[GasEstimator.BlockHistory]
BlockHistorySize = 24
diff --git a/core/chains/evm/config/toml/defaults/Avalanche_Mainnet.toml b/core/chains/evm/config/toml/defaults/Avalanche_Mainnet.toml
index 309fdab1db9..9a8f32d3288 100644
--- a/core/chains/evm/config/toml/defaults/Avalanche_Mainnet.toml
+++ b/core/chains/evm/config/toml/defaults/Avalanche_Mainnet.toml
@@ -11,9 +11,8 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '1m'
[GasEstimator]
-PriceDefault = '25 gwei'
-PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '25 gwei'
+PriceMin = '1 gwei'
+PriceDefault = '1 gwei'
[GasEstimator.BlockHistory]
# Average block time of 2s
diff --git a/core/chains/evm/config/toml/defaults/Sonic_Mainnet.toml b/core/chains/evm/config/toml/defaults/Sonic_Mainnet.toml
new file mode 100644
index 00000000000..2483c736830
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/Sonic_Mainnet.toml
@@ -0,0 +1,28 @@
+ChainId = '146'
+FinalityDepth = 10
+FinalityTagEnabled = false
+LogPollInterval = "1s" #1s block rate
+MinIncomingConfirmations = 5
+RPCBlockQueryDelay = 10
+RPCDefaultBatchSize = 100
+
+[GasEstimator]
+Mode = 'FeeHistory'
+EIP1559DynamicFees = true
+BumpPercent = 10
+LimitDefault = 8000000 # default ccip value
+
+[GasEstimator.FeeHistory]
+CacheTimeout = '2s'
+
+[GasEstimator.BlockHistory]
+BlockHistorySize = 100
+
+[HeadTracker]
+HistoryDepth = 50
+
+[NodePool]
+SyncThreshold = 10
+
+[Transactions]
+MaxQueued = 500
diff --git a/core/chains/evm/config/toml/defaults/Sonic_testnet.toml b/core/chains/evm/config/toml/defaults/Sonic_testnet.toml
new file mode 100644
index 00000000000..83cd6c018a1
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/Sonic_testnet.toml
@@ -0,0 +1,28 @@
+ChainId = '57054'
+FinalityDepth = 10
+FinalityTagEnabled = false
+LogPollInterval = "1s" #1s block rate
+MinIncomingConfirmations = 5
+RPCBlockQueryDelay = 10
+RPCDefaultBatchSize = 100
+
+[GasEstimator]
+Mode = 'FeeHistory'
+EIP1559DynamicFees = true
+BumpPercent = 10
+LimitDefault = 8000000 # default ccip value
+
+[GasEstimator.FeeHistory]
+CacheTimeout = '2s'
+
+[GasEstimator.BlockHistory]
+BlockHistorySize = 100
+
+[HeadTracker]
+HistoryDepth = 50
+
+[NodePool]
+SyncThreshold = 10
+
+[Transactions]
+MaxQueued = 500
diff --git a/core/chains/evm/config/toml/defaults/fallback.toml b/core/chains/evm/config/toml/defaults/fallback.toml
index ab349ee4688..d2a6f0e4a2d 100644
--- a/core/chains/evm/config/toml/defaults/fallback.toml
+++ b/core/chains/evm/config/toml/defaults/fallback.toml
@@ -19,6 +19,7 @@ NoNewFinalizedHeadsThreshold = '0'
LogBroadcasterEnabled = true
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
diff --git a/core/chains/evm/gas/models.go b/core/chains/evm/gas/models.go
index 6cb89818c8f..2d6fe971d9c 100644
--- a/core/chains/evm/gas/models.go
+++ b/core/chains/evm/gas/models.go
@@ -9,6 +9,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/rpc"
pkgerrors "github.com/pkg/errors"
+
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink-common/pkg/services"
bigmath "github.com/smartcontractkit/chainlink-common/pkg/utils/big_math"
diff --git a/core/chains/evm/gas/rollups/l1_oracle.go b/core/chains/evm/gas/rollups/l1_oracle.go
index ceecb80c608..d9f12dfa79e 100644
--- a/core/chains/evm/gas/rollups/l1_oracle.go
+++ b/core/chains/evm/gas/rollups/l1_oracle.go
@@ -10,6 +10,7 @@ import (
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/rpc"
+
"github.com/smartcontractkit/chainlink-common/pkg/services"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
diff --git a/core/chains/evm/logpoller/log_poller.go b/core/chains/evm/logpoller/log_poller.go
index 6ef4fefecee..725fdbda63c 100644
--- a/core/chains/evm/logpoller/log_poller.go
+++ b/core/chains/evm/logpoller/log_poller.go
@@ -23,6 +23,8 @@ import (
pkgerrors "github.com/pkg/errors"
"golang.org/x/exp/maps"
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink-common/pkg/services"
"github.com/smartcontractkit/chainlink-common/pkg/timeutil"
@@ -91,6 +93,7 @@ type Client interface {
}
type HeadTracker interface {
+ services.Service
LatestAndFinalizedBlock(ctx context.Context) (latest, finalized *evmtypes.Head, err error)
}
@@ -99,7 +102,6 @@ var (
ErrReplayRequestAborted = pkgerrors.New("aborted, replay request cancelled")
ErrReplayInProgress = pkgerrors.New("replay request cancelled, but replay is already in progress")
ErrLogPollerShutdown = pkgerrors.New("replay aborted due to log poller shutdown")
- ErrFinalityViolated = pkgerrors.New("finality violated")
)
type logPoller struct {
@@ -525,7 +527,7 @@ func (lp *logPoller) Close() error {
func (lp *logPoller) Healthy() error {
if lp.finalityViolated.Load() {
- return ErrFinalityViolated
+ return commontypes.ErrFinalityViolated
}
return nil
}
diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go
index 7114960efdd..df688cd5e5c 100644
--- a/core/chains/evm/logpoller/log_poller_test.go
+++ b/core/chains/evm/logpoller/log_poller_test.go
@@ -22,10 +22,13 @@ import (
"github.com/stretchr/testify/require"
"go.uber.org/zap/zapcore"
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink-common/pkg/types/query"
"github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
commonutils "github.com/smartcontractkit/chainlink-common/pkg/utils"
+
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/chaintype"
htMocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks"
@@ -1106,7 +1109,8 @@ func TestLogPoller_ReorgDeeperThanFinality(t *testing.T) {
secondPoll := th.PollAndSaveLogs(testutils.Context(t), firstPoll)
assert.Equal(t, firstPoll, secondPoll)
- assert.Equal(t, logpoller.ErrFinalityViolated, th.LogPoller.Healthy())
+ require.Equal(t, commontypes.ErrFinalityViolated, th.LogPoller.Healthy())
+ require.Equal(t, commontypes.ErrFinalityViolated, th.LogPoller.HealthReport()[th.LogPoller.Name()])
// Manually remove re-org'd chain from the log poller to bring it back to life
// LogPoller should be healthy again after first poll
@@ -1116,7 +1120,8 @@ func TestLogPoller_ReorgDeeperThanFinality(t *testing.T) {
// Poll from latest
recoveryPoll := th.PollAndSaveLogs(testutils.Context(t), 1)
assert.Equal(t, int64(35), recoveryPoll)
- assert.NoError(t, th.LogPoller.Healthy())
+ require.NoError(t, th.LogPoller.Healthy())
+ require.NoError(t, th.LogPoller.HealthReport()[th.LogPoller.Name()])
})
}
}
diff --git a/core/chains/legacyevm/chain.go b/core/chains/legacyevm/chain.go
index d8eed88dedf..3e6aeef911c 100644
--- a/core/chains/legacyevm/chain.go
+++ b/core/chains/legacyevm/chain.go
@@ -194,10 +194,10 @@ func newChain(ctx context.Context, cfg *evmconfig.ChainScoped, nodes []*toml.Nod
chainID := cfg.EVM().ChainID()
l := opts.Logger
var client evmclient.Client
+ var err error
if !opts.AppConfig.EVMRPCEnabled() {
client = evmclient.NewNullClient(chainID, l)
} else if opts.GenEthClient == nil {
- var err error
client, err = evmclient.NewEvmClient(cfg.EVM().NodePool(), cfg.EVM(), cfg.EVM().NodePool().Errors(), l, chainID, nodes, cfg.EVM().ChainType())
if err != nil {
return nil, err
@@ -244,10 +244,24 @@ func newChain(ctx context.Context, cfg *evmconfig.ChainScoped, nodes []*toml.Nod
}
}
- // note: gas estimator is started as a part of the txm
- txm, gasEstimator, err := newEvmTxm(opts.DS, cfg.EVM(), opts.AppConfig.EVMRPCEnabled(), opts.AppConfig.Database(), opts.AppConfig.Database().Listener(), client, l, logPoller, opts, headTracker, clientsByChainID)
+ // initialize gas estimator
+ gasEstimator, err := newGasEstimator(cfg.EVM(), client, l, opts, clientsByChainID)
if err != nil {
- return nil, fmt.Errorf("failed to instantiate EvmTxm for chain with ID %s: %w", chainID.String(), err)
+ return nil, fmt.Errorf("failed to instantiate gas estimator for chain with ID %s: %w", chainID, err)
+ }
+
+ // note: gas estimator is started as a part of the txm
+ var txm txmgr.TxManager
+ //nolint:gocritic // ignoring suggestion to convert to switch statement
+ if !opts.AppConfig.EVMRPCEnabled() {
+ txm = &txmgr.NullTxManager{ErrMsg: fmt.Sprintf("Ethereum is disabled for chain %d", chainID)}
+ } else if !cfg.EVM().Transactions().Enabled() {
+ txm = &txmgr.NullTxManager{ErrMsg: fmt.Sprintf("TXM disabled for chain %d", chainID)}
+ } else {
+ txm, err = newEvmTxm(opts.DS, cfg.EVM(), opts.AppConfig.Database(), opts.AppConfig.Database().Listener(), client, l, logPoller, opts, headTracker, gasEstimator)
+ if err != nil {
+ return nil, fmt.Errorf("failed to instantiate EvmTxm for chain with ID %s: %w", chainID, err)
+ }
}
headBroadcaster.Subscribe(txm)
diff --git a/core/chains/legacyevm/evm_txm.go b/core/chains/legacyevm/evm_txm.go
index 3a96a9da937..17dbce79e84 100644
--- a/core/chains/legacyevm/evm_txm.go
+++ b/core/chains/legacyevm/evm_txm.go
@@ -17,7 +17,6 @@ import (
func newEvmTxm(
ds sqlutil.DataSource,
cfg evmconfig.EVM,
- evmRPCEnabled bool,
databaseConfig txmgr.DatabaseConfig,
listenerConfig txmgr.ListenerConfig,
client evmclient.Client,
@@ -25,16 +24,11 @@ func newEvmTxm(
logPoller logpoller.LogPoller,
opts ChainRelayOpts,
headTracker httypes.HeadTracker,
- clientsByChainID map[string]rollups.DAClient,
-) (txm txmgr.TxManager,
estimator gas.EvmFeeEstimator,
+) (txm txmgr.TxManager,
err error,
) {
chainID := cfg.ChainID()
- if !evmRPCEnabled {
- txm = &txmgr.NullTxManager{ErrMsg: fmt.Sprintf("Ethereum is disabled for chain %d", chainID)}
- return txm, nil, nil
- }
lggr = lggr.Named("Txm")
lggr.Infow("Initializing EVM transaction manager",
@@ -45,15 +39,6 @@ func newEvmTxm(
"limitDefault", cfg.GasEstimator().LimitDefault(),
)
- // build estimator from factory
- if opts.GenGasEstimator == nil {
- if estimator, err = gas.NewEstimator(lggr, client, cfg.ChainType(), chainID, cfg.GasEstimator(), clientsByChainID); err != nil {
- return nil, nil, fmt.Errorf("failed to initialize estimator: %w", err)
- }
- } else {
- estimator = opts.GenGasEstimator(chainID)
- }
-
if opts.GenTxManager == nil {
txm, err = txmgr.NewTxm(
ds,
@@ -74,3 +59,23 @@ func newEvmTxm(
}
return
}
+
+func newGasEstimator(
+ cfg evmconfig.EVM,
+ client evmclient.Client,
+ lggr logger.Logger,
+ opts ChainRelayOpts,
+ clientsByChainID map[string]rollups.DAClient,
+) (estimator gas.EvmFeeEstimator, err error) {
+ lggr = lggr.Named("Txm")
+ chainID := cfg.ChainID()
+ // build estimator from factory
+ if opts.GenGasEstimator == nil {
+ if estimator, err = gas.NewEstimator(lggr, client, cfg.ChainType(), chainID, cfg.GasEstimator(), clientsByChainID); err != nil {
+ return nil, fmt.Errorf("failed to initialize estimator: %w", err)
+ }
+ } else {
+ estimator = opts.GenGasEstimator(chainID)
+ }
+ return
+}
diff --git a/core/cmd/app.go b/core/cmd/app.go
index ad944f0d0a6..8128d578238 100644
--- a/core/cmd/app.go
+++ b/core/cmd/app.go
@@ -290,25 +290,14 @@ func NewApp(s *Shell) *cli.App {
},
},
{
- Name: "chains",
- Usage: "Commands for handling chain configuration",
- Subcommands: cli.Commands{
- chainCommand("EVM", EVMChainClient(s), cli.Int64Flag{Name: "id", Usage: "chain ID"}),
- chainCommand("Cosmos", CosmosChainClient(s), cli.StringFlag{Name: "id", Usage: "chain ID"}),
- chainCommand("Solana", SolanaChainClient(s),
- cli.StringFlag{Name: "id", Usage: "chain ID, options: [mainnet, testnet, devnet, localnet]"}),
- chainCommand("StarkNet", StarkNetChainClient(s), cli.StringFlag{Name: "id", Usage: "chain ID"}),
- },
+ Name: "chains",
+ Usage: "Commands for handling chain configuration",
+ Subcommands: initChainSubCmds(s),
},
{
- Name: "nodes",
- Usage: "Commands for handling node configuration",
- Subcommands: cli.Commands{
- initEVMNodeSubCmd(s),
- initCosmosNodeSubCmd(s),
- initSolanaNodeSubCmd(s),
- initStarkNetNodeSubCmd(s),
- },
+ Name: "nodes",
+ Usage: "Commands for handling node configuration",
+ Subcommands: initNodeSubCmds(s),
},
{
Name: "forwarders",
diff --git a/core/cmd/chains_commands.go b/core/cmd/chains_commands.go
index 6edb5afc5ba..ffbff8ffdd3 100644
--- a/core/cmd/chains_commands.go
+++ b/core/cmd/chains_commands.go
@@ -2,9 +2,15 @@ package cmd
import (
"fmt"
+ "maps"
+ "slices"
+ "strconv"
"strings"
"github.com/urfave/cli"
+
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay"
+ "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
)
var chainHeaders = []string{"ID", "Enabled", "Config"}
@@ -39,12 +45,12 @@ type chainClient[P TableRenderer] struct {
path string
}
-// newChainClient returns a new ChainClient for a particular type of chains.Config.
+// NewChainClient returns a new ChainClient for a particular type of chains.Config.
// P is a TableRenderer corresponding to R, and P2 is the slice variant (type P2 []P).
-func newChainClient[P TableRenderer](s *Shell, name string) ChainClient {
- return &chainClient[P]{
+func NewChainClient(s *Shell, network string) ChainClient {
+ return &chainClient[ChainPresenters]{
Shell: s,
- path: "/v2/chains/" + name,
+ path: "/v2/chains/" + network,
}
}
@@ -53,3 +59,51 @@ func (cli *chainClient[P]) IndexChains(c *cli.Context) (err error) {
var p P
return cli.getPage(cli.path, c.Int("page"), &p)
}
+
+// ChainPresenter implements TableRenderer for a ChainResource
+type ChainPresenter struct {
+ presenters.ChainResource
+}
+
+// ToRow presents the ChainResource as a slice of strings.
+func (p *ChainPresenter) ToRow() []string {
+ return []string{p.GetID(), strconv.FormatBool(p.Enabled), p.Config}
+}
+
+// RenderTable implements TableRenderer
+// Just renders a single row
+func (p ChainPresenter) RenderTable(rt RendererTable) error {
+ rows := [][]string{}
+ rows = append(rows, p.ToRow())
+
+ renderList(chainHeaders, rows, rt.Writer)
+
+ return nil
+}
+
+// ChainPresenters implements TableRenderer for a slice of ChainPresenters.
+type ChainPresenters []ChainPresenter
+
+// RenderTable implements TableRenderer
+func (ps ChainPresenters) RenderTable(rt RendererTable) error {
+ rows := [][]string{}
+
+ for _, p := range ps {
+ rows = append(rows, p.ToRow())
+ }
+
+ renderList(chainHeaders, rows, rt.Writer)
+
+ return nil
+}
+
+func initChainSubCmds(s *Shell) []cli.Command {
+ cmds := []cli.Command{}
+ for _, network := range slices.Sorted(maps.Keys(relay.SupportedNetworks)) {
+ if network == relay.NetworkDummy {
+ continue
+ }
+ cmds = append(cmds, chainCommand(network, NewChainClient(s, network), cli.StringFlag{Name: "id", Usage: "chain ID"}))
+ }
+ return cmds
+}
diff --git a/core/cmd/chains_commands_test.go b/core/cmd/chains_commands_test.go
new file mode 100644
index 00000000000..d2c8a2e4744
--- /dev/null
+++ b/core/cmd/chains_commands_test.go
@@ -0,0 +1,81 @@
+package cmd_test
+
+import (
+ "strconv"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config"
+ solcfg "github.com/smartcontractkit/chainlink-solana/pkg/solana/config"
+
+ client2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
+ "github.com/smartcontractkit/chainlink/v2/core/cmd"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/cosmostest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/solanatest"
+ "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+)
+
+func TestShell_IndexCosmosChains(t *testing.T) {
+ t.Parallel()
+
+ chainID := cosmostest.RandomChainID()
+ chain := coscfg.TOMLConfig{
+ ChainID: ptr(chainID),
+ Enabled: ptr(true),
+ }
+ app := cosmosStartNewApplication(t, &chain)
+ client, r := app.NewShellAndRenderer()
+
+ require.NoError(t, cmd.NewChainClient(client, "cosmos").IndexChains(cltest.EmptyCLIContext()))
+ chains := *r.Renders[0].(*cmd.ChainPresenters)
+ require.Len(t, chains, 1)
+ c := chains[0]
+ assert.Equal(t, chainID, c.ID)
+ assertTableRenders(t, r)
+}
+
+func newRandChainID() *big.Big {
+ return big.New(testutils.NewRandomEVMChainID())
+}
+
+func TestShell_IndexEVMChains(t *testing.T) {
+ t.Parallel()
+
+ app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.EVM[0].Enabled = ptr(true)
+ c.EVM[0].NonceAutoSync = ptr(false)
+ c.EVM[0].BalanceMonitor.Enabled = ptr(false)
+ })
+ client, r := app.NewShellAndRenderer()
+
+ require.NoError(t, cmd.NewChainClient(client, "evm").IndexChains(cltest.EmptyCLIContext()))
+ chains := *r.Renders[0].(*cmd.ChainPresenters)
+ require.Len(t, chains, 1)
+ c := chains[0]
+ assert.Equal(t, strconv.Itoa(client2.NullClientChainID), c.ID)
+ assertTableRenders(t, r)
+}
+
+func TestShell_IndexSolanaChains(t *testing.T) {
+ t.Parallel()
+
+ id := solanatest.RandomChainID()
+ cfg := solcfg.TOMLConfig{
+ ChainID: &id,
+ Enabled: ptr(true),
+ }
+ app := solanaStartNewApplication(t, &cfg)
+ client, r := app.NewShellAndRenderer()
+
+ require.NoError(t, cmd.NewChainClient(client, "solana").IndexChains(cltest.EmptyCLIContext()))
+ chains := *r.Renders[0].(*cmd.ChainPresenters)
+ require.Len(t, chains, 1)
+ c := chains[0]
+ assert.Equal(t, id, c.ID)
+ assertTableRenders(t, r)
+}
diff --git a/core/cmd/cosmos_chains_commands.go b/core/cmd/cosmos_chains_commands.go
deleted file mode 100644
index d58b1baa159..00000000000
--- a/core/cmd/cosmos_chains_commands.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package cmd
-
-import (
- "strconv"
-
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// CosmosChainPresenter implements TableRenderer for a CosmosChainResource
-type CosmosChainPresenter struct {
- presenters.CosmosChainResource
-}
-
-// ToRow presents the CosmosChainResource as a slice of strings.
-func (p *CosmosChainPresenter) ToRow() []string {
- return []string{p.GetID(), strconv.FormatBool(p.Enabled), p.Config}
-}
-
-// RenderTable implements TableRenderer
-// Just renders a single row
-func (p CosmosChainPresenter) RenderTable(rt RendererTable) error {
- rows := [][]string{}
- rows = append(rows, p.ToRow())
-
- renderList(chainHeaders, rows, rt.Writer)
-
- return nil
-}
-
-// CosmosChainPresenters implements TableRenderer for a slice of CosmosChainPresenters.
-type CosmosChainPresenters []CosmosChainPresenter
-
-// RenderTable implements TableRenderer
-func (ps CosmosChainPresenters) RenderTable(rt RendererTable) error {
- rows := [][]string{}
-
- for _, p := range ps {
- rows = append(rows, p.ToRow())
- }
-
- renderList(chainHeaders, rows, rt.Writer)
-
- return nil
-}
-
-func CosmosChainClient(s *Shell) ChainClient {
- return newChainClient[CosmosChainPresenters](s, "cosmos")
-}
diff --git a/core/cmd/cosmos_chains_commands_test.go b/core/cmd/cosmos_chains_commands_test.go
deleted file mode 100644
index a0d2052d836..00000000000
--- a/core/cmd/cosmos_chains_commands_test.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package cmd_test
-
-import (
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config"
-
- "github.com/smartcontractkit/chainlink/v2/core/cmd"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/cosmostest"
-)
-
-func TestShell_IndexCosmosChains(t *testing.T) {
- t.Parallel()
-
- chainID := cosmostest.RandomChainID()
- chain := coscfg.TOMLConfig{
- ChainID: ptr(chainID),
- Enabled: ptr(true),
- }
- app := cosmosStartNewApplication(t, &chain)
- client, r := app.NewShellAndRenderer()
-
- require.Nil(t, cmd.CosmosChainClient(client).IndexChains(cltest.EmptyCLIContext()))
- chains := *r.Renders[0].(*cmd.CosmosChainPresenters)
- require.Len(t, chains, 1)
- c := chains[0]
- assert.Equal(t, chainID, c.ID)
- assertTableRenders(t, r)
-}
diff --git a/core/cmd/cosmos_node_commands.go b/core/cmd/cosmos_node_commands.go
deleted file mode 100644
index 760691d9379..00000000000
--- a/core/cmd/cosmos_node_commands.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package cmd
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// CosmosNodePresenter implements TableRenderer for a CosmosNodeResource.
-type CosmosNodePresenter struct {
- presenters.CosmosNodeResource
-}
-
-// ToRow presents the CosmosNodeResource as a slice of strings.
-func (p *CosmosNodePresenter) ToRow() []string {
- return []string{p.Name, p.ChainID, p.State, p.Config}
-}
-
-// RenderTable implements TableRenderer
-func (p CosmosNodePresenter) RenderTable(rt RendererTable) error {
- var rows [][]string
- rows = append(rows, p.ToRow())
- renderList(nodeHeaders, rows, rt.Writer)
-
- return nil
-}
-
-// CosmosNodePresenters implements TableRenderer for a slice of CosmosNodePresenter.
-type CosmosNodePresenters []CosmosNodePresenter
-
-// RenderTable implements TableRenderer
-func (ps CosmosNodePresenters) RenderTable(rt RendererTable) error {
- var rows [][]string
-
- for _, p := range ps {
- rows = append(rows, p.ToRow())
- }
-
- renderList(nodeHeaders, rows, rt.Writer)
-
- return nil
-}
-
-func NewCosmosNodeClient(s *Shell) NodeClient {
- return newNodeClient[CosmosNodePresenters](s, "cosmos")
-}
diff --git a/core/cmd/cosmos_node_commands_test.go b/core/cmd/cosmos_node_commands_test.go
deleted file mode 100644
index f6fa367440c..00000000000
--- a/core/cmd/cosmos_node_commands_test.go
+++ /dev/null
@@ -1,71 +0,0 @@
-package cmd_test
-
-import (
- "bytes"
- "strings"
- "testing"
-
- "github.com/pelletier/go-toml/v2"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- "github.com/smartcontractkit/chainlink-common/pkg/config"
- coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config"
-
- "github.com/smartcontractkit/chainlink/v2/core/cmd"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/cosmostest"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
-)
-
-func cosmosStartNewApplication(t *testing.T, cfgs ...*coscfg.TOMLConfig) *cltest.TestApplication {
- for i := range cfgs {
- cfgs[i].SetDefaults()
- }
- return startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Cosmos = cfgs
- c.EVM = nil
- })
-}
-
-func TestShell_IndexCosmosNodes(t *testing.T) {
- t.Parallel()
-
- chainID := cosmostest.RandomChainID()
- node := coscfg.Node{
- Name: ptr("second"),
- TendermintURL: config.MustParseURL("http://tender.mint.test/bombay-12"),
- }
- chain := coscfg.TOMLConfig{
- ChainID: ptr(chainID),
- Enabled: ptr(true),
- Nodes: coscfg.Nodes{&node},
- }
- app := cosmosStartNewApplication(t, &chain)
- client, r := app.NewShellAndRenderer()
- require.Nil(t, cmd.NewCosmosNodeClient(client).IndexNodes(cltest.EmptyCLIContext()))
- require.NotEmpty(t, r.Renders)
- nodes := *r.Renders[0].(*cmd.CosmosNodePresenters)
- require.Len(t, nodes, 1)
- n := nodes[0]
- assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID, *node.Name), n.ID)
- assert.Equal(t, chainID, n.ChainID)
- assert.Equal(t, *node.Name, n.Name)
- wantConfig, err := toml.Marshal(node)
- require.NoError(t, err)
- assert.Equal(t, string(wantConfig), n.Config)
- assertTableRenders(t, r)
-
- // Render table and check the fields order
- b := new(bytes.Buffer)
- rt := cmd.RendererTable{b}
- require.NoError(t, nodes.RenderTable(rt))
- renderLines := strings.Split(b.String(), "\n")
- assert.Equal(t, 10, len(renderLines))
- assert.Contains(t, renderLines[2], "Name")
- assert.Contains(t, renderLines[2], n.Name)
- assert.Contains(t, renderLines[3], "Chain ID")
- assert.Contains(t, renderLines[3], n.ChainID)
- assert.Contains(t, renderLines[4], "State")
- assert.Contains(t, renderLines[4], n.State)
-}
diff --git a/core/cmd/evm_chains_commands.go b/core/cmd/evm_chains_commands.go
deleted file mode 100644
index d4025cfca53..00000000000
--- a/core/cmd/evm_chains_commands.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package cmd
-
-import (
- "strconv"
-
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// EVMChainPresenter implements TableRenderer for an EVMChainResource.
-type EVMChainPresenter struct {
- presenters.EVMChainResource
-}
-
-// ToRow presents the EVMChainResource as a slice of strings.
-func (p *EVMChainPresenter) ToRow() []string {
- return []string{p.GetID(), strconv.FormatBool(p.Enabled), p.Config}
-}
-
-// RenderTable implements TableRenderer
-// Just renders a single row
-func (p EVMChainPresenter) RenderTable(rt RendererTable) error {
- rows := [][]string{}
- rows = append(rows, p.ToRow())
-
- renderList(chainHeaders, rows, rt.Writer)
-
- return nil
-}
-
-// EVMChainPresenters implements TableRenderer for a slice of EVMChainPresenters.
-type EVMChainPresenters []EVMChainPresenter
-
-// RenderTable implements TableRenderer
-func (ps EVMChainPresenters) RenderTable(rt RendererTable) error {
- rows := [][]string{}
-
- for _, p := range ps {
- rows = append(rows, p.ToRow())
- }
-
- renderList(chainHeaders, rows, rt.Writer)
-
- return nil
-}
-
-func EVMChainClient(s *Shell) ChainClient {
- return newChainClient[EVMChainPresenters](s, "evm")
-}
diff --git a/core/cmd/evm_chains_commands_test.go b/core/cmd/evm_chains_commands_test.go
deleted file mode 100644
index fa6d7bb519c..00000000000
--- a/core/cmd/evm_chains_commands_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package cmd_test
-
-import (
- "strconv"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- client2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
- "github.com/smartcontractkit/chainlink/v2/core/cmd"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
-)
-
-func newRandChainID() *big.Big {
- return big.New(testutils.NewRandomEVMChainID())
-}
-
-func TestShell_IndexEVMChains(t *testing.T) {
- t.Parallel()
-
- app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.EVM[0].Enabled = ptr(true)
- c.EVM[0].NonceAutoSync = ptr(false)
- c.EVM[0].BalanceMonitor.Enabled = ptr(false)
- })
- client, r := app.NewShellAndRenderer()
-
- require.Nil(t, cmd.EVMChainClient(client).IndexChains(cltest.EmptyCLIContext()))
- chains := *r.Renders[0].(*cmd.EVMChainPresenters)
- require.Len(t, chains, 1)
- c := chains[0]
- assert.Equal(t, strconv.Itoa(client2.NullClientChainID), c.ID)
- assertTableRenders(t, r)
-}
diff --git a/core/cmd/evm_node_commands.go b/core/cmd/evm_node_commands.go
deleted file mode 100644
index 515ece18a8e..00000000000
--- a/core/cmd/evm_node_commands.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package cmd
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// EVMNodePresenter implements TableRenderer for an EVMNodeResource.
-type EVMNodePresenter struct {
- presenters.EVMNodeResource
-}
-
-// ToRow presents the EVMNodeResource as a slice of strings.
-func (p *EVMNodePresenter) ToRow() []string {
- return []string{p.Name, p.ChainID, p.State, p.Config}
-}
-
-// RenderTable implements TableRenderer
-func (p EVMNodePresenter) RenderTable(rt RendererTable) error {
- var rows [][]string
- rows = append(rows, p.ToRow())
- renderList(nodeHeaders, rows, rt.Writer)
-
- return nil
-}
-
-// EVMNodePresenters implements TableRenderer for a slice of EVMNodePresenter.
-type EVMNodePresenters []EVMNodePresenter
-
-// RenderTable implements TableRenderer
-func (ps EVMNodePresenters) RenderTable(rt RendererTable) error {
- var rows [][]string
-
- for _, p := range ps {
- rows = append(rows, p.ToRow())
- }
-
- renderList(nodeHeaders, rows, rt.Writer)
-
- return nil
-}
-
-func NewEVMNodeClient(s *Shell) NodeClient {
- return newNodeClient[EVMNodePresenters](s, "evm")
-}
diff --git a/core/cmd/evm_node_commands_test.go b/core/cmd/evm_node_commands_test.go
deleted file mode 100644
index d743ee28e1b..00000000000
--- a/core/cmd/evm_node_commands_test.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package cmd_test
-
-import (
- "bytes"
- "strings"
- "testing"
-
- "github.com/pelletier/go-toml/v2"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
- evmcfg "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
- "github.com/smartcontractkit/chainlink/v2/core/cmd"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
-)
-
-func assertTableRenders(t *testing.T, r *cltest.RendererMock) {
- // Should be no error rendering any of the responses as tables
- b := bytes.NewBuffer([]byte{})
- tb := cmd.RendererTable{b}
- for _, rn := range r.Renders {
- require.NoError(t, tb.Render(rn))
- }
-}
-
-func TestShell_IndexEVMNodes(t *testing.T) {
- t.Parallel()
-
- chainID := newRandChainID()
- node1 := evmcfg.Node{
- Name: ptr("Test node 1"),
- WSURL: commonconfig.MustParseURL("ws://localhost:8546"),
- HTTPURL: commonconfig.MustParseURL("http://localhost:8546"),
- SendOnly: ptr(false),
- Order: ptr(int32(15)),
- }
- node2 := evmcfg.Node{
- Name: ptr("Test node 2"),
- WSURL: commonconfig.MustParseURL("ws://localhost:8547"),
- HTTPURL: commonconfig.MustParseURL("http://localhost:8547"),
- SendOnly: ptr(false),
- Order: ptr(int32(36)),
- }
- chain := evmcfg.EVMConfig{
- ChainID: chainID,
- Chain: evmcfg.Defaults(chainID),
- Nodes: evmcfg.EVMNodes{&node1, &node2},
- }
- app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.EVM = evmcfg.EVMConfigs{&chain}
- })
- client, r := app.NewShellAndRenderer()
-
- require.Nil(t, cmd.NewEVMNodeClient(client).IndexNodes(cltest.EmptyCLIContext()))
- require.NotEmpty(t, r.Renders)
- nodes := *r.Renders[0].(*cmd.EVMNodePresenters)
- require.Len(t, nodes, 2)
- n1 := nodes[0]
- n2 := nodes[1]
- assert.Equal(t, chainID.String(), n1.ChainID)
- assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID.String(), *node1.Name), n1.ID)
- assert.Equal(t, *node1.Name, n1.Name)
- wantConfig, err := toml.Marshal(node1)
- require.NoError(t, err)
- assert.Equal(t, string(wantConfig), n1.Config)
- assert.Equal(t, chainID.String(), n2.ChainID)
- assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID.String(), *node2.Name), n2.ID)
- assert.Equal(t, *node2.Name, n2.Name)
- wantConfig2, err := toml.Marshal(node2)
- require.NoError(t, err)
- assert.Equal(t, string(wantConfig2), n2.Config)
- assertTableRenders(t, r)
-
- // Render table and check the fields order
- b := new(bytes.Buffer)
- rt := cmd.RendererTable{b}
- require.NoError(t, nodes.RenderTable(rt))
- renderLines := strings.Split(b.String(), "\n")
- assert.Equal(t, 23, len(renderLines))
- assert.Contains(t, renderLines[2], "Name")
- assert.Contains(t, renderLines[2], n1.Name)
- assert.Contains(t, renderLines[3], "Chain ID")
- assert.Contains(t, renderLines[3], n1.ChainID)
- assert.Contains(t, renderLines[4], "State")
- assert.Contains(t, renderLines[4], n1.State)
- assert.Contains(t, renderLines[12], "Name")
- assert.Contains(t, renderLines[12], n2.Name)
- assert.Contains(t, renderLines[13], "Chain ID")
- assert.Contains(t, renderLines[13], n2.ChainID)
- assert.Contains(t, renderLines[14], "State")
- assert.Contains(t, renderLines[14], n2.State)
-}
diff --git a/core/cmd/node_commands_test.go b/core/cmd/node_commands_test.go
new file mode 100644
index 00000000000..8a17bad719e
--- /dev/null
+++ b/core/cmd/node_commands_test.go
@@ -0,0 +1,290 @@
+package cmd_test
+
+import (
+ "bytes"
+ "strings"
+ "testing"
+
+ "github.com/pelletier/go-toml/v2"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/config"
+ coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config"
+ solcfg "github.com/smartcontractkit/chainlink-solana/pkg/solana/config"
+ starkcfg "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/config"
+ evmcfg "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
+
+ "github.com/smartcontractkit/chainlink/v2/core/cmd"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/cosmostest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/solanatest"
+ "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+)
+
+func assertTableRenders(t *testing.T, r *cltest.RendererMock) {
+ // Should be no error rendering any of the responses as tables
+ b := bytes.NewBuffer([]byte{})
+ tb := cmd.RendererTable{b}
+ for _, rn := range r.Renders {
+ require.NoError(t, tb.Render(rn))
+ }
+}
+
+func TestShell_IndexEVMNodes(t *testing.T) {
+ t.Parallel()
+
+ chainID := newRandChainID()
+ node1 := evmcfg.Node{
+ Name: ptr("Test node 1"),
+ WSURL: config.MustParseURL("ws://localhost:8546"),
+ HTTPURL: config.MustParseURL("http://localhost:8546"),
+ SendOnly: ptr(false),
+ Order: ptr(int32(15)),
+ }
+ node2 := evmcfg.Node{
+ Name: ptr("Test node 2"),
+ WSURL: config.MustParseURL("ws://localhost:8547"),
+ HTTPURL: config.MustParseURL("http://localhost:8547"),
+ SendOnly: ptr(false),
+ Order: ptr(int32(36)),
+ }
+ chain := evmcfg.EVMConfig{
+ ChainID: chainID,
+ Chain: evmcfg.Defaults(chainID),
+ Nodes: evmcfg.EVMNodes{&node1, &node2},
+ }
+ app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.EVM = evmcfg.EVMConfigs{&chain}
+ })
+ client, r := app.NewShellAndRenderer()
+
+ require.NoError(t, cmd.NewNodeClient(client, "evm").IndexNodes(cltest.EmptyCLIContext()))
+ require.NotEmpty(t, r.Renders)
+ nodes := *r.Renders[0].(*cmd.NodePresenters)
+ require.Len(t, nodes, 2)
+ n1 := nodes[0]
+ n2 := nodes[1]
+ assert.Equal(t, chainID.String(), n1.ChainID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID.String(), *node1.Name), n1.ID)
+ assert.Equal(t, *node1.Name, n1.Name)
+ wantConfig, err := toml.Marshal(node1)
+ require.NoError(t, err)
+ assert.Equal(t, string(wantConfig), n1.Config)
+ assert.Equal(t, chainID.String(), n2.ChainID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID.String(), *node2.Name), n2.ID)
+ assert.Equal(t, *node2.Name, n2.Name)
+ wantConfig2, err := toml.Marshal(node2)
+ require.NoError(t, err)
+ assert.Equal(t, string(wantConfig2), n2.Config)
+ assertTableRenders(t, r)
+
+ // Render table and check the fields order
+ b := new(bytes.Buffer)
+ rt := cmd.RendererTable{b}
+ require.NoError(t, nodes.RenderTable(rt))
+ renderLines := strings.Split(b.String(), "\n")
+ assert.Len(t, renderLines, 23)
+ assert.Contains(t, renderLines[2], "Name")
+ assert.Contains(t, renderLines[2], n1.Name)
+ assert.Contains(t, renderLines[3], "Chain ID")
+ assert.Contains(t, renderLines[3], n1.ChainID)
+ assert.Contains(t, renderLines[4], "State")
+ assert.Contains(t, renderLines[4], n1.State)
+ assert.Contains(t, renderLines[12], "Name")
+ assert.Contains(t, renderLines[12], n2.Name)
+ assert.Contains(t, renderLines[13], "Chain ID")
+ assert.Contains(t, renderLines[13], n2.ChainID)
+ assert.Contains(t, renderLines[14], "State")
+ assert.Contains(t, renderLines[14], n2.State)
+}
+
+func cosmosStartNewApplication(t *testing.T, cfgs ...*coscfg.TOMLConfig) *cltest.TestApplication {
+ for i := range cfgs {
+ cfgs[i].SetDefaults()
+ }
+ return startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.Cosmos = cfgs
+ c.EVM = nil
+ })
+}
+
+func TestShell_IndexCosmosNodes(t *testing.T) {
+ t.Parallel()
+
+ chainID := cosmostest.RandomChainID()
+ node := coscfg.Node{
+ Name: ptr("second"),
+ TendermintURL: config.MustParseURL("http://tender.mint.test/bombay-12"),
+ }
+ chain := coscfg.TOMLConfig{
+ ChainID: ptr(chainID),
+ Enabled: ptr(true),
+ Nodes: coscfg.Nodes{&node},
+ }
+ app := cosmosStartNewApplication(t, &chain)
+ client, r := app.NewShellAndRenderer()
+ require.NoError(t, cmd.NewNodeClient(client, "cosmos").IndexNodes(cltest.EmptyCLIContext()))
+ require.NotEmpty(t, r.Renders)
+ nodes := *r.Renders[0].(*cmd.NodePresenters)
+ require.Len(t, nodes, 1)
+ n := nodes[0]
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID, *node.Name), n.ID)
+ assert.Equal(t, chainID, n.ChainID)
+ assert.Equal(t, *node.Name, n.Name)
+ wantConfig, err := toml.Marshal(node)
+ require.NoError(t, err)
+ assert.Equal(t, string(wantConfig), n.Config)
+ assertTableRenders(t, r)
+
+ // Render table and check the fields order
+ b := new(bytes.Buffer)
+ rt := cmd.RendererTable{b}
+ require.NoError(t, nodes.RenderTable(rt))
+ renderLines := strings.Split(b.String(), "\n")
+ assert.Len(t, renderLines, 10)
+ assert.Contains(t, renderLines[2], "Name")
+ assert.Contains(t, renderLines[2], n.Name)
+ assert.Contains(t, renderLines[3], "Chain ID")
+ assert.Contains(t, renderLines[3], n.ChainID)
+ assert.Contains(t, renderLines[4], "State")
+ assert.Contains(t, renderLines[4], n.State)
+}
+func solanaStartNewApplication(t *testing.T, cfgs ...*solcfg.TOMLConfig) *cltest.TestApplication {
+ for i := range cfgs {
+ cfgs[i].Chain.SetDefaults()
+ }
+ return startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.Solana = cfgs
+ c.EVM = nil
+ })
+}
+
+func TestShell_IndexSolanaNodes(t *testing.T) {
+ t.Parallel()
+
+ id := solanatest.RandomChainID()
+ node1 := solcfg.Node{
+ Name: ptr("first"),
+ URL: config.MustParseURL("https://solana1.example"),
+ }
+ node2 := solcfg.Node{
+ Name: ptr("second"),
+ URL: config.MustParseURL("https://solana2.example"),
+ }
+ chain := solcfg.TOMLConfig{
+ ChainID: &id,
+ Nodes: solcfg.Nodes{&node1, &node2},
+ }
+ app := solanaStartNewApplication(t, &chain)
+ client, r := app.NewShellAndRenderer()
+
+ require.NoError(t, cmd.NewNodeClient(client, "solana").IndexNodes(cltest.EmptyCLIContext()))
+ require.NotEmpty(t, r.Renders)
+ nodes := *r.Renders[0].(*cmd.NodePresenters)
+ require.Len(t, nodes, 2)
+ n1 := nodes[0]
+ n2 := nodes[1]
+ assert.Equal(t, id, n1.ChainID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node1.Name), n1.ID)
+ assert.Equal(t, *node1.Name, n1.Name)
+ wantConfig, err := toml.Marshal(node1)
+ require.NoError(t, err)
+ assert.Equal(t, string(wantConfig), n1.Config)
+ assert.Equal(t, id, n2.ChainID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node2.Name), n2.ID)
+ assert.Equal(t, *node2.Name, n2.Name)
+ wantConfig2, err := toml.Marshal(node2)
+ require.NoError(t, err)
+ assert.Equal(t, string(wantConfig2), n2.Config)
+ assertTableRenders(t, r)
+
+ // Render table and check the fields order
+ b := new(bytes.Buffer)
+ rt := cmd.RendererTable{b}
+ require.NoError(t, nodes.RenderTable(rt))
+ renderLines := strings.Split(b.String(), "\n")
+ assert.Len(t, renderLines, 19)
+ assert.Contains(t, renderLines[2], "Name")
+ assert.Contains(t, renderLines[2], n1.Name)
+ assert.Contains(t, renderLines[3], "Chain ID")
+ assert.Contains(t, renderLines[3], n1.ChainID)
+ assert.Contains(t, renderLines[4], "State")
+ assert.Contains(t, renderLines[4], n1.State)
+ assert.Contains(t, renderLines[10], "Name")
+ assert.Contains(t, renderLines[10], n2.Name)
+ assert.Contains(t, renderLines[11], "Chain ID")
+ assert.Contains(t, renderLines[11], n2.ChainID)
+ assert.Contains(t, renderLines[12], "State")
+ assert.Contains(t, renderLines[12], n2.State)
+}
+
+func starknetStartNewApplication(t *testing.T, cfgs ...*starkcfg.TOMLConfig) *cltest.TestApplication {
+ for i := range cfgs {
+ cfgs[i].SetDefaults()
+ }
+ return startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.Starknet = cfgs
+ c.EVM = nil
+ c.Solana = nil
+ })
+}
+
+func TestShell_IndexStarkNetNodes(t *testing.T) {
+ t.Parallel()
+
+ id := "starknet chain ID"
+ node1 := starkcfg.Node{
+ Name: ptr("first"),
+ URL: config.MustParseURL("https://starknet1.example"),
+ }
+ node2 := starkcfg.Node{
+ Name: ptr("second"),
+ URL: config.MustParseURL("https://starknet2.example"),
+ }
+ chain := starkcfg.TOMLConfig{
+ ChainID: &id,
+ Nodes: starkcfg.Nodes{&node1, &node2},
+ }
+ app := starknetStartNewApplication(t, &chain)
+ client, r := app.NewShellAndRenderer()
+
+ require.NoError(t, cmd.NewNodeClient(client, "starknet").IndexNodes(cltest.EmptyCLIContext()))
+ require.NotEmpty(t, r.Renders)
+ nodes := *r.Renders[0].(*cmd.NodePresenters)
+ require.Len(t, nodes, 2)
+ n1 := nodes[0]
+ n2 := nodes[1]
+ assert.Equal(t, id, n1.ChainID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node1.Name), n1.ID)
+ assert.Equal(t, *node1.Name, n1.Name)
+ wantConfig, err := toml.Marshal(node1)
+ require.NoError(t, err)
+ assert.Equal(t, string(wantConfig), n1.Config)
+ assert.Equal(t, id, n2.ChainID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node2.Name), n2.ID)
+ assert.Equal(t, *node2.Name, n2.Name)
+ wantConfig2, err := toml.Marshal(node2)
+ require.NoError(t, err)
+ assert.Equal(t, string(wantConfig2), n2.Config)
+ assertTableRenders(t, r)
+
+ // Render table and check the fields order
+ b := new(bytes.Buffer)
+ rt := cmd.RendererTable{b}
+ require.NoError(t, nodes.RenderTable(rt))
+ renderLines := strings.Split(b.String(), "\n")
+ assert.Len(t, renderLines, 17)
+ assert.Contains(t, renderLines[2], "Name")
+ assert.Contains(t, renderLines[2], n1.Name)
+ assert.Contains(t, renderLines[3], "Chain ID")
+ assert.Contains(t, renderLines[3], n1.ChainID)
+ assert.Contains(t, renderLines[4], "State")
+ assert.Contains(t, renderLines[4], n1.State)
+ assert.Contains(t, renderLines[9], "Name")
+ assert.Contains(t, renderLines[9], n2.Name)
+ assert.Contains(t, renderLines[10], "Chain ID")
+ assert.Contains(t, renderLines[10], n2.ChainID)
+ assert.Contains(t, renderLines[11], "State")
+ assert.Contains(t, renderLines[11], n2.State)
+}
diff --git a/core/cmd/nodes_commands.go b/core/cmd/nodes_commands.go
index efee10bb156..0420ef66ec4 100644
--- a/core/cmd/nodes_commands.go
+++ b/core/cmd/nodes_commands.go
@@ -2,25 +2,25 @@ package cmd
import (
"fmt"
+ "maps"
+ "slices"
"strings"
"github.com/urfave/cli"
-)
-
-func initCosmosNodeSubCmd(s *Shell) cli.Command {
- return nodeCommand("Cosmos", NewCosmosNodeClient(s))
-}
-func initStarkNetNodeSubCmd(s *Shell) cli.Command {
- return nodeCommand("StarkNet", NewStarkNetNodeClient(s))
-}
-
-func initEVMNodeSubCmd(s *Shell) cli.Command {
- return nodeCommand("EVM", NewEVMNodeClient(s))
-}
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay"
+ "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
+)
-func initSolanaNodeSubCmd(s *Shell) cli.Command {
- return nodeCommand("Solana", NewSolanaNodeClient(s))
+func initNodeSubCmds(s *Shell) []cli.Command {
+ cmds := []cli.Command{}
+ for _, network := range slices.Sorted(maps.Keys(relay.SupportedNetworks)) {
+ if network == relay.NetworkDummy {
+ continue
+ }
+ cmds = append(cmds, nodeCommand(network, NewNodeClient(s, network)))
+ }
+ return cmds
}
// nodeCommand returns a cli.Command with subcommands for the given NodeClient.
@@ -40,6 +40,41 @@ func nodeCommand(typ string, client NodeClient) cli.Command {
}
}
+// EVMNodePresenter implements TableRenderer for an EVMNodeResource.
+type NodePresenter struct {
+ presenters.NodeResource
+}
+
+// ToRow presents the EVMNodeResource as a slice of strings.
+func (p *NodePresenter) ToRow() []string {
+ return []string{p.Name, p.ChainID, p.State, p.Config}
+}
+
+// RenderTable implements TableRenderer
+func (p NodePresenter) RenderTable(rt RendererTable) error {
+ var rows [][]string
+ rows = append(rows, p.ToRow())
+ renderList(nodeHeaders, rows, rt.Writer)
+
+ return nil
+}
+
+// NodePresenters implements TableRenderer for a slice of NodePresenter.
+type NodePresenters []NodePresenter
+
+// RenderTable implements TableRenderer
+func (ps NodePresenters) RenderTable(rt RendererTable) error {
+ rows := [][]string{}
+
+ for _, p := range ps {
+ rows = append(rows, p.ToRow())
+ }
+
+ renderList(nodeHeaders, rows, rt.Writer)
+
+ return nil
+}
+
// NodeClient is a generic client interface for any of node.
type NodeClient interface {
IndexNodes(c *cli.Context) error
@@ -52,10 +87,10 @@ type nodeClient[P TableRenderer] struct {
// newNodeClient returns a new NodeClient for a particular type of NodeStatus.
// P is a TableRenderer for []types.NodeStatus.
-func newNodeClient[P TableRenderer](s *Shell, name string) NodeClient {
- return &nodeClient[P]{
+func NewNodeClient(s *Shell, network string) NodeClient {
+ return &nodeClient[NodePresenters]{
Shell: s,
- path: "/v2/nodes/" + name,
+ path: "/v2/nodes/" + network,
}
}
diff --git a/core/cmd/shell.go b/core/cmd/shell.go
index 53ba5e3f82f..94664a3cf3d 100644
--- a/core/cmd/shell.go
+++ b/core/cmd/shell.go
@@ -399,7 +399,7 @@ func takeBackupIfVersionUpgrade(dbUrl url.URL, rootDir string, cfg periodicbacku
}
// Because backups can take a long time we must start a "fake" health report to prevent
- //node shutdown because of healthcheck fail/timeout
+ // node shutdown because of healthcheck fail/timeout
err = databaseBackup.RunBackup(appv.String())
return err
}
diff --git a/core/cmd/shell_local.go b/core/cmd/shell_local.go
index 412231308b6..1fdc1a46d34 100644
--- a/core/cmd/shell_local.go
+++ b/core/cmd/shell_local.go
@@ -35,6 +35,8 @@ import (
cutils "github.com/smartcontractkit/chainlink-common/pkg/utils"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
+
"github.com/smartcontractkit/chainlink/v2/core/build"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/gas"
@@ -47,7 +49,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/sessions"
"github.com/smartcontractkit/chainlink/v2/core/shutdown"
"github.com/smartcontractkit/chainlink/v2/core/static"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
"github.com/smartcontractkit/chainlink/v2/core/store/migrate"
"github.com/smartcontractkit/chainlink/v2/core/utils"
"github.com/smartcontractkit/chainlink/v2/core/web"
@@ -805,7 +806,7 @@ func (s *Shell) PrepareTestDatabase(c *cli.Context) error {
// Creating pristine DB copy to speed up FullTestDB
dbUrl := cfg.Database().URL()
- db, err := sqlx.Open(string(dialects.Postgres), dbUrl.String())
+ db, err := sqlx.Open(string(pgcommon.Postgres), dbUrl.String())
if err != nil {
return s.errorOut(err)
}
@@ -1088,7 +1089,7 @@ type dbConfig interface {
MaxOpenConns() int
MaxIdleConns() int
URL() url.URL
- Dialect() dialects.DialectName
+ Dialect() pgcommon.DialectName
}
func newConnection(ctx context.Context, cfg dbConfig) (*sqlx.DB, error) {
@@ -1104,7 +1105,7 @@ func dropAndCreateDB(parsed url.URL, force bool) (err error) {
// to a different one. template1 should be present on all postgres installations
dbname := parsed.Path[1:]
parsed.Path = "/template1"
- db, err := sql.Open(string(dialects.Postgres), parsed.String())
+ db, err := sql.Open(string(pgcommon.Postgres), parsed.String())
if err != nil {
return fmt.Errorf("unable to open postgres database for creating test db: %+v", err)
}
@@ -1203,7 +1204,7 @@ func checkSchema(dbURL url.URL, prevSchema string) error {
}
func insertFixtures(dbURL url.URL, pathToFixtures string) (err error) {
- db, err := sql.Open(string(dialects.Postgres), dbURL.String())
+ db, err := sql.Open(string(pgcommon.Postgres), dbURL.String())
if err != nil {
return fmt.Errorf("unable to open postgres database for creating test db: %+v", err)
}
diff --git a/core/cmd/shell_local_test.go b/core/cmd/shell_local_test.go
index 78254c0279e..7cdc8c21840 100644
--- a/core/cmd/shell_local_test.go
+++ b/core/cmd/shell_local_test.go
@@ -10,6 +10,7 @@ import (
"time"
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
"github.com/smartcontractkit/chainlink/v2/common/client"
@@ -29,7 +30,6 @@ import (
chainlinkmocks "github.com/smartcontractkit/chainlink/v2/core/services/chainlink/mocks"
evmrelayer "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
"github.com/smartcontractkit/chainlink/v2/core/sessions/localauth"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
"github.com/smartcontractkit/chainlink/v2/core/store/models"
"github.com/smartcontractkit/chainlink/v2/core/utils"
"github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight"
@@ -283,7 +283,7 @@ func TestShell_RebroadcastTransactions_Txm(t *testing.T) {
// test multiple connections to the database, and changes made within
// the transaction cannot be seen from another connection.
config, sqlxDB := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Database.Dialect = dialects.Postgres
+ c.Database.Dialect = pgcommon.Postgres
// evm config is used in this test. but if set, it must be pass config validation.
// simplest to make it nil
c.EVM = nil
@@ -363,7 +363,7 @@ func TestShell_RebroadcastTransactions_OutsideRange_Txm(t *testing.T) {
// test multiple connections to the database, and changes made within
// the transaction cannot be seen from another connection.
config, sqlxDB := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Database.Dialect = dialects.Postgres
+ c.Database.Dialect = pgcommon.Postgres
// evm config is used in this test. but if set, it must be pass config validation.
// simplest to make it nil
c.EVM = nil
@@ -441,7 +441,7 @@ func TestShell_RebroadcastTransactions_AddressCheck(t *testing.T) {
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
config, sqlxDB := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Database.Dialect = dialects.Postgres
+ c.Database.Dialect = pgcommon.Postgres
c.EVM = nil
// seems to be needed for config validate
@@ -499,7 +499,7 @@ func TestShell_RebroadcastTransactions_AddressCheck(t *testing.T) {
func TestShell_CleanupChainTables(t *testing.T) {
// Just check if it doesn't error, command itself shouldn't be changed unless major schema changes were made.
// It would be really hard to write a test that accounts for schema changes, so this should be enough to alarm us that something broke.
- config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = dialects.Postgres })
+ config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.Database.Dialect = pgcommon.Postgres })
client := cmd.Shell{
Config: config,
Logger: logger.TestLogger(t),
diff --git a/core/cmd/solana_chains_commands.go b/core/cmd/solana_chains_commands.go
deleted file mode 100644
index aa2a07c0f8c..00000000000
--- a/core/cmd/solana_chains_commands.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package cmd
-
-import (
- "strconv"
-
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// SolanaChainPresenter implements TableRenderer for a SolanaChainResource
-type SolanaChainPresenter struct {
- presenters.SolanaChainResource
-}
-
-// ToRow presents the SolanaChainResource as a slice of strings.
-func (p *SolanaChainPresenter) ToRow() []string {
- return []string{p.GetID(), strconv.FormatBool(p.Enabled), p.Config}
-}
-
-// RenderTable implements TableRenderer
-// Just renders a single row
-func (p SolanaChainPresenter) RenderTable(rt RendererTable) error {
- rows := [][]string{}
- rows = append(rows, p.ToRow())
-
- renderList(chainHeaders, rows, rt.Writer)
-
- return nil
-}
-
-// SolanaChainPresenters implements TableRenderer for a slice of SolanaChainPresenters.
-type SolanaChainPresenters []SolanaChainPresenter
-
-// RenderTable implements TableRenderer
-func (ps SolanaChainPresenters) RenderTable(rt RendererTable) error {
- rows := [][]string{}
-
- for _, p := range ps {
- rows = append(rows, p.ToRow())
- }
-
- renderList(chainHeaders, rows, rt.Writer)
-
- return nil
-}
-
-func SolanaChainClient(s *Shell) ChainClient {
- return newChainClient[SolanaChainPresenters](s, "solana")
-}
diff --git a/core/cmd/solana_chains_commands_test.go b/core/cmd/solana_chains_commands_test.go
deleted file mode 100644
index e374ba11c65..00000000000
--- a/core/cmd/solana_chains_commands_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package cmd_test
-
-import (
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- solcfg "github.com/smartcontractkit/chainlink-solana/pkg/solana/config"
- "github.com/smartcontractkit/chainlink/v2/core/cmd"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/solanatest"
-)
-
-func TestShell_IndexSolanaChains(t *testing.T) {
- t.Parallel()
-
- id := solanatest.RandomChainID()
- cfg := solcfg.TOMLConfig{
- ChainID: &id,
- Enabled: ptr(true),
- }
- app := solanaStartNewApplication(t, &cfg)
- client, r := app.NewShellAndRenderer()
-
- require.Nil(t, cmd.SolanaChainClient(client).IndexChains(cltest.EmptyCLIContext()))
- chains := *r.Renders[0].(*cmd.SolanaChainPresenters)
- require.Len(t, chains, 1)
- c := chains[0]
- assert.Equal(t, id, c.ID)
- assertTableRenders(t, r)
-}
diff --git a/core/cmd/solana_node_commands.go b/core/cmd/solana_node_commands.go
deleted file mode 100644
index 6ccf9a5864c..00000000000
--- a/core/cmd/solana_node_commands.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package cmd
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// SolanaNodePresenter implements TableRenderer for a SolanaNodeResource.
-type SolanaNodePresenter struct {
- presenters.SolanaNodeResource
-}
-
-// ToRow presents the SolanaNodeResource as a slice of strings.
-func (p *SolanaNodePresenter) ToRow() []string {
- return []string{p.Name, p.ChainID, p.State, p.Config}
-}
-
-// RenderTable implements TableRenderer
-func (p SolanaNodePresenter) RenderTable(rt RendererTable) error {
- var rows [][]string
- rows = append(rows, p.ToRow())
- renderList(nodeHeaders, rows, rt.Writer)
-
- return nil
-}
-
-// SolanaNodePresenters implements TableRenderer for a slice of SolanaNodePresenter.
-type SolanaNodePresenters []SolanaNodePresenter
-
-// RenderTable implements TableRenderer
-func (ps SolanaNodePresenters) RenderTable(rt RendererTable) error {
- var rows [][]string
-
- for _, p := range ps {
- rows = append(rows, p.ToRow())
- }
-
- renderList(nodeHeaders, rows, rt.Writer)
-
- return nil
-}
-
-func NewSolanaNodeClient(s *Shell) NodeClient {
- return newNodeClient[SolanaNodePresenters](s, "solana")
-}
diff --git a/core/cmd/solana_node_commands_test.go b/core/cmd/solana_node_commands_test.go
deleted file mode 100644
index f08fcd7aaf0..00000000000
--- a/core/cmd/solana_node_commands_test.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package cmd_test
-
-import (
- "bytes"
- "strings"
- "testing"
-
- "github.com/pelletier/go-toml/v2"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- "github.com/smartcontractkit/chainlink-common/pkg/config"
- solcfg "github.com/smartcontractkit/chainlink-solana/pkg/solana/config"
-
- "github.com/smartcontractkit/chainlink/v2/core/cmd"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/solanatest"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
-)
-
-func solanaStartNewApplication(t *testing.T, cfgs ...*solcfg.TOMLConfig) *cltest.TestApplication {
- for i := range cfgs {
- cfgs[i].Chain.SetDefaults()
- }
- return startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Solana = cfgs
- c.EVM = nil
- })
-}
-
-func TestShell_IndexSolanaNodes(t *testing.T) {
- t.Parallel()
-
- id := solanatest.RandomChainID()
- node1 := solcfg.Node{
- Name: ptr("first"),
- URL: config.MustParseURL("https://solana1.example"),
- }
- node2 := solcfg.Node{
- Name: ptr("second"),
- URL: config.MustParseURL("https://solana2.example"),
- }
- chain := solcfg.TOMLConfig{
- ChainID: &id,
- Nodes: solcfg.Nodes{&node1, &node2},
- }
- app := solanaStartNewApplication(t, &chain)
- client, r := app.NewShellAndRenderer()
-
- require.Nil(t, cmd.NewSolanaNodeClient(client).IndexNodes(cltest.EmptyCLIContext()))
- require.NotEmpty(t, r.Renders)
- nodes := *r.Renders[0].(*cmd.SolanaNodePresenters)
- require.Len(t, nodes, 2)
- n1 := nodes[0]
- n2 := nodes[1]
- assert.Equal(t, id, n1.ChainID)
- assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node1.Name), n1.ID)
- assert.Equal(t, *node1.Name, n1.Name)
- wantConfig, err := toml.Marshal(node1)
- require.NoError(t, err)
- assert.Equal(t, string(wantConfig), n1.Config)
- assert.Equal(t, id, n2.ChainID)
- assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node2.Name), n2.ID)
- assert.Equal(t, *node2.Name, n2.Name)
- wantConfig2, err := toml.Marshal(node2)
- require.NoError(t, err)
- assert.Equal(t, string(wantConfig2), n2.Config)
- assertTableRenders(t, r)
-
- // Render table and check the fields order
- b := new(bytes.Buffer)
- rt := cmd.RendererTable{b}
- require.NoError(t, nodes.RenderTable(rt))
- renderLines := strings.Split(b.String(), "\n")
- assert.Equal(t, 19, len(renderLines))
- assert.Contains(t, renderLines[2], "Name")
- assert.Contains(t, renderLines[2], n1.Name)
- assert.Contains(t, renderLines[3], "Chain ID")
- assert.Contains(t, renderLines[3], n1.ChainID)
- assert.Contains(t, renderLines[4], "State")
- assert.Contains(t, renderLines[4], n1.State)
- assert.Contains(t, renderLines[10], "Name")
- assert.Contains(t, renderLines[10], n2.Name)
- assert.Contains(t, renderLines[11], "Chain ID")
- assert.Contains(t, renderLines[11], n2.ChainID)
- assert.Contains(t, renderLines[12], "State")
- assert.Contains(t, renderLines[12], n2.State)
-}
diff --git a/core/cmd/starknet_chains_commands.go b/core/cmd/starknet_chains_commands.go
deleted file mode 100644
index 5b20b37ae22..00000000000
--- a/core/cmd/starknet_chains_commands.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package cmd
-
-import (
- "strconv"
-
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// StarkNetChainPresenter implements TableRenderer for a StarkNetChainResource
-type StarkNetChainPresenter struct {
- presenters.StarkNetChainResource
-}
-
-// ToRow presents the StarkNetChainResource as a slice of strings.
-func (p *StarkNetChainPresenter) ToRow() []string {
- return []string{p.GetID(), strconv.FormatBool(p.Enabled), p.Config}
-}
-
-// RenderTable implements TableRenderer
-// Just renders a single row
-func (p StarkNetChainPresenter) RenderTable(rt RendererTable) error {
- rows := [][]string{}
- rows = append(rows, p.ToRow())
-
- renderList(chainHeaders, rows, rt.Writer)
-
- return nil
-}
-
-// StarkNetChainPresenters implements TableRenderer for a slice of StarkNetChainPresenters.
-type StarkNetChainPresenters []StarkNetChainPresenter
-
-// RenderTable implements TableRenderer
-func (ps StarkNetChainPresenters) RenderTable(rt RendererTable) error {
- rows := [][]string{}
-
- for _, p := range ps {
- rows = append(rows, p.ToRow())
- }
-
- renderList(chainHeaders, rows, rt.Writer)
-
- return nil
-}
-
-func StarkNetChainClient(s *Shell) ChainClient {
- return newChainClient[StarkNetChainPresenters](s, "starknet")
-}
diff --git a/core/cmd/starknet_node_commands.go b/core/cmd/starknet_node_commands.go
deleted file mode 100644
index c26bb031145..00000000000
--- a/core/cmd/starknet_node_commands.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package cmd
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// StarkNetNodePresenter implements TableRenderer for a StarkNetNodeResource.
-type StarkNetNodePresenter struct {
- presenters.StarkNetNodeResource
-}
-
-// ToRow presents the StarkNetNodeResource as a slice of strings.
-func (p *StarkNetNodePresenter) ToRow() []string {
- return []string{p.Name, p.ChainID, p.State, p.Config}
-}
-
-// RenderTable implements TableRenderer
-func (p StarkNetNodePresenter) RenderTable(rt RendererTable) error {
- var rows [][]string
- rows = append(rows, p.ToRow())
- renderList(nodeHeaders, rows, rt.Writer)
-
- return nil
-}
-
-// StarkNetNodePresenters implements TableRenderer for a slice of StarkNetNodePresenter.
-type StarkNetNodePresenters []StarkNetNodePresenter
-
-// RenderTable implements TableRenderer
-func (ps StarkNetNodePresenters) RenderTable(rt RendererTable) error {
- var rows [][]string
-
- for _, p := range ps {
- rows = append(rows, p.ToRow())
- }
-
- renderList(nodeHeaders, rows, rt.Writer)
-
- return nil
-}
-
-func NewStarkNetNodeClient(s *Shell) NodeClient {
- return newNodeClient[StarkNetNodePresenters](s, "starknet")
-}
diff --git a/core/cmd/starknet_node_commands_test.go b/core/cmd/starknet_node_commands_test.go
deleted file mode 100644
index dae93682085..00000000000
--- a/core/cmd/starknet_node_commands_test.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package cmd_test
-
-import (
- "bytes"
- "strings"
- "testing"
-
- "github.com/pelletier/go-toml/v2"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- commoncfg "github.com/smartcontractkit/chainlink-common/pkg/config"
- "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/config"
-
- "github.com/smartcontractkit/chainlink/v2/core/cmd"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
-)
-
-func starknetStartNewApplication(t *testing.T, cfgs ...*config.TOMLConfig) *cltest.TestApplication {
- for i := range cfgs {
- cfgs[i].SetDefaults()
- }
- return startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Starknet = cfgs
- c.EVM = nil
- c.Solana = nil
- })
-}
-
-func TestShell_IndexStarkNetNodes(t *testing.T) {
- t.Parallel()
-
- id := "starknet chain ID"
- node1 := config.Node{
- Name: ptr("first"),
- URL: commoncfg.MustParseURL("https://starknet1.example"),
- }
- node2 := config.Node{
- Name: ptr("second"),
- URL: commoncfg.MustParseURL("https://starknet2.example"),
- }
- chain := config.TOMLConfig{
- ChainID: &id,
- Nodes: config.Nodes{&node1, &node2},
- }
- app := starknetStartNewApplication(t, &chain)
- client, r := app.NewShellAndRenderer()
-
- require.Nil(t, cmd.NewStarkNetNodeClient(client).IndexNodes(cltest.EmptyCLIContext()))
- require.NotEmpty(t, r.Renders)
- nodes := *r.Renders[0].(*cmd.StarkNetNodePresenters)
- require.Len(t, nodes, 2)
- n1 := nodes[0]
- n2 := nodes[1]
- assert.Equal(t, id, n1.ChainID)
- assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node1.Name), n1.ID)
- assert.Equal(t, *node1.Name, n1.Name)
- wantConfig, err := toml.Marshal(node1)
- require.NoError(t, err)
- assert.Equal(t, string(wantConfig), n1.Config)
- assert.Equal(t, id, n2.ChainID)
- assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node2.Name), n2.ID)
- assert.Equal(t, *node2.Name, n2.Name)
- wantConfig2, err := toml.Marshal(node2)
- require.NoError(t, err)
- assert.Equal(t, string(wantConfig2), n2.Config)
- assertTableRenders(t, r)
-
- // Render table and check the fields order
- b := new(bytes.Buffer)
- rt := cmd.RendererTable{b}
- require.NoError(t, nodes.RenderTable(rt))
- renderLines := strings.Split(b.String(), "\n")
- assert.Equal(t, 17, len(renderLines))
- assert.Contains(t, renderLines[2], "Name")
- assert.Contains(t, renderLines[2], n1.Name)
- assert.Contains(t, renderLines[3], "Chain ID")
- assert.Contains(t, renderLines[3], n1.ChainID)
- assert.Contains(t, renderLines[4], "State")
- assert.Contains(t, renderLines[4], n1.State)
- assert.Contains(t, renderLines[9], "Name")
- assert.Contains(t, renderLines[9], n2.Name)
- assert.Contains(t, renderLines[10], "Chain ID")
- assert.Contains(t, renderLines[10], n2.ChainID)
- assert.Contains(t, renderLines[11], "State")
- assert.Contains(t, renderLines[11], n2.State)
-}
diff --git a/core/config/database_config.go b/core/config/database_config.go
index f1cdffc2f46..56f8f8165d4 100644
--- a/core/config/database_config.go
+++ b/core/config/database_config.go
@@ -4,7 +4,7 @@ import (
"net/url"
"time"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
)
type Backup interface {
@@ -35,7 +35,7 @@ type Database interface {
DefaultIdleInTxSessionTimeout() time.Duration
DefaultLockTimeout() time.Duration
DefaultQueryTimeout() time.Duration
- Dialect() dialects.DialectName
+ Dialect() pgcommon.DialectName
LogSQL() bool
MaxIdleConns() int
MaxOpenConns() int
diff --git a/core/config/docs/chains-evm.toml b/core/config/docs/chains-evm.toml
index 62360cb02cb..e8adb3d611c 100644
--- a/core/config/docs/chains-evm.toml
+++ b/core/config/docs/chains-evm.toml
@@ -106,6 +106,8 @@ LogBroadcasterEnabled = true # Default
NoNewFinalizedHeadsThreshold = '0' # Default
[EVM.Transactions]
+# Enabled is a feature flag for the Transaction Manager. This flag also enables or disables the gas estimator since it is dependent on the TXM to start it.
+Enabled = true # Default
# ForwardersEnabled enables or disables sending transactions through forwarder contracts.
ForwardersEnabled = false # Default
# MaxInFlight controls how many transactions are allowed to be "in-flight" i.e. broadcast but unconfirmed at any one time. You can consider this a form of transaction throttling.
diff --git a/core/config/docs/chains-solana.toml b/core/config/docs/chains-solana.toml
index c979581b258..c4d757ffa85 100644
--- a/core/config/docs/chains-solana.toml
+++ b/core/config/docs/chains-solana.toml
@@ -17,6 +17,9 @@ TxTimeout = '1m' # Default
TxRetryTimeout = '10s' # Default
# TxConfirmTimeout is the duration to wait when confirming a tx signature, before discarding as unconfirmed.
TxConfirmTimeout = '30s' # Default
+# TxExpirationRebroadcast enables or disables transaction rebroadcast if expired. Expiration check is performed every `ConfirmPollPeriod`
+# A transaction is considered expired if the blockhash it was sent with is 150 blocks older than the latest blockhash.
+TxExpirationRebroadcast = false # Default
# TxRetentionTimeout is the duration to retain transactions in storage after being marked as finalized or errored. Set to 0 to immediately drop transactions.
TxRetentionTimeout = '0s' # Default
# SkipPreflight enables or disables preflight checks when sending txs.
diff --git a/core/config/docs/defaults.go b/core/config/docs/defaults.go
index 53e6433a8ef..0d94be1b3cc 100644
--- a/core/config/docs/defaults.go
+++ b/core/config/docs/defaults.go
@@ -5,9 +5,10 @@ import (
"strings"
"github.com/smartcontractkit/chainlink-common/pkg/config"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
+
"github.com/smartcontractkit/chainlink/v2/core/config/toml"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink/cfgtest"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
)
var (
@@ -22,7 +23,7 @@ func init() {
func CoreDefaults() (c toml.Core) {
c.SetFrom(&defaults)
- c.Database.Dialect = dialects.Postgres // not user visible - overridden for tests only
+ c.Database.Dialect = pgcommon.Postgres // not user visible - overridden for tests only
c.Tracing.Attributes = make(map[string]string)
return
}
diff --git a/core/config/toml/types.go b/core/config/toml/types.go
index 475e95d53df..620f7d96eee 100644
--- a/core/config/toml/types.go
+++ b/core/config/toml/types.go
@@ -16,6 +16,7 @@ import (
ocrcommontypes "github.com/smartcontractkit/libocr/commontypes"
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
"github.com/smartcontractkit/chainlink/v2/core/build"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
@@ -23,10 +24,8 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/config/parse"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
"github.com/smartcontractkit/chainlink/v2/core/sessions"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
"github.com/smartcontractkit/chainlink/v2/core/store/models"
"github.com/smartcontractkit/chainlink/v2/core/utils"
-
configutils "github.com/smartcontractkit/chainlink/v2/core/utils/config"
)
@@ -339,7 +338,7 @@ type Database struct {
DefaultIdleInTxSessionTimeout *commonconfig.Duration
DefaultLockTimeout *commonconfig.Duration
DefaultQueryTimeout *commonconfig.Duration
- Dialect dialects.DialectName `toml:"-"`
+ Dialect pgcommon.DialectName `toml:"-"`
LogQueries *bool
MaxIdleConns *int64
MaxOpenConns *int64
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 884dc9e52e5..e30fb318f9d 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
@@ -81,8 +81,8 @@ type TokenPoolChainUpdate struct {
}
var BurnFromMintTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"localTokenDecimals\",\"type\":\"uint8\"},{\"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\":[],\"name\":\"CannotTransferToSelf\",\"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\":[{\"internalType\":\"uint8\",\"name\":\"expected\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"actual\",\"type\":\"uint8\"}],\"name\":\"InvalidDecimalArgs\",\"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\":\"sourcePoolData\",\"type\":\"bytes\"}],\"name\":\"InvalidRemoteChainDecimals\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidRemotePoolForChain\",\"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\":\"MismatchedArrayLengths\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"remoteDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"localDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"remoteAmount\",\"type\":\"uint256\"}],\"name\":\"OverflowDetected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"PoolAlreadyAdded\",\"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\":false,\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"RateLimitAdminSet\",\"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\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolRemoved\",\"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\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"addRemotePool\",\"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\":[{\"internalType\":\"uint64[]\",\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes[]\",\"name\":\"remotePoolAddresses\",\"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\":\"chainsToAdd\",\"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\":\"getRemotePools\",\"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\":\"getTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"isRemotePool\",\"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\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"removeRemotePool\",\"outputs\":[],\"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\":\"remoteChainSelectors\",\"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\":\"outboundConfigs\",\"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\":\"inboundConfigs\",\"type\":\"tuple[]\"}],\"name\":\"setChainRateLimiterConfigs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"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: "0x6101006040523480156200001257600080fd5b5060405162004ed638038062004ed6833981016040819052620000359162000918565b8484848484336000816200005c57604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008f576200008f8162000206565b50506001600160a01b0385161580620000af57506001600160a01b038116155b80620000c257506001600160a01b038216155b15620000e1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03808616608081905290831660c0526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa92505050801562000151575060408051601f3d908101601f191682019092526200014e9181019062000a3a565b60015b1562000192578060ff168560ff161462000190576040516332ad3e0760e11b815260ff8087166004830152821660248201526044015b60405180910390fd5b505b60ff841660a052600480546001600160a01b0319166001600160a01b038316179055825115801560e052620001dc57604080516000815260208101909152620001dc908462000280565b50620001fb935050506001600160a01b038716905030600019620003dd565b505050505062000b84565b336001600160a01b038216036200023057604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e051620002a1576040516335f4a7b360e01b815260040160405180910390fd5b60005b82518110156200032c576000838281518110620002c557620002c562000a58565b60209081029190910101519050620002df600282620004c3565b1562000322576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101620002a4565b5060005b8151811015620003d857600082828151811062000351576200035162000a58565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200037d5750620003cf565b6200038a600282620004e3565b15620003cd576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010162000330565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200042f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000455919062000a6e565b62000461919062000a9e565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620004bd91869190620004fa16565b50505050565b6000620004da836001600160a01b038416620005cb565b90505b92915050565b6000620004da836001600160a01b038416620006cf565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000549906001600160a01b03851690849062000721565b805190915015620003d857808060200190518101906200056a919062000ab4565b620003d85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000187565b60008181526001830160205260408120548015620006c4576000620005f260018362000adf565b8554909150600090620006089060019062000adf565b9050808214620006745760008660000182815481106200062c576200062c62000a58565b906000526020600020015490508087600001848154811062000652576200065262000a58565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000688576200068862000af5565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620004dd565b6000915050620004dd565b60008181526001830160205260408120546200071857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004dd565b506000620004dd565b60606200073284846000856200073a565b949350505050565b6060824710156200079d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000187565b600080866001600160a01b03168587604051620007bb919062000b31565b60006040518083038185875af1925050503d8060008114620007fa576040519150601f19603f3d011682016040523d82523d6000602084013e620007ff565b606091505b50909250905062000813878383876200081e565b979650505050505050565b60608315620008925782516000036200088a576001600160a01b0385163b6200088a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000187565b508162000732565b620007328383815115620008a95781518083602001fd5b8060405162461bcd60e51b815260040162000187919062000b4f565b6001600160a01b0381168114620008db57600080fd5b50565b805160ff81168114620008f057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b8051620008f081620008c5565b600080600080600060a086880312156200093157600080fd5b85516200093e81620008c5565b945060206200094f878201620008de565b60408801519095506001600160401b03808211156200096d57600080fd5b818901915089601f8301126200098257600080fd5b815181811115620009975762000997620008f5565b8060051b604051601f19603f83011681018181108582111715620009bf57620009bf620008f5565b60405291825284820192508381018501918c831115620009de57600080fd5b938501935b8285101562000a0757620009f7856200090b565b84529385019392850192620009e3565b80985050505050505062000a1e606087016200090b565b915062000a2e608087016200090b565b90509295509295909350565b60006020828403121562000a4d57600080fd5b620004da82620008de565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a8157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115620004dd57620004dd62000a88565b60006020828403121562000ac757600080fd5b8151801515811462000ad857600080fd5b9392505050565b81810381811115620004dd57620004dd62000a88565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000b2857818101518382015260200162000b0e565b50506000910152565b6000825162000b4581846020870162000b0b565b9190910192915050565b602081526000825180602084015262000b7081604085016020870162000b0b565b601f01601f19169190910160400192915050565b60805160a05160c05160e0516142a162000c356000396000818161056d01528181611efa0152612aed01526000818161054701528181611a1701526122d00152600081816102eb01528181610d2101528181611bc001528181611c7a01528181611cae01528181611ce101528181611d4601528181611d9f0152611e41015260008181610252015281816102a70152818161072601528181612453015281816128e10152612cd801526142a16000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a4575b911610104578063c0d78655116100a2578063dc0bd97111610071578063dc0bd97114610545578063e0351e131461056b578063e8a1da1714610591578063f2fde38b146105a457600080fd5b8063c0d78655146104f7578063c4bffe2b1461050a578063c75eea9c1461051f578063cf7401f31461053257600080fd5b8063acfecf91116100de578063acfecf9114610444578063af58d59f14610457578063b0f479a1146104c6578063b7946580146104e457600080fd5b80639a4575b9146103ef578063a42a7b8b1461040f578063a7cd63b71461042f57600080fd5b806354c8a4f31161017c5780637d54534e1161014b5780637d54534e146103985780638926f54f146103ab5780638da5cb5b146103be578063962d4020146103dc57600080fd5b806354c8a4f31461034a57806362ddd3c41461035f5780636d3d1a581461037257806379ba50971461039057600080fd5b8063240028e8116101b8578063240028e81461029757806324f65ee7146102e457806339077537146103155780634c5ef0ed1461033757600080fd5b806301ffc9a7146101df578063181f5a771461020757806321df0da714610250575b600080fd5b6101f26101ed3660046132f6565b6105b7565b60405190151581526020015b60405180910390f35b6102436040518060400160405280601b81526020017f4275726e46726f6d4d696e74546f6b656e506f6f6c20312e352e31000000000081525081565b6040516101fe919061339c565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b6101f26102a53660046133d1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101fe565b6103286103233660046133ee565b61069c565b604051905181526020016101fe565b6101f2610345366004613447565b61086b565b61035d610358366004613516565b6108b5565b005b61035d61036d366004613447565b610930565b60095473ffffffffffffffffffffffffffffffffffffffff16610272565b61035d6109cd565b61035d6103a63660046133d1565b610a9b565b6101f26103b9366004613582565b610b1c565b60015473ffffffffffffffffffffffffffffffffffffffff16610272565b61035d6103ea3660046135e2565b610b33565b6104026103fd36600461367c565b610c8d565b6040516101fe91906136b7565b61042261041d366004613582565b610d66565b6040516101fe919061370e565b610437610ed1565b6040516101fe9190613790565b61035d610452366004613447565b610ee2565b61046a610465366004613582565b610ffa565b6040516101fe919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610272565b6102436104f2366004613582565b6110cf565b61035d6105053660046133d1565b61117f565b61051261125a565b6040516101fe91906137ea565b61046a61052d366004613582565b611312565b61035d610540366004613972565b6113e4565b7f0000000000000000000000000000000000000000000000000000000000000000610272565b7f00000000000000000000000000000000000000000000000000000000000000006101f2565b61035d61059f366004613516565b611468565b61035d6105b23660046133d1565b61197a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061064a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061069657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040805160208101909152600081526106b48261198e565b600061070d60608401356107086106ce60c08701876139b7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bb292505050565b611c76565b905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166340c10f1961075b60608601604087016133d1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b506107f19250505060608401604085016133d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f08360405161084f91815260200190565b60405180910390a3604080516020810190915290815292915050565b60006108ad8383604051610880929190613a1c565b604080519182900390912067ffffffffffffffff8716600090815260076020529190912060050190611e8a565b949350505050565b6108bd611ea5565b61092a84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611ef892505050565b50505050565b610938611ea5565b61094183610b1c565b610988576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6109c88383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120ae92505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a1e576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610aa3611ea5565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d091749060200160405180910390a150565b6000610696600567ffffffffffffffff8416611e8a565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590610b73575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15610bac576040517f8e4a23d600000000000000000000000000000000000000000000000000000000815233600482015260240161097f565b8483141580610bbb5750848114155b15610bf2576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b85811015610c8457610c7c878783818110610c1257610c12613a2c565b9050602002016020810190610c279190613582565b868684818110610c3957610c39613a2c565b905060600201803603810190610c4f9190613a5b565b858585818110610c6157610c61613a2c565b905060600201803603810190610c779190613a5b565b6121a8565b600101610bf5565b50505050505050565b6040805180820190915260608082526020820152610caa82612292565b610cb7826060013561241e565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610d118460200160208101906104f29190613582565b8152602001610d5e6040805160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260609101604051602081830303815290604052905090565b905292915050565b67ffffffffffffffff8116600090815260076020526040812060609190610d8f906005016124c0565b90506000815167ffffffffffffffff811115610dad57610dad61382c565b604051908082528060200260200182016040528015610de057816020015b6060815260200190600190039081610dcb5790505b50905060005b8251811015610ec95760086000848381518110610e0557610e05613a2c565b602002602001015181526020019081526020016000208054610e2690613a77565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5290613a77565b8015610e9f5780601f10610e7457610100808354040283529160200191610e9f565b820191906000526020600020905b815481529060010190602001808311610e8257829003601f168201915b5050505050828281518110610eb657610eb6613a2c565b6020908102919091010152600101610de6565b509392505050565b6060610edd60026124c0565b905090565b610eea611ea5565b610ef383610b1c565b610f35576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161097f565b610f758282604051610f48929190613a1c565b604080519182900390912067ffffffffffffffff86166000908152600760205291909120600501906124cd565b610fb1578282826040517f74f23c7c00000000000000000000000000000000000000000000000000000000815260040161097f93929190613b13565b8267ffffffffffffffff167f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d768383604051610fed929190613b37565b60405180910390a2505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff161515948201949094526003909101548084166060830152919091049091166080820152610696906124d9565b67ffffffffffffffff811660009081526007602052604090206004018054606091906110fa90613a77565b80601f016020809104026020016040519081016040528092919081815260200182805461112690613a77565b80156111735780601f1061114857610100808354040283529160200191611173565b820191906000526020600020905b81548152906001019060200180831161115657829003601f168201915b50505050509050919050565b611187611ea5565b73ffffffffffffffffffffffffffffffffffffffff81166111d4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b6060600061126860056124c0565b90506000815167ffffffffffffffff8111156112865761128661382c565b6040519080825280602002602001820160405280156112af578160200160208202803683370190505b50905060005b825181101561130b578281815181106112d0576112d0613a2c565b60200260200101518282815181106112ea576112ea613a2c565b67ffffffffffffffff909216602092830291909101909101526001016112b5565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff161515948201949094526001909101548084166060830152919091049091166080820152610696906124d9565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590611424575060015473ffffffffffffffffffffffffffffffffffffffff163314155b1561145d576040517f8e4a23d600000000000000000000000000000000000000000000000000000000815233600482015260240161097f565b6109c88383836121a8565b611470611ea5565b60005b8381101561165d57600085858381811061148f5761148f613a2c565b90506020020160208101906114a49190613582565b90506114bb600567ffffffffffffffff83166124cd565b6114fd576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161097f565b67ffffffffffffffff81166000908152600760205260408120611522906005016124c0565b905060005b815181101561158e5761158582828151811061154557611545613a2c565b6020026020010151600760008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206005016124cd90919063ffffffff16565b50600101611527565b5067ffffffffffffffff8216600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906115f76004830182613289565b600582016000818161160982826132c3565b505060405167ffffffffffffffff871681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169450602001925061164b915050565b60405180910390a15050600101611473565b5060005b8181101561197357600083838381811061167d5761167d613a2c565b905060200281019061168f9190613b4b565b61169890613c17565b90506116a98160600151600061258b565b6116b88160800151600061258b565b8060400151516000036116f7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805161170f9060059067ffffffffffffffff166126c8565b6117545780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161097f565b805167ffffffffffffffff16600090815260076020908152604091829020825160a08082018552606080870180518601516fffffffffffffffffffffffffffffffff90811680865263ffffffff42168689018190528351511515878b0181905284518a0151841686890181905294518b0151841660809889018190528954740100000000000000000000000000000000000000009283027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff7001000000000000000000000000000000008087027fffffffffffffffffffffffff000000000000000000000000000000000000000094851690981788178216929092178d5592810290971760018c01558c519889018d52898e0180518d01518716808b528a8e019590955280515115158a8f018190528151909d01518716988a01899052518d0151909516979098018790526002890180549a9091029990931617179094169590951790925590920290911760038201559082015160048201906118d79082613d8e565b5060005b82602001515181101561191b5761191383600001518460200151838151811061190657611906613a2c565b60200260200101516120ae565b6001016118db565b507f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c282600001518360400151846060015185608001516040516119619493929190613ea8565b60405180910390a15050600101611661565b5050505050565b611982611ea5565b61198b816126d4565b50565b6119a16102a560a08301608084016133d1565b611a00576119b560a08201608083016133d1565b6040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161097f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb611a4c6040840160208501613582565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015611abd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae19190613f41565b15611b18576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b30611b2b6040830160208401613582565b612798565b611b50611b436040830160208401613582565b61034560a08401846139b7565b611b9557611b6160a08201826139b7565b6040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161097f929190613b37565b61198b611ba86040830160208401613582565b82606001356128be565b60008151600003611be457507f0000000000000000000000000000000000000000000000000000000000000000919050565b8151602014611c2157816040517f953576f700000000000000000000000000000000000000000000000000000000815260040161097f919061339c565b600082806020019051810190611c379190613f5e565b905060ff81111561069657826040517f953576f700000000000000000000000000000000000000000000000000000000815260040161097f919061339c565b60007f000000000000000000000000000000000000000000000000000000000000000060ff168260ff1603611cac575081610696565b7f000000000000000000000000000000000000000000000000000000000000000060ff168260ff161115611d97576000611d067f000000000000000000000000000000000000000000000000000000000000000084613fa6565b9050604d8160ff161115611d7a576040517fa9cb113d00000000000000000000000000000000000000000000000000000000815260ff80851660048301527f00000000000000000000000000000000000000000000000000000000000000001660248201526044810185905260640161097f565b611d8581600a6140df565b611d8f90856140ee565b915050610696565b6000611dc3837f0000000000000000000000000000000000000000000000000000000000000000613fa6565b9050604d8160ff161180611e0a5750611ddd81600a6140df565b611e07907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6140ee565b84115b15611e75576040517fa9cb113d00000000000000000000000000000000000000000000000000000000815260ff80851660048301527f00000000000000000000000000000000000000000000000000000000000000001660248201526044810185905260640161097f565b611e8081600a6140df565b6108ad9085614129565b600081815260018301602052604081205415155b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611ef6576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f0000000000000000000000000000000000000000000000000000000000000000611f4f576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611fe5576000838281518110611f6f57611f6f613a2c565b60200260200101519050611f8d81600261290590919063ffffffff16565b15611fdc5760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611f52565b5060005b81518110156109c857600082828151811061200657612006613a2c565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361204a57506120a6565b612055600282612927565b156120a45760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611fe9565b80516000036120e9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208083019190912067ffffffffffffffff841660009081526007909252604090912061211b90600501826126c8565b6121555782826040517f393b8ad200000000000000000000000000000000000000000000000000000000815260040161097f929190614140565b600081815260086020526040902061216d8382613d8e565b508267ffffffffffffffff167f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea83604051610fed919061339c565b6121b183610b1c565b6121f3576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161097f565b6121fe82600061258b565b67ffffffffffffffff831660009081526007602052604090206122219083612949565b61222c81600061258b565b67ffffffffffffffff831660009081526007602052604090206122529060020182612949565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b83838360405161228593929190614163565b60405180910390a1505050565b6122a56102a560a08301608084016133d1565b6122b9576119b560a08201608083016133d1565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb6123056040840160208501613582565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015612376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239a9190613f41565b156123d1576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123e96123e460608301604084016133d1565b612aeb565b6124016123fc6040830160208401613582565b612b6a565b61198b6124146040830160208401613582565b8260600135612cb8565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b1580156124ac57600080fd5b505af1158015611973573d6000803e3d6000fd5b60606000611e9e83612cfc565b6000611e9e8383612d57565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261256782606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261254b91906141e6565b85608001516fffffffffffffffffffffffffffffffff16612e4a565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b8151156126565781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff161015806125e1575060408201516fffffffffffffffffffffffffffffffff16155b1561261a57816040517f8020d12400000000000000000000000000000000000000000000000000000000815260040161097f91906141f9565b8015612652576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60408201516fffffffffffffffffffffffffffffffff1615158061268f575060208201516fffffffffffffffffffffffffffffffff1615155b1561265257816040517fd68af9cc00000000000000000000000000000000000000000000000000000000815260040161097f91906141f9565b6000611e9e8383612e72565b3373ffffffffffffffffffffffffffffffffffffffff821603612723576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6127a181610b1c565b6127e3576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161097f565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128869190613f41565b61198b576040517f728fe07b00000000000000000000000000000000000000000000000000000000815233600482015260240161097f565b67ffffffffffffffff8216600090815260076020526040902061265290600201827f0000000000000000000000000000000000000000000000000000000000000000612ec1565b6000611e9e8373ffffffffffffffffffffffffffffffffffffffff8416612d57565b6000611e9e8373ffffffffffffffffffffffffffffffffffffffff8416612e72565b815460009061297290700100000000000000000000000000000000900463ffffffff16426141e6565b90508015612a1457600183015483546129ba916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612e4a565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612a3a916fffffffffffffffffffffffffffffffff9081169116613244565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906122859084906141f9565b7f00000000000000000000000000000000000000000000000000000000000000001561198b57612b1c60028261325a565b61198b576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260240161097f565b612b7381610b1c565b612bb5576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161097f565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c529190614235565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461198b576040517f728fe07b00000000000000000000000000000000000000000000000000000000815233600482015260240161097f565b67ffffffffffffffff8216600090815260076020526040902061265290827f0000000000000000000000000000000000000000000000000000000000000000612ec1565b60608160000180548060200260200160405190810160405280929190818152602001828054801561117357602002820191906000526020600020905b815481526020019060010190808311612d385750505050509050919050565b60008181526001830160205260408120548015612e40576000612d7b6001836141e6565b8554909150600090612d8f906001906141e6565b9050808214612df4576000866000018281548110612daf57612daf613a2c565b9060005260206000200154905080876000018481548110612dd257612dd2613a2c565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612e0557612e05614252565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610696565b6000915050610696565b6000612e6985612e5a8486614129565b612e649087614281565b613244565b95945050505050565b6000818152600183016020526040812054612eb957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610696565b506000610696565b825474010000000000000000000000000000000000000000900460ff161580612ee8575081155b15612ef257505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612f3890700100000000000000000000000000000000900463ffffffff16426141e6565b90508015612ff85781831115612f7a576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612fb49083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612e4a565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156130af5773ffffffffffffffffffffffffffffffffffffffff8416613057576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161097f565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161097f565b848310156131c25760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906130f390826141e6565b6130fd878a6141e6565b6131079190614281565b61311191906140ee565b905073ffffffffffffffffffffffffffffffffffffffff861661316a576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161097f565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161097f565b6131cc85846141e6565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008183106132535781611e9e565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611e9e565b50805461329590613a77565b6000825580601f106132a5575050565b601f01602090049060005260206000209081019061198b91906132dd565b508054600082559060005260206000209081019061198b91905b5b808211156132f257600081556001016132de565b5090565b60006020828403121561330857600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9e57600080fd5b6000815180845260005b8181101561335e57602081850181015186830182015201613342565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000611e9e6020830184613338565b73ffffffffffffffffffffffffffffffffffffffff8116811461198b57600080fd5b6000602082840312156133e357600080fd5b8135611e9e816133af565b60006020828403121561340057600080fd5b813567ffffffffffffffff81111561341757600080fd5b82016101008185031215611e9e57600080fd5b803567ffffffffffffffff8116811461344257600080fd5b919050565b60008060006040848603121561345c57600080fd5b6134658461342a565b9250602084013567ffffffffffffffff8082111561348257600080fd5b818601915086601f83011261349657600080fd5b8135818111156134a557600080fd5b8760208285010111156134b757600080fd5b6020830194508093505050509250925092565b60008083601f8401126134dc57600080fd5b50813567ffffffffffffffff8111156134f457600080fd5b6020830191508360208260051b850101111561350f57600080fd5b9250929050565b6000806000806040858703121561352c57600080fd5b843567ffffffffffffffff8082111561354457600080fd5b613550888389016134ca565b9096509450602087013591508082111561356957600080fd5b50613576878288016134ca565b95989497509550505050565b60006020828403121561359457600080fd5b611e9e8261342a565b60008083601f8401126135af57600080fd5b50813567ffffffffffffffff8111156135c757600080fd5b60208301915083602060608302850101111561350f57600080fd5b600080600080600080606087890312156135fb57600080fd5b863567ffffffffffffffff8082111561361357600080fd5b61361f8a838b016134ca565b9098509650602089013591508082111561363857600080fd5b6136448a838b0161359d565b9096509450604089013591508082111561365d57600080fd5b5061366a89828a0161359d565b979a9699509497509295939492505050565b60006020828403121561368e57600080fd5b813567ffffffffffffffff8111156136a557600080fd5b820160a08185031215611e9e57600080fd5b6020815260008251604060208401526136d36060840182613338565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612e698282613338565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015613783577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613771858351613338565b94509285019290850190600101613737565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137de57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016137ac565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137de57835167ffffffffffffffff1683529284019291840191600101613806565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561387e5761387e61382c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138cb576138cb61382c565b604052919050565b801515811461198b57600080fd5b80356fffffffffffffffffffffffffffffffff8116811461344257600080fd5b60006060828403121561391357600080fd5b6040516060810181811067ffffffffffffffff821117156139365761393661382c565b6040529050808235613947816138d3565b8152613955602084016138e1565b6020820152613966604084016138e1565b60408201525092915050565b600080600060e0848603121561398757600080fd5b6139908461342a565b925061399f8560208601613901565b91506139ae8560808601613901565b90509250925092565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139ec57600080fd5b83018035915067ffffffffffffffff821115613a0757600080fd5b60200191503681900382131561350f57600080fd5b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060608284031215613a6d57600080fd5b611e9e8383613901565b600181811c90821680613a8b57607f821691505b602082108103613ac4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b67ffffffffffffffff84168152604060208201526000612e69604083018486613aca565b6020815260006108ad602083018486613aca565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1833603018112613b7f57600080fd5b9190910192915050565b600082601f830112613b9a57600080fd5b813567ffffffffffffffff811115613bb457613bb461382c565b613be560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613884565b818152846020838601011115613bfa57600080fd5b816020850160208301376000918101602001919091529392505050565b60006101208236031215613c2a57600080fd5b613c3261385b565b613c3b8361342a565b815260208084013567ffffffffffffffff80821115613c5957600080fd5b9085019036601f830112613c6c57600080fd5b813581811115613c7e57613c7e61382c565b8060051b613c8d858201613884565b9182528381018501918581019036841115613ca757600080fd5b86860192505b83831015613ce357823585811115613cc55760008081fd5b613cd33689838a0101613b89565b8352509186019190860190613cad565b8087890152505050506040860135925080831115613d0057600080fd5b5050613d0e36828601613b89565b604083015250613d213660608501613901565b6060820152613d333660c08501613901565b608082015292915050565b601f8211156109c8576000816000526020600020601f850160051c81016020861015613d675750805b601f850160051c820191505b81811015613d8657828155600101613d73565b505050505050565b815167ffffffffffffffff811115613da857613da861382c565b613dbc81613db68454613a77565b84613d3e565b602080601f831160018114613e0f5760008415613dd95750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613d86565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e5c57888601518255948401946001909101908401613e3d565b5085821015613e9857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613ecc81840187613338565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613f0a9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612e69565b600060208284031215613f5357600080fd5b8151611e9e816138d3565b600060208284031215613f7057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff828116828216039081111561069657610696613f77565b600181815b8085111561401857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613ffe57613ffe613f77565b8085161561400b57918102915b93841c9390800290613fc4565b509250929050565b60008261402f57506001610696565b8161403c57506000610696565b8160018114614052576002811461405c57614078565b6001915050610696565b60ff84111561406d5761406d613f77565b50506001821b610696565b5060208310610133831016604e8410600b841016171561409b575081810a610696565b6140a58383613fbf565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156140d7576140d7613f77565b029392505050565b6000611e9e60ff841683614020565b600082614124577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761069657610696613f77565b67ffffffffffffffff831681526040602082015260006108ad6040830184613338565b67ffffffffffffffff8416815260e081016141af60208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526108ad565b8181038181111561069657610696613f77565b6060810161069682848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561424757600080fd5b8151611e9e816133af565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8082018082111561069657610696613f7756fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIBurnMintERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x610100806040523461035457614bb5803803809161001d82856105b2565b8339810160a0828203126103545781516001600160a01b03811692908390036103545761004c602082016105d5565b60408201516001600160401b0381116103545782019280601f85011215610354578351936001600160401b038511610359578460051b90602082019561009560405197886105b2565b865260208087019282010192831161035457602001905b82821061059a575050506100ce60806100c7606085016105e3565b93016105e3565b91331561058957600180546001600160a01b0319163317905584158015610578575b8015610567575b61055657608085905260c05260405163313ce56760e01b8152602081600481885afa6000918161051a575b506104ef575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526103d2575b50604051636eb1769f60e11b81523060048201819052602482015290602082604481845afa9182156103c657600092610392575b50600019820180921161037c57604051602081019263095ea7b360e01b84523060248301526044820152604481526101c76064826105b2565b6000806040948551936101da87866105b2565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082865af13d1561036f573d906001600160401b03821161035957845161024b94909261023c601f8201601f1916602001856105b2565b83523d6000602085013e610781565b8051806102d9575b8251614363908161085282396080518181816115fc015281816117e80152818161220e015281816123ea01528181612707015261277f015260a0518181816118a90152818161268e0152818161316801526131eb015260c051818181610bd50152818161169801526122a9015260e051818181610b65015281816116db01526120050152f35b81602091810103126103545760200151801590811503610354576102fe573880610253565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b9161024b92606091610781565b634e487b7160e01b600052601160045260246000fd5b9091506020813d6020116103be575b816103ae602093836105b2565b810103126103545751903861018e565b3d91506103a1565b6040513d6000823e3d90fd5b60206040516103e182826105b2565b60008152600036813760e051156104de5760005b815181101561045c576001906001600160a01b0361041382856105f7565b51168461041f82610639565b61042c575b5050016103f5565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13884610424565b505060005b82518110156104d5576001906001600160a01b0361047f82866105f7565b511680156104cf578361049182610721565b61049f575b50505b01610461565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a13883610496565b50610499565b5050503861015a565b6335f4a7b360e01b60005260046000fd5b60ff1660ff82168181036105035750610128565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161054e575b81610536602093836105b2565b8101031261035457610547906105d5565b9038610122565b3d9150610529565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038116156100f7565b506001600160a01b038316156100f0565b639b15e16f60e01b60005260046000fd5b602080916105a7846105e3565b8152019101906100ac565b601f909101601f19168101906001600160401b0382119082101761035957604052565b519060ff8216820361035457565b51906001600160a01b038216820361035457565b805182101561060b5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561060b5760005260206000200190600090565b600081815260036020526040902054801561071a57600019810181811161037c5760025460001981019190821161037c578181036106c9575b50505060025480156106b3576000190161068d816002610621565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6107026106da6106eb936002610621565b90549060031b1c9283926002610621565b819391549060031b91821b91600019901b19161790565b90556000526003602052604060002055388080610672565b5050600090565b8060005260036020526040600020541560001461077b5760025468010000000000000000811015610359576107626106eb8260018594016002556002610621565b9055600254906000526003602052604060002055600190565b50600090565b919290156107e35750815115610795575090565b3b1561079e5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156107f65750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b8381106108395750508160006044809484010152601f80199101168101030190fd5b6020828201810151604487840101528593500161081756fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461282257508063181f5a77146127a357806321df0da714612734578063240028e8146126b257806324f65ee71461265657806339077537146121685780634c5ef0ed1461214e57806354c8a4f314611fd157806362ddd3c414611f4d5780636d3d1a5814611efb57806379ba509714611e165780637d54534e14611d695780638926f54f14611d055780638da5cb5b14611cb3578063962d402014611b0f5780639a4575b914611554578063a42a7b8b146113cf578063a7cd63b714611303578063acfecf91146111df578063af58d59f14611178578063b0f479a114611126578063b7946580146110cf578063c0d7865514610fd7578063c4bffe2b14610e8e578063c75eea9c14610dc8578063cf7401f314610bf9578063dc0bd97114610b8a578063e0351e1314610b2f578063e8a1da171461025a5763f2fde38b1461016b57600080fd5b346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff6101b7612a50565b6101bf6132f5565b1633811461022f57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102575761026936612b3e565b939190926102756132f5565b82915b80831061099a575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b85821015610996578160051b85013581811215610992578501906101208236031261099257604051956102e387612978565b823567ffffffffffffffff8116810361098d578752602083013567ffffffffffffffff81116109895783019536601f880112156109895786359661032688612d6a565b97610334604051998a6129b0565b8089526020808a019160051b830101903682116109855760208301905b828210610952575050505060208801968752604084013567ffffffffffffffff811161094e5761038490369086016130c2565b9860408901998a526103ae61039c3660608801612bfc565b9560608b0196875260c0369101612bfc565b9660808a019788526103c0865161376c565b6103ca885161376c565b8a515115610926576103e667ffffffffffffffff8b5116613fbf565b156108ef5767ffffffffffffffff8a5116815260076020526040812061052687516fffffffffffffffffffffffffffffffff604082015116906104e16fffffffffffffffffffffffffffffffff6020830151169151151583608060405161044c81612978565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b61064c89516fffffffffffffffffffffffffffffffff604082015116906106076fffffffffffffffffffffffffffffffff6020830151169151151583608060405161057081612978565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff82116108c25761066f8354612e62565b601f8111610887575b50602090601f83116001146107e8576106c692918591836107dd575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b8951805182101561070157906106fb6001926106f4838f67ffffffffffffffff90511692612e4e565b5190613340565b016106cb565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2929593966107cf67ffffffffffffffff600197949c511692519351915161079b610766604051968796875261010060208801526101008701906129f1565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a10190939492916102b1565b015190503880610694565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b81811061086f5750908460019594939210610838575b505050811b0190556106c9565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061082b565b92936020600181928786015181550195019301610815565b6108b29084865260208620601f850160051c810191602086106108b8575b601f0160051c0190613069565b38610678565b90915081906108a5565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff81116109815760209161097683928336918901016130c2565b815201910190610351565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff6109ba6109b5878588612dea565b612e29565b16956109c587613cf3565b15610b035786845260076020526109e160056040862001613afa565b94845b8651811015610a1a576001908987526007602052610a1360056040892001610a0c838b612e4e565b5190613e1e565b50016109e4565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610a538154612e62565b80610ac2575b5050500180549086815581610aa4575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a1019190949394610278565b865260208620908101905b81811015610a6957868155600101610aaf565b601f8111600114610ad85750555b863880610a59565b81835260208320610af391601f01861c810190600101613069565b8082528160208120915555610ad0565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610c31612a73565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261025757604051610c6881612994565b6024358015158103610dc45781526044356fffffffffffffffffffffffffffffffff81168103610dc45760208201526064356fffffffffffffffffffffffffffffffff81168103610dc457604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610dc05760405190610cef82612994565b608435801515810361099257825260a4356fffffffffffffffffffffffffffffffff8116810361099257602083015260c4356fffffffffffffffffffffffffffffffff8116810361099257604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610d9e575b610d7257610d6f92936135aa565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610d61565b5080fd5b8280fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c6040610e8a9367ffffffffffffffff610e15612a73565b610e1d612fb6565b50168152600760205220612fe1565b6136e7565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051906005548083528260208101600584526020842092845b818110610fbe575050610eec925003836129b0565b8151610f10610efa82612d6a565b91610f0860405193846129b0565b808352612d6a565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015610f6f578067ffffffffffffffff610f5c60019388612e4e565b5116610f688286612e4e565b5201610f3d565b50925090604051928392602084019060208552518091526040840192915b818110610f9b575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101610f8d565b8454835260019485019487945060209093019201610ed7565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff611024612a50565b61102c6132f5565b1680156110a75760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e8a61111261110d612a73565b613047565b6040519182916020835260208301906129f1565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c60026040610e8a9467ffffffffffffffff6111c7612a73565b6111cf612fb6565b5016815260076020522001612fe1565b50346102575767ffffffffffffffff6111f736612a8a565b9290916112026132f5565b169161121b836000526006602052604060002054151590565b156112d757828452600760205261124a6005604086200161123d368486612c99565b6020815191012090613e1e565b1561128f57907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691611289604051928392602084526020840191612f77565b0390a280f35b826112d3836040519384937f74f23c7c0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191612f77565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051600254808252602082018091600285526020852090855b8181106113b957505050826113629103836129b0565b604051928392602084019060208552518091526040840192915b81811061138a575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff1684528594506020938401939092019160010161137c565b825484526020909301926001928301920161134c565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575767ffffffffffffffff611410612a73565b168152600760205261142760056040832001613afa565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061146c61145683612d6a565b9261146460405194856129b0565b808452612d6a565b01835b818110611543575050825b82518110156114c0578061149060019285612e4e565b51855260086020526114a460408620612eb5565b6114ae8285612e4e565b526114b98184612e4e565b500161147a565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b8282106114f857505050500390f35b91936020611533827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0600195979984950301865288516129f1565b96019201920185949391926114e9565b80606060208093860101520161146f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc05760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610dc057606060206040516115d28161295c565b8281520152608481016115e481612cfe565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611ac55750602481019177ffffffffffffffff0000000000000000000000000000000061164b84612e29565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611955578291611a96575b50611a6e576116d960448301612cfe565b7f0000000000000000000000000000000000000000000000000000000000000000611a1b575b5067ffffffffffffffff61171284612e29565b1661172a816000526006602052604060002054151590565b156119ef57602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa801561195557829061198c575b73ffffffffffffffffffffffffffffffffffffffff91501633036119605767ffffffffffffffff60646117bd85612e29565b930135921681526007602052816118106040832073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692839161406e565b803b15610dc0576040517f79cc6790000000000000000000000000000000000000000000000000000000008152306004820152602481018490529082908290604490829084905af1801561195557611940575b61190f61189f61110d86866040519081527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df760203392a2612e29565b610e8a60405160ff7f0000000000000000000000000000000000000000000000000000000000000000166020820152602081526118dd6040826129b0565b604051926118ea8461295c565b83526020830190815260405193849360208552516040602086015260608501906129f1565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526129f1565b61194b8280926129b0565b6102575780611863565b6040513d84823e3d90fd5b807f728fe07b000000000000000000000000000000000000000000000000000000006024925233600452fd5b506020813d6020116119e7575b816119a6602093836129b0565b81010312610dc0575173ffffffffffffffffffffffffffffffffffffffff81168103610dc05773ffffffffffffffffffffffffffffffffffffffff9061178b565b3d9150611999565b602492507fa9902c7e000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16808252600360205260408220546116ff57602492507fd0d25976000000000000000000000000000000000000000000000000000000008252600452fd5b807f53ad11d80000000000000000000000000000000000000000000000000000000060049252fd5b611ab8915060203d602011611abe575b611ab081836129b0565b8101906130dd565b386116c8565b503d611aa6565b8273ffffffffffffffffffffffffffffffffffffffff611ae6602493612cfe565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b50346102575760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057611b5f903690600401612b0d565b60243567ffffffffffffffff811161099257611b7f903690600401612bae565b60449291923567ffffffffffffffff811161098957611ba2903690600401612bae565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611c91575b611c6557818114801590611c5b575b611c3357865b818110611be7578780f35b80611c2d611bfb6109b5600194868c612dea565b611c0683878b612e3e565b611c27611c1f611c17868b8d612e3e565b923690612bfc565b913690612bfc565b916135aa565b01611bdc565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611bd6565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611bc7565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020611d5f67ffffffffffffffff611d4b612a73565b166000526006602052604060002054151590565b6040519015158152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611dd9612a50565b611de16132f5565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757805473ffffffffffffffffffffffffffffffffffffffff81163303611ed3577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b503461025757611f5c36612a8a565b611f68939291936132f5565b67ffffffffffffffff8216611f8a816000526006602052604060002054151590565b15611fa65750610d6f9293611fa0913691612c99565b90613340565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b503461025757611ffb90612003611fe736612b3e565b9591611ff49391936132f5565b3691612d82565b933691612d82565b7f00000000000000000000000000000000000000000000000000000000000000001561212657815b835181101561209e578073ffffffffffffffffffffffffffffffffffffffff61205660019387612e4e565b511661206181613b5d565b61206d575b500161202b565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a138612066565b5090805b8251811015612122578073ffffffffffffffffffffffffffffffffffffffff6120cd60019386612e4e565b5116801561211c576120de81613f5f565b6120eb575b505b016120a2565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1846120e3565b506120e5565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b5034610257576020611d5f61216236612a8a565b91612d1f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610dc457826040516121e881612911565b52608482016121f681612cfe565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361263557506024820177ffffffffffffffff0000000000000000000000000000000061225c82612e29565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156125b8578591612616575b506125ee5767ffffffffffffffff6122f082612e29565b16612308816000526006602052604060002054151590565b156125c357602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156125b8578591612599575b501561256d5761237f81612e29565b61239160a48501916121628386612c48565b15612526575061242e67ffffffffffffffff9261242861242361241c6123b8604496612e29565b936064890135978895168a526007602052612412600260408c200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016998a9161406e565b60c4890190612c48565b3691612c99565b6130f5565b906131e8565b9201908361243b83612cfe565b823b15610dc0576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91909116600482015260248101859052918290604490829084905af1801561251b57916020946124c99273ffffffffffffffffffffffffffffffffffffffff9461250b575b5050612cfe565b166040518281527f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0843392a38060405161250281612911565b52604051908152f35b81612515916129b0565b386124c2565b6040513d86823e3d90fd5b6125309083612c48565b6112d36040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452602060048501526024840191612f77565b6024847f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b6125b2915060203d602011611abe57611ab081836129b0565b38612370565b6040513d87823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008552600452602484fd5b6004847f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b61262f915060203d602011611abe57611ab081836129b0565b386122d9565b8373ffffffffffffffffffffffffffffffffffffffff611ae6602493612cfe565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020906126ed612a50565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575750610e8a6040516127e46040826129b0565b601b81527f4275726e46726f6d4d696e74546f6b656e506f6f6c20312e352e31000000000060208201526040519182916020835260208301906129f1565b905034610dc05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610dc0576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610dc457602092507faff2afbf0000000000000000000000000000000000000000000000000000000081149081156128e7575b81156128bd575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386128b6565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506128af565b6020810190811067ffffffffffffffff82111761292d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761292d57604052565b60a0810190811067ffffffffffffffff82111761292d57604052565b6060810190811067ffffffffffffffff82111761292d57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761292d57604052565b919082519283825260005b848110612a3b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016129fc565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361098d57565b6004359067ffffffffffffffff8216820361098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff8116810361098d579160243567ffffffffffffffff811161098d578260238201121561098d5780600401359267ffffffffffffffff841161098d576024848301011161098d576024019190565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501948460051b01011161098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff811161098d5781612b8791600401612b0d565b929092916024359067ffffffffffffffff821161098d57612baa91600401612b0d565b9091565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501946060850201011161098d57565b35906fffffffffffffffffffffffffffffffff8216820361098d57565b919082606091031261098d57604051612c1481612994565b8092803590811515820361098d576040612c439181938552612c3860208201612bdf565b602086015201612bdf565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561098d570180359067ffffffffffffffff821161098d5760200191813603831361098d57565b92919267ffffffffffffffff821161292d5760405191612ce1601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846129b0565b82948184528183011161098d578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff8116810361098d5790565b612d67929167ffffffffffffffff612d4a921660005260076020526005604060002001923691612c99565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff811161292d5760051b60200190565b9291612d8d82612d6a565b93612d9b60405195866129b0565b602085848152019260051b810191821161098d57915b818310612dbd57505050565b823573ffffffffffffffffffffffffffffffffffffffff8116810361098d57815260209283019201612db1565b9190811015612dfa5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff8116810361098d5790565b9190811015612dfa576060020190565b8051821015612dfa5760209160051b010190565b90600182811c92168015612eab575b6020831014612e7c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612e71565b9060405191826000825492612ec984612e62565b8084529360018116908115612f375750600114612ef0575b50612eee925003836129b0565b565b90506000929192526020600020906000915b818310612f1b575050906020612eee9282010138612ee1565b6020919350806001915483858901015201910190918492612f02565b60209350612eee9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612ee1565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60405190612fc382612978565b60006080838281528260208201528260408201528260608201520152565b90604051612fee81612978565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff166000526007602052612d676004604060002001612eb5565b818110613074575050565b60008155600101613069565b8181029291811591840414171561309357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f8301121561098d57816020612d6793359101612c99565b9081602091031261098d5751801515810361098d5790565b80518015613164576020036131265760208180518101031261098d5760208101519060ff8211613126575060ff1690565b6112d3906040519182917f953576f70000000000000000000000000000000000000000000000000000000083526020600484015260248301906129f1565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161309357565b60ff16604d811161309357600a0a90565b81156131b9570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146132ee578284116132c4579061322d9161318a565b91604d60ff841611801561328b575b6132555750509061324f612d679261319e565b90613080565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b506132958361319e565b80156131b9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04841161323c565b6132cd9161318a565b91604d60ff841611613255575050906132e8612d679261319e565b906131af565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff60015416330361331657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156135805767ffffffffffffffff81516020830120921691826000526007602052613375816005604060002001614019565b1561353c5760005260086020526040600020815167ffffffffffffffff811161292d576133a28254612e62565b601f811161350a575b506020601f8211600114613444579161341e827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea959361343495600091613439575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90556040519182916020835260208301906129f1565b0390a2565b9050840151386133ed565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106134f25750926134349492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9896106134bb575b5050811b019055611112565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538806134af565b9192602060018192868a015181550194019201613474565b61353690836000526020600020601f840160051c810191602085106108b857601f0160051c0190613069565b386133ab565b50906112d36040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401526040602484015260448301906129f1565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff1660008181526006602052604090205490929190156136ac57916136a960e092613675856136017f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761376c565b8460005260076020526136188160406000206138c7565b6136218361376c565b84600052600760205261363b8360026040600020016138c7565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161309357565b6136ef612fb6565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161374c602085019361374661373963ffffffff875116426136da565b8560808901511690613080565b90613f52565b8082101561376557505b16825263ffffffff4216905290565b9050613756565b805115613820576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116811090811591613817575b506137b45750565b606490613815604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b905015386137ac565b6fffffffffffffffffffffffffffffffff604082015116158015906138a8575b6138475750565b606490613815604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613840565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1991613a00606092805461390463ffffffff8260801c16426136da565b9081613a3f575b50506fffffffffffffffffffffffffffffffff6001816020860151169282815416808510600014613a3757508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556139b48651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b6136a960405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161393b565b6fffffffffffffffffffffffffffffffff91613a74839283613a6d6001880154948286169560801c90613080565b9116613f52565b80821015613af357505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff0000000000000000000000000000000016178155388061390b565b9050613a7e565b906040519182815491828252602082019060005260206000209260005b818110613b2c575050612eee925003836129b0565b8454835260019485019487945060209093019201613b17565b8054821015612dfa5760005260206000200190600090565b6000818152600360205260409020548015613cec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161309357600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613c7d575b5050506002548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613c0b816002613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613cd4613c8e613c9f936002613b45565b90549060031b1c9283926002613b45565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526003602052604060002055388080613bd2565b5050600090565b6000818152600660205260409020548015613cec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161309357600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613de4575b5050506005548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613da1816005613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b613e06613df5613c9f936005613b45565b90549060031b1c9283926005613b45565b90556000526006602052604060002055388080613d68565b9060018201918160005282602052604060002054801515600014613f49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613093578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613f12575b50505080548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613ed38282613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b613f32613f22613c9f9386613b45565b90549060031b1c92839286613b45565b905560005283602052604060002055388080613e9b565b50505050600090565b9190820180921161309357565b80600052600360205260406000205415600014613fb9576002546801000000000000000081101561292d57613fa0613c9f8260018594016002556002613b45565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014613fb9576005546801000000000000000081101561292d57614000613c9f8260018594016005556005613b45565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054613cec578054906801000000000000000082101561292d5782614057613c9f846001809601855584613b45565b905580549260005201602052604060002055600190565b929192805460ff8160a01c1615801561434e575b614347576fffffffffffffffffffffffffffffffff811690600183019081546140c763ffffffff6fffffffffffffffffffffffffffffffff83169360801c16426136da565b90816142a9575b5050848110614227575083821061415657507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff8061412485602096956136da565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061416892505460801c926136da565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613093576141b66141bb9273ffffffffffffffffffffffffffffffffffffffff94613f52565b6131af565b92169182156141f7577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614279577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b82859293951161431d576142c4926137469160801c90613080565b808310156143185750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806140ce565b6142cf565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b50821561408256fea164736f6c634300081a000a",
}
var BurnFromMintTokenPoolABI = BurnFromMintTokenPoolMetaData.ABI
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 d789ab8e3bf..d79eab1236b 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
@@ -81,8 +81,8 @@ type TokenPoolChainUpdate struct {
}
var BurnMintTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"localTokenDecimals\",\"type\":\"uint8\"},{\"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\":[],\"name\":\"CannotTransferToSelf\",\"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\":[{\"internalType\":\"uint8\",\"name\":\"expected\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"actual\",\"type\":\"uint8\"}],\"name\":\"InvalidDecimalArgs\",\"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\":\"sourcePoolData\",\"type\":\"bytes\"}],\"name\":\"InvalidRemoteChainDecimals\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidRemotePoolForChain\",\"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\":\"MismatchedArrayLengths\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"remoteDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"localDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"remoteAmount\",\"type\":\"uint256\"}],\"name\":\"OverflowDetected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"PoolAlreadyAdded\",\"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\":false,\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"RateLimitAdminSet\",\"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\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolRemoved\",\"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\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"addRemotePool\",\"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\":[{\"internalType\":\"uint64[]\",\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes[]\",\"name\":\"remotePoolAddresses\",\"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\":\"chainsToAdd\",\"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\":\"getRemotePools\",\"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\":\"getTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"isRemotePool\",\"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\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"removeRemotePool\",\"outputs\":[],\"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\":\"remoteChainSelectors\",\"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\":\"outboundConfigs\",\"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\":\"inboundConfigs\",\"type\":\"tuple[]\"}],\"name\":\"setChainRateLimiterConfigs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"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: "0x6101006040523480156200001257600080fd5b5060405162004a7c38038062004a7c8339810160408190526200003591620005a2565b8484848484336000816200005c57604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008f576200008f81620001eb565b50506001600160a01b0385161580620000af57506001600160a01b038116155b80620000c257506001600160a01b038216155b15620000e1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03808616608081905290831660c0526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa92505050801562000151575060408051601f3d908101601f191682019092526200014e91810190620006c4565b60015b1562000191578060ff168560ff16146200018f576040516332ad3e0760e11b815260ff80871660048301528216602482015260440160405180910390fd5b505b60ff841660a052600480546001600160a01b0319166001600160a01b038316179055825115801560e052620001db57604080516000815260208101909152620001db908462000265565b5050505050505050505062000730565b336001600160a01b038216036200021557604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e05162000286576040516335f4a7b360e01b815260040160405180910390fd5b60005b825181101562000311576000838281518110620002aa57620002aa620006e2565b60209081029190910101519050620002c4600282620003c2565b1562000307576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010162000289565b5060005b8151811015620003bd576000828281518110620003365762000336620006e2565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003625750620003b4565b6200036f600282620003e2565b15620003b2576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010162000315565b505050565b6000620003d9836001600160a01b038416620003f9565b90505b92915050565b6000620003d9836001600160a01b038416620004fd565b60008181526001830160205260408120548015620004f257600062000420600183620006f8565b85549091506000906200043690600190620006f8565b9050808214620004a25760008660000182815481106200045a576200045a620006e2565b9060005260206000200154905080876000018481548110620004805762000480620006e2565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620004b657620004b66200071a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620003dc565b6000915050620003dc565b60008181526001830160205260408120546200054657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003dc565b506000620003dc565b6001600160a01b03811681146200056557600080fd5b50565b805160ff811681146200057a57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b80516200057a816200054f565b600080600080600060a08688031215620005bb57600080fd5b8551620005c8816200054f565b94506020620005d987820162000568565b60408801519095506001600160401b0380821115620005f757600080fd5b818901915089601f8301126200060c57600080fd5b8151818111156200062157620006216200057f565b8060051b604051601f19603f830116810181811085821117156200064957620006496200057f565b60405291825284820192508381018501918c8311156200066857600080fd5b938501935b828510156200069157620006818562000595565b845293850193928501926200066d565b809850505050505050620006a86060870162000595565b9150620006b86080870162000595565b90509295509295909350565b600060208284031215620006d757600080fd5b620003d98262000568565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003dc57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e05161429b620007e16000396000818161056d01528181611efa0152612ae701526000818161054701528181611a1701526122d00152600081816102eb01528181610d2101528181611bc001528181611c7a01528181611cae01528181611ce101528181611d4601528181611d9f0152611e41015260008181610252015281816102a7015281816107260152818161244d015281816128db0152612cd2015261429b6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a4575b911610104578063c0d78655116100a2578063dc0bd97111610071578063dc0bd97114610545578063e0351e131461056b578063e8a1da1714610591578063f2fde38b146105a457600080fd5b8063c0d78655146104f7578063c4bffe2b1461050a578063c75eea9c1461051f578063cf7401f31461053257600080fd5b8063acfecf91116100de578063acfecf9114610444578063af58d59f14610457578063b0f479a1146104c6578063b7946580146104e457600080fd5b80639a4575b9146103ef578063a42a7b8b1461040f578063a7cd63b71461042f57600080fd5b806354c8a4f31161017c5780637d54534e1161014b5780637d54534e146103985780638926f54f146103ab5780638da5cb5b146103be578063962d4020146103dc57600080fd5b806354c8a4f31461034a57806362ddd3c41461035f5780636d3d1a581461037257806379ba50971461039057600080fd5b8063240028e8116101b8578063240028e81461029757806324f65ee7146102e457806339077537146103155780634c5ef0ed1461033757600080fd5b806301ffc9a7146101df578063181f5a771461020757806321df0da714610250575b600080fd5b6101f26101ed3660046132f0565b6105b7565b60405190151581526020015b60405180910390f35b6102436040518060400160405280601781526020017f4275726e4d696e74546f6b656e506f6f6c20312e352e3100000000000000000081525081565b6040516101fe9190613396565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b6101f26102a53660046133cb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101fe565b6103286103233660046133e8565b61069c565b604051905181526020016101fe565b6101f2610345366004613441565b61086b565b61035d610358366004613510565b6108b5565b005b61035d61036d366004613441565b610930565b60095473ffffffffffffffffffffffffffffffffffffffff16610272565b61035d6109cd565b61035d6103a63660046133cb565b610a9b565b6101f26103b936600461357c565b610b1c565b60015473ffffffffffffffffffffffffffffffffffffffff16610272565b61035d6103ea3660046135dc565b610b33565b6104026103fd366004613676565b610c8d565b6040516101fe91906136b1565b61042261041d36600461357c565b610d66565b6040516101fe9190613708565b610437610ed1565b6040516101fe919061378a565b61035d610452366004613441565b610ee2565b61046a61046536600461357c565b610ffa565b6040516101fe919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610272565b6102436104f236600461357c565b6110cf565b61035d6105053660046133cb565b61117f565b61051261125a565b6040516101fe91906137e4565b61046a61052d36600461357c565b611312565b61035d61054036600461396c565b6113e4565b7f0000000000000000000000000000000000000000000000000000000000000000610272565b7f00000000000000000000000000000000000000000000000000000000000000006101f2565b61035d61059f366004613510565b611468565b61035d6105b23660046133cb565b61197a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061064a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061069657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040805160208101909152600081526106b48261198e565b600061070d60608401356107086106ce60c08701876139b1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bb292505050565b611c76565b905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166340c10f1961075b60608601604087016133cb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b506107f19250505060608401604085016133cb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f08360405161084f91815260200190565b60405180910390a3604080516020810190915290815292915050565b60006108ad8383604051610880929190613a16565b604080519182900390912067ffffffffffffffff8716600090815260076020529190912060050190611e8a565b949350505050565b6108bd611ea5565b61092a84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611ef892505050565b50505050565b610938611ea5565b61094183610b1c565b610988576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6109c88383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120ae92505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a1e576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610aa3611ea5565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d091749060200160405180910390a150565b6000610696600567ffffffffffffffff8416611e8a565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590610b73575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15610bac576040517f8e4a23d600000000000000000000000000000000000000000000000000000000815233600482015260240161097f565b8483141580610bbb5750848114155b15610bf2576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b85811015610c8457610c7c878783818110610c1257610c12613a26565b9050602002016020810190610c27919061357c565b868684818110610c3957610c39613a26565b905060600201803603810190610c4f9190613a55565b858585818110610c6157610c61613a26565b905060600201803603810190610c779190613a55565b6121a8565b600101610bf5565b50505050505050565b6040805180820190915260608082526020820152610caa82612292565b610cb7826060013561241e565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610d118460200160208101906104f2919061357c565b8152602001610d5e6040805160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260609101604051602081830303815290604052905090565b905292915050565b67ffffffffffffffff8116600090815260076020526040812060609190610d8f906005016124ba565b90506000815167ffffffffffffffff811115610dad57610dad613826565b604051908082528060200260200182016040528015610de057816020015b6060815260200190600190039081610dcb5790505b50905060005b8251811015610ec95760086000848381518110610e0557610e05613a26565b602002602001015181526020019081526020016000208054610e2690613a71565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5290613a71565b8015610e9f5780601f10610e7457610100808354040283529160200191610e9f565b820191906000526020600020905b815481529060010190602001808311610e8257829003601f168201915b5050505050828281518110610eb657610eb6613a26565b6020908102919091010152600101610de6565b509392505050565b6060610edd60026124ba565b905090565b610eea611ea5565b610ef383610b1c565b610f35576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161097f565b610f758282604051610f48929190613a16565b604080519182900390912067ffffffffffffffff86166000908152600760205291909120600501906124c7565b610fb1578282826040517f74f23c7c00000000000000000000000000000000000000000000000000000000815260040161097f93929190613b0d565b8267ffffffffffffffff167f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d768383604051610fed929190613b31565b60405180910390a2505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff161515948201949094526003909101548084166060830152919091049091166080820152610696906124d3565b67ffffffffffffffff811660009081526007602052604090206004018054606091906110fa90613a71565b80601f016020809104026020016040519081016040528092919081815260200182805461112690613a71565b80156111735780601f1061114857610100808354040283529160200191611173565b820191906000526020600020905b81548152906001019060200180831161115657829003601f168201915b50505050509050919050565b611187611ea5565b73ffffffffffffffffffffffffffffffffffffffff81166111d4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b6060600061126860056124ba565b90506000815167ffffffffffffffff81111561128657611286613826565b6040519080825280602002602001820160405280156112af578160200160208202803683370190505b50905060005b825181101561130b578281815181106112d0576112d0613a26565b60200260200101518282815181106112ea576112ea613a26565b67ffffffffffffffff909216602092830291909101909101526001016112b5565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff161515948201949094526001909101548084166060830152919091049091166080820152610696906124d3565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590611424575060015473ffffffffffffffffffffffffffffffffffffffff163314155b1561145d576040517f8e4a23d600000000000000000000000000000000000000000000000000000000815233600482015260240161097f565b6109c88383836121a8565b611470611ea5565b60005b8381101561165d57600085858381811061148f5761148f613a26565b90506020020160208101906114a4919061357c565b90506114bb600567ffffffffffffffff83166124c7565b6114fd576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161097f565b67ffffffffffffffff81166000908152600760205260408120611522906005016124ba565b905060005b815181101561158e5761158582828151811061154557611545613a26565b6020026020010151600760008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206005016124c790919063ffffffff16565b50600101611527565b5067ffffffffffffffff8216600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906115f76004830182613283565b600582016000818161160982826132bd565b505060405167ffffffffffffffff871681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169450602001925061164b915050565b60405180910390a15050600101611473565b5060005b8181101561197357600083838381811061167d5761167d613a26565b905060200281019061168f9190613b45565b61169890613c11565b90506116a981606001516000612585565b6116b881608001516000612585565b8060400151516000036116f7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805161170f9060059067ffffffffffffffff166126c2565b6117545780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161097f565b805167ffffffffffffffff16600090815260076020908152604091829020825160a08082018552606080870180518601516fffffffffffffffffffffffffffffffff90811680865263ffffffff42168689018190528351511515878b0181905284518a0151841686890181905294518b0151841660809889018190528954740100000000000000000000000000000000000000009283027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff7001000000000000000000000000000000008087027fffffffffffffffffffffffff000000000000000000000000000000000000000094851690981788178216929092178d5592810290971760018c01558c519889018d52898e0180518d01518716808b528a8e019590955280515115158a8f018190528151909d01518716988a01899052518d0151909516979098018790526002890180549a9091029990931617179094169590951790925590920290911760038201559082015160048201906118d79082613d88565b5060005b82602001515181101561191b5761191383600001518460200151838151811061190657611906613a26565b60200260200101516120ae565b6001016118db565b507f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c282600001518360400151846060015185608001516040516119619493929190613ea2565b60405180910390a15050600101611661565b5050505050565b611982611ea5565b61198b816126ce565b50565b6119a16102a560a08301608084016133cb565b611a00576119b560a08201608083016133cb565b6040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161097f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb611a4c604084016020850161357c565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015611abd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae19190613f3b565b15611b18576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b30611b2b604083016020840161357c565b612792565b611b50611b43604083016020840161357c565b61034560a08401846139b1565b611b9557611b6160a08201826139b1565b6040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161097f929190613b31565b61198b611ba8604083016020840161357c565b82606001356128b8565b60008151600003611be457507f0000000000000000000000000000000000000000000000000000000000000000919050565b8151602014611c2157816040517f953576f700000000000000000000000000000000000000000000000000000000815260040161097f9190613396565b600082806020019051810190611c379190613f58565b905060ff81111561069657826040517f953576f700000000000000000000000000000000000000000000000000000000815260040161097f9190613396565b60007f000000000000000000000000000000000000000000000000000000000000000060ff168260ff1603611cac575081610696565b7f000000000000000000000000000000000000000000000000000000000000000060ff168260ff161115611d97576000611d067f000000000000000000000000000000000000000000000000000000000000000084613fa0565b9050604d8160ff161115611d7a576040517fa9cb113d00000000000000000000000000000000000000000000000000000000815260ff80851660048301527f00000000000000000000000000000000000000000000000000000000000000001660248201526044810185905260640161097f565b611d8581600a6140d9565b611d8f90856140e8565b915050610696565b6000611dc3837f0000000000000000000000000000000000000000000000000000000000000000613fa0565b9050604d8160ff161180611e0a5750611ddd81600a6140d9565b611e07907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6140e8565b84115b15611e75576040517fa9cb113d00000000000000000000000000000000000000000000000000000000815260ff80851660048301527f00000000000000000000000000000000000000000000000000000000000000001660248201526044810185905260640161097f565b611e8081600a6140d9565b6108ad9085614123565b600081815260018301602052604081205415155b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611ef6576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f0000000000000000000000000000000000000000000000000000000000000000611f4f576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611fe5576000838281518110611f6f57611f6f613a26565b60200260200101519050611f8d8160026128ff90919063ffffffff16565b15611fdc5760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611f52565b5060005b81518110156109c857600082828151811061200657612006613a26565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361204a57506120a6565b612055600282612921565b156120a45760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611fe9565b80516000036120e9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208083019190912067ffffffffffffffff841660009081526007909252604090912061211b90600501826126c2565b6121555782826040517f393b8ad200000000000000000000000000000000000000000000000000000000815260040161097f92919061413a565b600081815260086020526040902061216d8382613d88565b508267ffffffffffffffff167f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea83604051610fed9190613396565b6121b183610b1c565b6121f3576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161097f565b6121fe826000612585565b67ffffffffffffffff831660009081526007602052604090206122219083612943565b61222c816000612585565b67ffffffffffffffff831660009081526007602052604090206122529060020182612943565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516122859392919061415d565b60405180910390a1505050565b6122a56102a560a08301608084016133cb565b6122b9576119b560a08201608083016133cb565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb612305604084016020850161357c565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015612376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239a9190613f3b565b156123d1576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123e96123e460608301604084016133cb565b612ae5565b6124016123fc604083016020840161357c565b612b64565b61198b612414604083016020840161357c565b8260600135612cb2565b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b1580156124a657600080fd5b505af1158015611973573d6000803e3d6000fd5b60606000611e9e83612cf6565b6000611e9e8383612d51565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261256182606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261254591906141e0565b85608001516fffffffffffffffffffffffffffffffff16612e44565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b8151156126505781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff161015806125db575060408201516fffffffffffffffffffffffffffffffff16155b1561261457816040517f8020d12400000000000000000000000000000000000000000000000000000000815260040161097f91906141f3565b801561264c576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60408201516fffffffffffffffffffffffffffffffff16151580612689575060208201516fffffffffffffffffffffffffffffffff1615155b1561264c57816040517fd68af9cc00000000000000000000000000000000000000000000000000000000815260040161097f91906141f3565b6000611e9e8383612e6c565b3373ffffffffffffffffffffffffffffffffffffffff82160361271d576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61279b81610b1c565b6127dd576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161097f565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa15801561285c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128809190613f3b565b61198b576040517f728fe07b00000000000000000000000000000000000000000000000000000000815233600482015260240161097f565b67ffffffffffffffff8216600090815260076020526040902061264c90600201827f0000000000000000000000000000000000000000000000000000000000000000612ebb565b6000611e9e8373ffffffffffffffffffffffffffffffffffffffff8416612d51565b6000611e9e8373ffffffffffffffffffffffffffffffffffffffff8416612e6c565b815460009061296c90700100000000000000000000000000000000900463ffffffff16426141e0565b90508015612a0e57600183015483546129b4916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612e44565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612a34916fffffffffffffffffffffffffffffffff908116911661323e565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906122859084906141f3565b7f00000000000000000000000000000000000000000000000000000000000000001561198b57612b16600282613254565b61198b576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260240161097f565b612b6d81610b1c565b612baf576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161097f565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612c28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4c919061422f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461198b576040517f728fe07b00000000000000000000000000000000000000000000000000000000815233600482015260240161097f565b67ffffffffffffffff8216600090815260076020526040902061264c90827f0000000000000000000000000000000000000000000000000000000000000000612ebb565b60608160000180548060200260200160405190810160405280929190818152602001828054801561117357602002820191906000526020600020905b815481526020019060010190808311612d325750505050509050919050565b60008181526001830160205260408120548015612e3a576000612d756001836141e0565b8554909150600090612d89906001906141e0565b9050808214612dee576000866000018281548110612da957612da9613a26565b9060005260206000200154905080876000018481548110612dcc57612dcc613a26565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612dff57612dff61424c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610696565b6000915050610696565b6000612e6385612e548486614123565b612e5e908761427b565b61323e565b95945050505050565b6000818152600183016020526040812054612eb357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610696565b506000610696565b825474010000000000000000000000000000000000000000900460ff161580612ee2575081155b15612eec57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612f3290700100000000000000000000000000000000900463ffffffff16426141e0565b90508015612ff25781831115612f74576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612fae9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612e44565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156130a95773ffffffffffffffffffffffffffffffffffffffff8416613051576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161097f565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161097f565b848310156131bc5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906130ed90826141e0565b6130f7878a6141e0565b613101919061427b565b61310b91906140e8565b905073ffffffffffffffffffffffffffffffffffffffff8616613164576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161097f565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161097f565b6131c685846141e0565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081831061324d5781611e9e565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611e9e565b50805461328f90613a71565b6000825580601f1061329f575050565b601f01602090049060005260206000209081019061198b91906132d7565b508054600082559060005260206000209081019061198b91905b5b808211156132ec57600081556001016132d8565b5090565b60006020828403121561330257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9e57600080fd5b6000815180845260005b818110156133585760208185018101518683018201520161333c565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000611e9e6020830184613332565b73ffffffffffffffffffffffffffffffffffffffff8116811461198b57600080fd5b6000602082840312156133dd57600080fd5b8135611e9e816133a9565b6000602082840312156133fa57600080fd5b813567ffffffffffffffff81111561341157600080fd5b82016101008185031215611e9e57600080fd5b803567ffffffffffffffff8116811461343c57600080fd5b919050565b60008060006040848603121561345657600080fd5b61345f84613424565b9250602084013567ffffffffffffffff8082111561347c57600080fd5b818601915086601f83011261349057600080fd5b81358181111561349f57600080fd5b8760208285010111156134b157600080fd5b6020830194508093505050509250925092565b60008083601f8401126134d657600080fd5b50813567ffffffffffffffff8111156134ee57600080fd5b6020830191508360208260051b850101111561350957600080fd5b9250929050565b6000806000806040858703121561352657600080fd5b843567ffffffffffffffff8082111561353e57600080fd5b61354a888389016134c4565b9096509450602087013591508082111561356357600080fd5b50613570878288016134c4565b95989497509550505050565b60006020828403121561358e57600080fd5b611e9e82613424565b60008083601f8401126135a957600080fd5b50813567ffffffffffffffff8111156135c157600080fd5b60208301915083602060608302850101111561350957600080fd5b600080600080600080606087890312156135f557600080fd5b863567ffffffffffffffff8082111561360d57600080fd5b6136198a838b016134c4565b9098509650602089013591508082111561363257600080fd5b61363e8a838b01613597565b9096509450604089013591508082111561365757600080fd5b5061366489828a01613597565b979a9699509497509295939492505050565b60006020828403121561368857600080fd5b813567ffffffffffffffff81111561369f57600080fd5b820160a08185031215611e9e57600080fd5b6020815260008251604060208401526136cd6060840182613332565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612e638282613332565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561377d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261376b858351613332565b94509285019290850190600101613731565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137d857835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016137a6565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137d857835167ffffffffffffffff1683529284019291840191600101613800565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561387857613878613826565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138c5576138c5613826565b604052919050565b801515811461198b57600080fd5b80356fffffffffffffffffffffffffffffffff8116811461343c57600080fd5b60006060828403121561390d57600080fd5b6040516060810181811067ffffffffffffffff8211171561393057613930613826565b6040529050808235613941816138cd565b815261394f602084016138db565b6020820152613960604084016138db565b60408201525092915050565b600080600060e0848603121561398157600080fd5b61398a84613424565b925061399985602086016138fb565b91506139a885608086016138fb565b90509250925092565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139e657600080fd5b83018035915067ffffffffffffffff821115613a0157600080fd5b60200191503681900382131561350957600080fd5b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060608284031215613a6757600080fd5b611e9e83836138fb565b600181811c90821680613a8557607f821691505b602082108103613abe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b67ffffffffffffffff84168152604060208201526000612e63604083018486613ac4565b6020815260006108ad602083018486613ac4565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1833603018112613b7957600080fd5b9190910192915050565b600082601f830112613b9457600080fd5b813567ffffffffffffffff811115613bae57613bae613826565b613bdf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161387e565b818152846020838601011115613bf457600080fd5b816020850160208301376000918101602001919091529392505050565b60006101208236031215613c2457600080fd5b613c2c613855565b613c3583613424565b815260208084013567ffffffffffffffff80821115613c5357600080fd5b9085019036601f830112613c6657600080fd5b813581811115613c7857613c78613826565b8060051b613c8785820161387e565b9182528381018501918581019036841115613ca157600080fd5b86860192505b83831015613cdd57823585811115613cbf5760008081fd5b613ccd3689838a0101613b83565b8352509186019190860190613ca7565b8087890152505050506040860135925080831115613cfa57600080fd5b5050613d0836828601613b83565b604083015250613d1b36606085016138fb565b6060820152613d2d3660c085016138fb565b608082015292915050565b601f8211156109c8576000816000526020600020601f850160051c81016020861015613d615750805b601f850160051c820191505b81811015613d8057828155600101613d6d565b505050505050565b815167ffffffffffffffff811115613da257613da2613826565b613db681613db08454613a71565b84613d38565b602080601f831160018114613e095760008415613dd35750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613d80565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e5657888601518255948401946001909101908401613e37565b5085821015613e9257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613ec681840187613332565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613f049050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612e63565b600060208284031215613f4d57600080fd5b8151611e9e816138cd565b600060208284031215613f6a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff828116828216039081111561069657610696613f71565b600181815b8085111561401257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613ff857613ff8613f71565b8085161561400557918102915b93841c9390800290613fbe565b509250929050565b60008261402957506001610696565b8161403657506000610696565b816001811461404c576002811461405657614072565b6001915050610696565b60ff84111561406757614067613f71565b50506001821b610696565b5060208310610133831016604e8410600b8410161715614095575081810a610696565b61409f8383613fb9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156140d1576140d1613f71565b029392505050565b6000611e9e60ff84168361401a565b60008261411e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761069657610696613f71565b67ffffffffffffffff831681526040602082015260006108ad6040830184613332565b67ffffffffffffffff8416815260e081016141a960208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526108ad565b8181038181111561069657610696613f71565b6060810161069682848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561424157600080fd5b8151611e9e816133a9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8082018082111561069657610696613f7156fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIBurnMintERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x61010080604052346103635761491c803803809161001d82856103e2565b833981019060a0818303126103635780516001600160a01b038116908190036103635761004c60208301610405565b60408301519091906001600160401b0381116103635783019380601f86011215610363578451946001600160401b0386116103cc578560051b90602082019661009860405198896103e2565b875260208088019282010192831161036357602001905b8282106103b4575050506100d160806100ca60608601610413565b9401610413565b9233156103a357600180546001600160a01b0319163317905581158015610392575b8015610381575b610370578160209160049360805260c0526040519283809263313ce56760e01b82525afa6000918161032f575b50610304575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526101e6575b60405161435490816105c882396080518181816115fc015281816117e801528181612204015281816123e0015281816126f80152612770015260a05181818161189f0152818161267f0152818161315901526131dc015260c051818181610bd501528181611698015261229f015260e051818181610b65015281816116db0152611ffb0152f35b60405160206101f581836103e2565b60008252600036813760e051156102f35760005b8251811015610270576001906001600160a01b036102278286610427565b51168361023382610469565b610240575b505001610209565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13883610238565b50905060005b82518110156102ea576001906001600160a01b036102948286610427565b511680156102e457836102a682610567565b6102b4575b50505b01610276565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102ab565b506102ae565b5050503861015f565b6335f4a7b360e01b60005260046000fd5b60ff1660ff8216818103610318575061012d565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d602011610368575b8161034b602093836103e2565b810103126103635761035c90610405565b9038610127565b600080fd5b3d915061033e565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038116156100fa565b506001600160a01b038416156100f3565b639b15e16f60e01b60005260046000fd5b602080916103c184610413565b8152019101906100af565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103cc57604052565b519060ff8216820361036357565b51906001600160a01b038216820361036357565b805182101561043b5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561043b5760005260206000200190600090565b600081815260036020526040902054801561056057600019810181811161054a5760025460001981019190821161054a578181036104f9575b50505060025480156104e357600019016104bd816002610451565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61053261050a61051b936002610451565b90549060031b1c9283926002610451565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104a2565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105c157600254680100000000000000008110156103cc576105a861051b8260018594016002556002610451565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461281357508063181f5a771461279457806321df0da714612725578063240028e8146126a357806324f65ee714612647578063390775371461215e5780634c5ef0ed1461214457806354c8a4f314611fc757806362ddd3c414611f435780636d3d1a5814611ef157806379ba509714611e0c5780637d54534e14611d5f5780638926f54f14611cfb5780638da5cb5b14611ca9578063962d402014611b055780639a4575b914611554578063a42a7b8b146113cf578063a7cd63b714611303578063acfecf91146111df578063af58d59f14611178578063b0f479a114611126578063b7946580146110cf578063c0d7865514610fd7578063c4bffe2b14610e8e578063c75eea9c14610dc8578063cf7401f314610bf9578063dc0bd97114610b8a578063e0351e1314610b2f578063e8a1da171461025a5763f2fde38b1461016b57600080fd5b346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff6101b7612a41565b6101bf6132e6565b1633811461022f57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102575761026936612b2f565b939190926102756132e6565b82915b80831061099a575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b85821015610996578160051b85013581811215610992578501906101208236031261099257604051956102e387612969565b823567ffffffffffffffff8116810361098d578752602083013567ffffffffffffffff81116109895783019536601f880112156109895786359661032688612d5b565b97610334604051998a6129a1565b8089526020808a019160051b830101903682116109855760208301905b828210610952575050505060208801968752604084013567ffffffffffffffff811161094e5761038490369086016130b3565b9860408901998a526103ae61039c3660608801612bed565b9560608b0196875260c0369101612bed565b9660808a019788526103c0865161375d565b6103ca885161375d565b8a515115610926576103e667ffffffffffffffff8b5116613fb0565b156108ef5767ffffffffffffffff8a5116815260076020526040812061052687516fffffffffffffffffffffffffffffffff604082015116906104e16fffffffffffffffffffffffffffffffff6020830151169151151583608060405161044c81612969565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b61064c89516fffffffffffffffffffffffffffffffff604082015116906106076fffffffffffffffffffffffffffffffff6020830151169151151583608060405161057081612969565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff82116108c25761066f8354612e53565b601f8111610887575b50602090601f83116001146107e8576106c692918591836107dd575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b8951805182101561070157906106fb6001926106f4838f67ffffffffffffffff90511692612e3f565b5190613331565b016106cb565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2929593966107cf67ffffffffffffffff600197949c511692519351915161079b610766604051968796875261010060208801526101008701906129e2565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a10190939492916102b1565b015190503880610694565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b81811061086f5750908460019594939210610838575b505050811b0190556106c9565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061082b565b92936020600181928786015181550195019301610815565b6108b29084865260208620601f850160051c810191602086106108b8575b601f0160051c019061305a565b38610678565b90915081906108a5565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff81116109815760209161097683928336918901016130b3565b815201910190610351565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff6109ba6109b5878588612ddb565b612e1a565b16956109c587613ce4565b15610b035786845260076020526109e160056040862001613aeb565b94845b8651811015610a1a576001908987526007602052610a1360056040892001610a0c838b612e3f565b5190613e0f565b50016109e4565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610a538154612e53565b80610ac2575b5050500180549086815581610aa4575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a1019190949394610278565b865260208620908101905b81811015610a6957868155600101610aaf565b601f8111600114610ad85750555b863880610a59565b81835260208320610af391601f01861c81019060010161305a565b8082528160208120915555610ad0565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610c31612a64565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261025757604051610c6881612985565b6024358015158103610dc45781526044356fffffffffffffffffffffffffffffffff81168103610dc45760208201526064356fffffffffffffffffffffffffffffffff81168103610dc457604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610dc05760405190610cef82612985565b608435801515810361099257825260a4356fffffffffffffffffffffffffffffffff8116810361099257602083015260c4356fffffffffffffffffffffffffffffffff8116810361099257604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610d9e575b610d7257610d6f929361359b565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610d61565b5080fd5b8280fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c6040610e8a9367ffffffffffffffff610e15612a64565b610e1d612fa7565b50168152600760205220612fd2565b6136d8565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051906005548083528260208101600584526020842092845b818110610fbe575050610eec925003836129a1565b8151610f10610efa82612d5b565b91610f0860405193846129a1565b808352612d5b565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015610f6f578067ffffffffffffffff610f5c60019388612e3f565b5116610f688286612e3f565b5201610f3d565b50925090604051928392602084019060208552518091526040840192915b818110610f9b575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101610f8d565b8454835260019485019487945060209093019201610ed7565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff611024612a41565b61102c6132e6565b1680156110a75760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e8a61111261110d612a64565b613038565b6040519182916020835260208301906129e2565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c60026040610e8a9467ffffffffffffffff6111c7612a64565b6111cf612fa7565b5016815260076020522001612fd2565b50346102575767ffffffffffffffff6111f736612a7b565b9290916112026132e6565b169161121b836000526006602052604060002054151590565b156112d757828452600760205261124a6005604086200161123d368486612c8a565b6020815191012090613e0f565b1561128f57907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691611289604051928392602084526020840191612f68565b0390a280f35b826112d3836040519384937f74f23c7c0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191612f68565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051600254808252602082018091600285526020852090855b8181106113b957505050826113629103836129a1565b604051928392602084019060208552518091526040840192915b81811061138a575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff1684528594506020938401939092019160010161137c565b825484526020909301926001928301920161134c565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575767ffffffffffffffff611410612a64565b168152600760205261142760056040832001613aeb565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061146c61145683612d5b565b9261146460405194856129a1565b808452612d5b565b01835b818110611543575050825b82518110156114c0578061149060019285612e3f565b51855260086020526114a460408620612ea6565b6114ae8285612e3f565b526114b98184612e3f565b500161147a565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b8282106114f857505050500390f35b91936020611533827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0600195979984950301865288516129e2565b96019201920185949391926114e9565b80606060208093860101520161146f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc05760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610dc057606060206040516115d28161294d565b8281520152608481016115e481612cef565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611abb5750602481019177ffffffffffffffff0000000000000000000000000000000061164b84612e1a565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561194b578291611a8c575b50611a64576116d960448301612cef565b7f0000000000000000000000000000000000000000000000000000000000000000611a11575b5067ffffffffffffffff61171284612e1a565b1661172a816000526006602052604060002054151590565b156119e557602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa801561194b578290611982575b73ffffffffffffffffffffffffffffffffffffffff91501633036119565767ffffffffffffffff60646117bd85612e1a565b930135921681526007602052816118106040832073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692839161405f565b803b15610dc0578180916024604051809481937f42966c680000000000000000000000000000000000000000000000000000000083528860048401525af1801561194b57611936575b61190561189561110d86866040519081527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df760203392a2612e1a565b610e8a60405160ff7f0000000000000000000000000000000000000000000000000000000000000000166020820152602081526118d36040826129a1565b604051926118e08461294d565b83526020830190815260405193849360208552516040602086015260608501906129e2565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526129e2565b6119418280926129a1565b6102575780611859565b6040513d84823e3d90fd5b807f728fe07b000000000000000000000000000000000000000000000000000000006024925233600452fd5b506020813d6020116119dd575b8161199c602093836129a1565b81010312610dc0575173ffffffffffffffffffffffffffffffffffffffff81168103610dc05773ffffffffffffffffffffffffffffffffffffffff9061178b565b3d915061198f565b602492507fa9902c7e000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16808252600360205260408220546116ff57602492507fd0d25976000000000000000000000000000000000000000000000000000000008252600452fd5b807f53ad11d80000000000000000000000000000000000000000000000000000000060049252fd5b611aae915060203d602011611ab4575b611aa681836129a1565b8101906130ce565b386116c8565b503d611a9c565b8273ffffffffffffffffffffffffffffffffffffffff611adc602493612cef565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b50346102575760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057611b55903690600401612afe565b60243567ffffffffffffffff811161099257611b75903690600401612b9f565b60449291923567ffffffffffffffff811161098957611b98903690600401612b9f565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611c87575b611c5b57818114801590611c51575b611c2957865b818110611bdd578780f35b80611c23611bf16109b5600194868c612ddb565b611bfc83878b612e2f565b611c1d611c15611c0d868b8d612e2f565b923690612bed565b913690612bed565b9161359b565b01611bd2565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611bcc565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611bbd565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020611d5567ffffffffffffffff611d41612a64565b166000526006602052604060002054151590565b6040519015158152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611dcf612a41565b611dd76132e6565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757805473ffffffffffffffffffffffffffffffffffffffff81163303611ec9577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b503461025757611f5236612a7b565b611f5e939291936132e6565b67ffffffffffffffff8216611f80816000526006602052604060002054151590565b15611f9c5750610d6f9293611f96913691612c8a565b90613331565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b503461025757611ff190611ff9611fdd36612b2f565b9591611fea9391936132e6565b3691612d73565b933691612d73565b7f00000000000000000000000000000000000000000000000000000000000000001561211c57815b8351811015612094578073ffffffffffffffffffffffffffffffffffffffff61204c60019387612e3f565b511661205781613b4e565b612063575b5001612021565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13861205c565b5090805b8251811015612118578073ffffffffffffffffffffffffffffffffffffffff6120c360019386612e3f565b51168015612112576120d481613f50565b6120e1575b505b01612098565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1846120d9565b506120db565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b5034610257576020611d5561215836612a7b565b91612d10565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610dc457826040516121de81612902565b52608482016121ec81612cef565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361262657506024820177ffffffffffffffff0000000000000000000000000000000061225282612e1a565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156125a9578591612607575b506125df5767ffffffffffffffff6122e682612e1a565b166122fe816000526006602052604060002054151590565b156125b457602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156125a957859161258a575b501561255e5761237581612e1a565b61238760a48501916121588386612c39565b15612517575061242467ffffffffffffffff9261241e6124196124126123ae604496612e1a565b936064890135978895168a526007602052612408600260408c200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016998a9161405f565b60c4890190612c39565b3691612c8a565b6130e6565b906131d9565b9201908361243183612cef565b823b15610dc057604473ffffffffffffffffffffffffffffffffffffffff918360405195869485937f40c10f190000000000000000000000000000000000000000000000000000000085521660048401528860248401525af1801561250c57916020946124ba9273ffffffffffffffffffffffffffffffffffffffff946124fc575b5050612cef565b166040518281527f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0843392a3806040516124f381612902565b52604051908152f35b81612506916129a1565b386124b3565b6040513d86823e3d90fd5b6125219083612c39565b6112d36040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452602060048501526024840191612f68565b6024847f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b6125a3915060203d602011611ab457611aa681836129a1565b38612366565b6040513d87823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008552600452602484fd5b6004847f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b612620915060203d602011611ab457611aa681836129a1565b386122cf565b8373ffffffffffffffffffffffffffffffffffffffff611adc602493612cef565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020906126de612a41565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575750610e8a6040516127d56040826129a1565b601781527f4275726e4d696e74546f6b656e506f6f6c20312e352e3100000000000000000060208201526040519182916020835260208301906129e2565b905034610dc05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610dc0576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610dc457602092507faff2afbf0000000000000000000000000000000000000000000000000000000081149081156128d8575b81156128ae575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386128a7565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506128a0565b6020810190811067ffffffffffffffff82111761291e57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761291e57604052565b60a0810190811067ffffffffffffffff82111761291e57604052565b6060810190811067ffffffffffffffff82111761291e57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761291e57604052565b919082519283825260005b848110612a2c5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016129ed565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361098d57565b6004359067ffffffffffffffff8216820361098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff8116810361098d579160243567ffffffffffffffff811161098d578260238201121561098d5780600401359267ffffffffffffffff841161098d576024848301011161098d576024019190565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501948460051b01011161098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff811161098d5781612b7891600401612afe565b929092916024359067ffffffffffffffff821161098d57612b9b91600401612afe565b9091565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501946060850201011161098d57565b35906fffffffffffffffffffffffffffffffff8216820361098d57565b919082606091031261098d57604051612c0581612985565b8092803590811515820361098d576040612c349181938552612c2960208201612bd0565b602086015201612bd0565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561098d570180359067ffffffffffffffff821161098d5760200191813603831361098d57565b92919267ffffffffffffffff821161291e5760405191612cd2601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846129a1565b82948184528183011161098d578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff8116810361098d5790565b612d58929167ffffffffffffffff612d3b921660005260076020526005604060002001923691612c8a565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff811161291e5760051b60200190565b9291612d7e82612d5b565b93612d8c60405195866129a1565b602085848152019260051b810191821161098d57915b818310612dae57505050565b823573ffffffffffffffffffffffffffffffffffffffff8116810361098d57815260209283019201612da2565b9190811015612deb5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff8116810361098d5790565b9190811015612deb576060020190565b8051821015612deb5760209160051b010190565b90600182811c92168015612e9c575b6020831014612e6d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612e62565b9060405191826000825492612eba84612e53565b8084529360018116908115612f285750600114612ee1575b50612edf925003836129a1565b565b90506000929192526020600020906000915b818310612f0c575050906020612edf9282010138612ed2565b6020919350806001915483858901015201910190918492612ef3565b60209350612edf9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612ed2565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60405190612fb482612969565b60006080838281528260208201528260408201528260608201520152565b90604051612fdf81612969565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff166000526007602052612d586004604060002001612ea6565b818110613065575050565b6000815560010161305a565b8181029291811591840414171561308457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f8301121561098d57816020612d5893359101612c8a565b9081602091031261098d5751801515810361098d5790565b80518015613155576020036131175760208180518101031261098d5760208101519060ff8211613117575060ff1690565b6112d3906040519182917f953576f70000000000000000000000000000000000000000000000000000000083526020600484015260248301906129e2565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161308457565b60ff16604d811161308457600a0a90565b81156131aa570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146132df578284116132b5579061321e9161317b565b91604d60ff841611801561327c575b61324657505090613240612d589261318f565b90613071565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b506132868361318f565b80156131aa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04841161322d565b6132be9161317b565b91604d60ff841611613246575050906132d9612d589261318f565b906131a0565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff60015416330361330757565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156135715767ffffffffffffffff8151602083012092169182600052600760205261336681600560406000200161400a565b1561352d5760005260086020526040600020815167ffffffffffffffff811161291e576133938254612e53565b601f81116134fb575b506020601f8211600114613435579161340f827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea95936134259560009161342a575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90556040519182916020835260208301906129e2565b0390a2565b9050840151386133de565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106134e35750926134259492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9896106134ac575b5050811b019055611112565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538806134a0565b9192602060018192868a015181550194019201613465565b61352790836000526020600020601f840160051c810191602085106108b857601f0160051c019061305a565b3861339c565b50906112d36040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401526040602484015260448301906129e2565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff16600081815260066020526040902054909291901561369d579161369a60e092613666856135f27f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761375d565b8460005260076020526136098160406000206138b8565b6136128361375d565b84600052600760205261362c8360026040600020016138b8565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161308457565b6136e0612fa7565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161373d602085019361373761372a63ffffffff875116426136cb565b8560808901511690613071565b90613f43565b8082101561375657505b16825263ffffffff4216905290565b9050613747565b805115613811576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116811090811591613808575b506137a55750565b606490613806604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b9050153861379d565b6fffffffffffffffffffffffffffffffff60408201511615801590613899575b6138385750565b606490613806604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613831565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19916139f160609280546138f563ffffffff8260801c16426136cb565b9081613a30575b50506fffffffffffffffffffffffffffffffff6001816020860151169282815416808510600014613a2857508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556139a58651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b61369a60405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161392c565b6fffffffffffffffffffffffffffffffff91613a65839283613a5e6001880154948286169560801c90613071565b9116613f43565b80821015613ae457505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff000000000000000000000000000000001617815538806138fc565b9050613a6f565b906040519182815491828252602082019060005260206000209260005b818110613b1d575050612edf925003836129a1565b8454835260019485019487945060209093019201613b08565b8054821015612deb5760005260206000200190600090565b6000818152600360205260409020548015613cdd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161308457600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161308457818103613c6e575b5050506002548015613c3f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613bfc816002613b36565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613cc5613c7f613c90936002613b36565b90549060031b1c9283926002613b36565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526003602052604060002055388080613bc3565b5050600090565b6000818152600660205260409020548015613cdd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161308457600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161308457818103613dd5575b5050506005548015613c3f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613d92816005613b36565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b613df7613de6613c90936005613b36565b90549060031b1c9283926005613b36565b90556000526006602052604060002055388080613d59565b9060018201918160005282602052604060002054801515600014613f3a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613084578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161308457818103613f03575b50505080548015613c3f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613ec48282613b36565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b613f23613f13613c909386613b36565b90549060031b1c92839286613b36565b905560005283602052604060002055388080613e8c565b50505050600090565b9190820180921161308457565b80600052600360205260406000205415600014613faa576002546801000000000000000081101561291e57613f91613c908260018594016002556002613b36565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014613faa576005546801000000000000000081101561291e57613ff1613c908260018594016005556005613b36565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054613cdd578054906801000000000000000082101561291e5782614048613c90846001809601855584613b36565b905580549260005201602052604060002055600190565b929192805460ff8160a01c1615801561433f575b614338576fffffffffffffffffffffffffffffffff811690600183019081546140b863ffffffff6fffffffffffffffffffffffffffffffff83169360801c16426136cb565b908161429a575b5050848110614218575083821061414757507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff8061411585602096956136cb565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061415992505460801c926136cb565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613084576141a76141ac9273ffffffffffffffffffffffffffffffffffffffff94613f43565b6131a0565b92169182156141e8577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff881691821561426a577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b82859293951161430e576142b5926137379160801c90613071565b808310156143095750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806140bf565b6142c0565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b50821561407356fea164736f6c634300081a000a",
}
var BurnMintTokenPoolABI = BurnMintTokenPoolMetaData.ABI
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 46f233948ce..58ab79e69d4 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
@@ -81,8 +81,8 @@ type TokenPoolChainUpdate struct {
}
var BurnWithFromMintTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"localTokenDecimals\",\"type\":\"uint8\"},{\"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\":[],\"name\":\"CannotTransferToSelf\",\"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\":[{\"internalType\":\"uint8\",\"name\":\"expected\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"actual\",\"type\":\"uint8\"}],\"name\":\"InvalidDecimalArgs\",\"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\":\"sourcePoolData\",\"type\":\"bytes\"}],\"name\":\"InvalidRemoteChainDecimals\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidRemotePoolForChain\",\"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\":\"MismatchedArrayLengths\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"remoteDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"localDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"remoteAmount\",\"type\":\"uint256\"}],\"name\":\"OverflowDetected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"PoolAlreadyAdded\",\"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\":false,\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"RateLimitAdminSet\",\"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\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolRemoved\",\"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\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"addRemotePool\",\"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\":[{\"internalType\":\"uint64[]\",\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes[]\",\"name\":\"remotePoolAddresses\",\"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\":\"chainsToAdd\",\"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\":\"getRemotePools\",\"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\":\"getTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"isRemotePool\",\"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\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"removeRemotePool\",\"outputs\":[],\"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\":\"remoteChainSelectors\",\"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\":\"outboundConfigs\",\"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\":\"inboundConfigs\",\"type\":\"tuple[]\"}],\"name\":\"setChainRateLimiterConfigs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"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\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b5060405162004ecf38038062004ecf833981016040819052620000359162000918565b8484848484336000816200005c57604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008f576200008f8162000206565b50506001600160a01b0385161580620000af57506001600160a01b038116155b80620000c257506001600160a01b038216155b15620000e1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03808616608081905290831660c0526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa92505050801562000151575060408051601f3d908101601f191682019092526200014e9181019062000a3a565b60015b1562000192578060ff168560ff161462000190576040516332ad3e0760e11b815260ff8087166004830152821660248201526044015b60405180910390fd5b505b60ff841660a052600480546001600160a01b0319166001600160a01b038316179055825115801560e052620001dc57604080516000815260208101909152620001dc908462000280565b50620001fb935050506001600160a01b038716905030600019620003dd565b505050505062000b84565b336001600160a01b038216036200023057604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e051620002a1576040516335f4a7b360e01b815260040160405180910390fd5b60005b82518110156200032c576000838281518110620002c557620002c562000a58565b60209081029190910101519050620002df600282620004c3565b1562000322576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101620002a4565b5060005b8151811015620003d857600082828151811062000351576200035162000a58565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200037d5750620003cf565b6200038a600282620004e3565b15620003cd576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010162000330565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa1580156200042f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000455919062000a6e565b62000461919062000a9e565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620004bd91869190620004fa16565b50505050565b6000620004da836001600160a01b038416620005cb565b90505b92915050565b6000620004da836001600160a01b038416620006cf565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000549906001600160a01b03851690849062000721565b805190915015620003d857808060200190518101906200056a919062000ab4565b620003d85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000187565b60008181526001830160205260408120548015620006c4576000620005f260018362000adf565b8554909150600090620006089060019062000adf565b9050808214620006745760008660000182815481106200062c576200062c62000a58565b906000526020600020015490508087600001848154811062000652576200065262000a58565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000688576200068862000af5565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620004dd565b6000915050620004dd565b60008181526001830160205260408120546200071857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004dd565b506000620004dd565b60606200073284846000856200073a565b949350505050565b6060824710156200079d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000187565b600080866001600160a01b03168587604051620007bb919062000b31565b60006040518083038185875af1925050503d8060008114620007fa576040519150601f19603f3d011682016040523d82523d6000602084013e620007ff565b606091505b50909250905062000813878383876200081e565b979650505050505050565b60608315620008925782516000036200088a576001600160a01b0385163b6200088a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000187565b508162000732565b620007328383815115620008a95781518083602001fd5b8060405162461bcd60e51b815260040162000187919062000b4f565b6001600160a01b0381168114620008db57600080fd5b50565b805160ff81168114620008f057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b8051620008f081620008c5565b600080600080600060a086880312156200093157600080fd5b85516200093e81620008c5565b945060206200094f878201620008de565b60408801519095506001600160401b03808211156200096d57600080fd5b818901915089601f8301126200098257600080fd5b815181811115620009975762000997620008f5565b8060051b604051601f19603f83011681018181108582111715620009bf57620009bf620008f5565b60405291825284820192508381018501918c831115620009de57600080fd5b938501935b8285101562000a0757620009f7856200090b565b84529385019392850192620009e3565b80985050505050505062000a1e606087016200090b565b915062000a2e608087016200090b565b90509295509295909350565b60006020828403121562000a4d57600080fd5b620004da82620008de565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a8157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115620004dd57620004dd62000a88565b60006020828403121562000ac757600080fd5b8151801515811462000ad857600080fd5b9392505050565b81810381811115620004dd57620004dd62000a88565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000b2857818101518382015260200162000b0e565b50506000910152565b6000825162000b4581846020870162000b0b565b9190910192915050565b602081526000825180602084015262000b7081604085016020870162000b0b565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161429a62000c356000396000818161056601528181611ef30152612ae601526000818161054001528181611a1001526122c90152600081816102e401528181610d1a01528181611bb901528181611c7301528181611ca701528181611cda01528181611d3f01528181611d980152611e3a01526000818161024b015281816102a00152818161071f0152818161244c015281816128da0152612cd1015261429a6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a4575b911610104578063c0d78655116100a2578063dc0bd97111610071578063dc0bd9711461053e578063e0351e1314610564578063e8a1da171461058a578063f2fde38b1461059d57600080fd5b8063c0d78655146104f0578063c4bffe2b14610503578063c75eea9c14610518578063cf7401f31461052b57600080fd5b8063acfecf91116100de578063acfecf911461043d578063af58d59f14610450578063b0f479a1146104bf578063b7946580146104dd57600080fd5b80639a4575b9146103e8578063a42a7b8b14610408578063a7cd63b71461042857600080fd5b806354c8a4f31161017c5780637d54534e1161014b5780637d54534e146103915780638926f54f146103a45780638da5cb5b146103b7578063962d4020146103d557600080fd5b806354c8a4f31461034357806362ddd3c4146103585780636d3d1a581461036b57806379ba50971461038957600080fd5b8063240028e8116101b8578063240028e81461029057806324f65ee7146102dd578063390775371461030e5780634c5ef0ed1461033057600080fd5b806301ffc9a7146101df578063181f5a771461020757806321df0da714610249575b600080fd5b6101f26101ed3660046132ef565b6105b0565b60405190151581526020015b60405180910390f35b60408051808201909152601f81527f4275726e5769746846726f6d4d696e74546f6b656e506f6f6c20312e352e310060208201525b6040516101fe9190613395565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b6101f261029e3660046133ca565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101fe565b61032161031c3660046133e7565b610695565b604051905181526020016101fe565b6101f261033e366004613440565b610864565b61035661035136600461350f565b6108ae565b005b610356610366366004613440565b610929565b60095473ffffffffffffffffffffffffffffffffffffffff1661026b565b6103566109c6565b61035661039f3660046133ca565b610a94565b6101f26103b236600461357b565b610b15565b60015473ffffffffffffffffffffffffffffffffffffffff1661026b565b6103566103e33660046135db565b610b2c565b6103fb6103f6366004613675565b610c86565b6040516101fe91906136b0565b61041b61041636600461357b565b610d5f565b6040516101fe9190613707565b610430610eca565b6040516101fe9190613789565b61035661044b366004613440565b610edb565b61046361045e36600461357b565b610ff3565b6040516101fe919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff1661026b565b61023c6104eb36600461357b565b6110c8565b6103566104fe3660046133ca565b611178565b61050b611253565b6040516101fe91906137e3565b61046361052636600461357b565b61130b565b61035661053936600461396b565b6113dd565b7f000000000000000000000000000000000000000000000000000000000000000061026b565b7f00000000000000000000000000000000000000000000000000000000000000006101f2565b61035661059836600461350f565b611461565b6103566105ab3660046133ca565b611973565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061064357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061068f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040805160208101909152600081526106ad82611987565b600061070660608401356107016106c760c08701876139b0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bab92505050565b611c6f565b905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166340c10f1961075460608601604087016133ca565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b1580156107c157600080fd5b505af11580156107d5573d6000803e3d6000fd5b506107ea9250505060608401604085016133ca565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f08360405161084891815260200190565b60405180910390a3604080516020810190915290815292915050565b60006108a68383604051610879929190613a15565b604080519182900390912067ffffffffffffffff8716600090815260076020529190912060050190611e83565b949350505050565b6108b6611e9e565b61092384848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611ef192505050565b50505050565b610931611e9e565b61093a83610b15565b610981576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6109c18383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120a792505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a17576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610a9c611e9e565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d091749060200160405180910390a150565b600061068f600567ffffffffffffffff8416611e83565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590610b6c575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15610ba5576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610978565b8483141580610bb45750848114155b15610beb576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b85811015610c7d57610c75878783818110610c0b57610c0b613a25565b9050602002016020810190610c20919061357b565b868684818110610c3257610c32613a25565b905060600201803603810190610c489190613a54565b858585818110610c5a57610c5a613a25565b905060600201803603810190610c709190613a54565b6121a1565b600101610bee565b50505050505050565b6040805180820190915260608082526020820152610ca38261228b565b610cb08260600135612417565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610d0a8460200160208101906104eb919061357b565b8152602001610d576040805160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260609101604051602081830303815290604052905090565b905292915050565b67ffffffffffffffff8116600090815260076020526040812060609190610d88906005016124b9565b90506000815167ffffffffffffffff811115610da657610da6613825565b604051908082528060200260200182016040528015610dd957816020015b6060815260200190600190039081610dc45790505b50905060005b8251811015610ec25760086000848381518110610dfe57610dfe613a25565b602002602001015181526020019081526020016000208054610e1f90613a70565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4b90613a70565b8015610e985780601f10610e6d57610100808354040283529160200191610e98565b820191906000526020600020905b815481529060010190602001808311610e7b57829003601f168201915b5050505050828281518110610eaf57610eaf613a25565b6020908102919091010152600101610ddf565b509392505050565b6060610ed660026124b9565b905090565b610ee3611e9e565b610eec83610b15565b610f2e576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610978565b610f6e8282604051610f41929190613a15565b604080519182900390912067ffffffffffffffff86166000908152600760205291909120600501906124c6565b610faa578282826040517f74f23c7c00000000000000000000000000000000000000000000000000000000815260040161097893929190613b0c565b8267ffffffffffffffff167f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d768383604051610fe6929190613b30565b60405180910390a2505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261068f906124d2565b67ffffffffffffffff811660009081526007602052604090206004018054606091906110f390613a70565b80601f016020809104026020016040519081016040528092919081815260200182805461111f90613a70565b801561116c5780601f106111415761010080835404028352916020019161116c565b820191906000526020600020905b81548152906001019060200180831161114f57829003601f168201915b50505050509050919050565b611180611e9e565b73ffffffffffffffffffffffffffffffffffffffff81166111cd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b6060600061126160056124b9565b90506000815167ffffffffffffffff81111561127f5761127f613825565b6040519080825280602002602001820160405280156112a8578160200160208202803683370190505b50905060005b8251811015611304578281815181106112c9576112c9613a25565b60200260200101518282815181106112e3576112e3613a25565b67ffffffffffffffff909216602092830291909101909101526001016112ae565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261068f906124d2565b60095473ffffffffffffffffffffffffffffffffffffffff16331480159061141d575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15611456576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610978565b6109c18383836121a1565b611469611e9e565b60005b8381101561165657600085858381811061148857611488613a25565b905060200201602081019061149d919061357b565b90506114b4600567ffffffffffffffff83166124c6565b6114f6576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610978565b67ffffffffffffffff8116600090815260076020526040812061151b906005016124b9565b905060005b81518110156115875761157e82828151811061153e5761153e613a25565b6020026020010151600760008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206005016124c690919063ffffffff16565b50600101611520565b5067ffffffffffffffff8216600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906115f06004830182613282565b600582016000818161160282826132bc565b505060405167ffffffffffffffff871681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991694506020019250611644915050565b60405180910390a1505060010161146c565b5060005b8181101561196c57600083838381811061167657611676613a25565b90506020028101906116889190613b44565b61169190613c10565b90506116a281606001516000612584565b6116b181608001516000612584565b8060400151516000036116f0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516117089060059067ffffffffffffffff166126c1565b61174d5780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610978565b805167ffffffffffffffff16600090815260076020908152604091829020825160a08082018552606080870180518601516fffffffffffffffffffffffffffffffff90811680865263ffffffff42168689018190528351511515878b0181905284518a0151841686890181905294518b0151841660809889018190528954740100000000000000000000000000000000000000009283027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff7001000000000000000000000000000000008087027fffffffffffffffffffffffff000000000000000000000000000000000000000094851690981788178216929092178d5592810290971760018c01558c519889018d52898e0180518d01518716808b528a8e019590955280515115158a8f018190528151909d01518716988a01899052518d0151909516979098018790526002890180549a9091029990931617179094169590951790925590920290911760038201559082015160048201906118d09082613d87565b5060005b8260200151518110156119145761190c8360000151846020015183815181106118ff576118ff613a25565b60200260200101516120a7565b6001016118d4565b507f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2826000015183604001518460600151856080015160405161195a9493929190613ea1565b60405180910390a1505060010161165a565b5050505050565b61197b611e9e565b611984816126cd565b50565b61199a61029e60a08301608084016133ca565b6119f9576119ae60a08201608083016133ca565b6040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610978565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb611a45604084016020850161357b565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015611ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ada9190613f3a565b15611b11576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b29611b24604083016020840161357b565b612791565b611b49611b3c604083016020840161357b565b61033e60a08401846139b0565b611b8e57611b5a60a08201826139b0565b6040517f24eb47e5000000000000000000000000000000000000000000000000000000008152600401610978929190613b30565b611984611ba1604083016020840161357b565b82606001356128b7565b60008151600003611bdd57507f0000000000000000000000000000000000000000000000000000000000000000919050565b8151602014611c1a57816040517f953576f70000000000000000000000000000000000000000000000000000000081526004016109789190613395565b600082806020019051810190611c309190613f57565b905060ff81111561068f57826040517f953576f70000000000000000000000000000000000000000000000000000000081526004016109789190613395565b60007f000000000000000000000000000000000000000000000000000000000000000060ff168260ff1603611ca557508161068f565b7f000000000000000000000000000000000000000000000000000000000000000060ff168260ff161115611d90576000611cff7f000000000000000000000000000000000000000000000000000000000000000084613f9f565b9050604d8160ff161115611d73576040517fa9cb113d00000000000000000000000000000000000000000000000000000000815260ff80851660048301527f000000000000000000000000000000000000000000000000000000000000000016602482015260448101859052606401610978565b611d7e81600a6140d8565b611d8890856140e7565b91505061068f565b6000611dbc837f0000000000000000000000000000000000000000000000000000000000000000613f9f565b9050604d8160ff161180611e035750611dd681600a6140d8565b611e00907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6140e7565b84115b15611e6e576040517fa9cb113d00000000000000000000000000000000000000000000000000000000815260ff80851660048301527f000000000000000000000000000000000000000000000000000000000000000016602482015260448101859052606401610978565b611e7981600a6140d8565b6108a69085614122565b600081815260018301602052604081205415155b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611eef576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f0000000000000000000000000000000000000000000000000000000000000000611f48576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611fde576000838281518110611f6857611f68613a25565b60200260200101519050611f868160026128fe90919063ffffffff16565b15611fd55760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611f4b565b5060005b81518110156109c1576000828281518110611fff57611fff613a25565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612043575061209f565b61204e600282612920565b1561209d5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611fe2565b80516000036120e2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208083019190912067ffffffffffffffff841660009081526007909252604090912061211490600501826126c1565b61214e5782826040517f393b8ad2000000000000000000000000000000000000000000000000000000008152600401610978929190614139565b60008181526008602052604090206121668382613d87565b508267ffffffffffffffff167f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea83604051610fe69190613395565b6121aa83610b15565b6121ec576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610978565b6121f7826000612584565b67ffffffffffffffff8316600090815260076020526040902061221a9083612942565b612225816000612584565b67ffffffffffffffff8316600090815260076020526040902061224b9060020182612942565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b83838360405161227e9392919061415c565b60405180910390a1505050565b61229e61029e60a08301608084016133ca565b6122b2576119ae60a08201608083016133ca565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb6122fe604084016020850161357b565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa15801561236f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123939190613f3a565b156123ca576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123e26123dd60608301604084016133ca565b612ae4565b6123fa6123f5604083016020840161357b565b612b63565b61198461240d604083016020840161357b565b8260600135612cb1565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639dc29fac90604401600060405180830381600087803b1580156124a557600080fd5b505af115801561196c573d6000803e3d6000fd5b60606000611e9783612cf5565b6000611e978383612d50565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261256082606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261254491906141df565b85608001516fffffffffffffffffffffffffffffffff16612e43565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b81511561264f5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff161015806125da575060408201516fffffffffffffffffffffffffffffffff16155b1561261357816040517f8020d12400000000000000000000000000000000000000000000000000000000815260040161097891906141f2565b801561264b576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60408201516fffffffffffffffffffffffffffffffff16151580612688575060208201516fffffffffffffffffffffffffffffffff1615155b1561264b57816040517fd68af9cc00000000000000000000000000000000000000000000000000000000815260040161097891906141f2565b6000611e978383612e6b565b3373ffffffffffffffffffffffffffffffffffffffff82160361271c576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61279a81610b15565b6127dc576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610978565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa15801561285b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287f9190613f3a565b611984576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610978565b67ffffffffffffffff8216600090815260076020526040902061264b90600201827f0000000000000000000000000000000000000000000000000000000000000000612eba565b6000611e978373ffffffffffffffffffffffffffffffffffffffff8416612d50565b6000611e978373ffffffffffffffffffffffffffffffffffffffff8416612e6b565b815460009061296b90700100000000000000000000000000000000900463ffffffff16426141df565b90508015612a0d57600183015483546129b3916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612e43565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612a33916fffffffffffffffffffffffffffffffff908116911661323d565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061227e9084906141f2565b7f00000000000000000000000000000000000000000000000000000000000000001561198457612b15600282613253565b611984576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610978565b612b6c81610b15565b612bae576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610978565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4b919061422e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611984576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610978565b67ffffffffffffffff8216600090815260076020526040902061264b90827f0000000000000000000000000000000000000000000000000000000000000000612eba565b60608160000180548060200260200160405190810160405280929190818152602001828054801561116c57602002820191906000526020600020905b815481526020019060010190808311612d315750505050509050919050565b60008181526001830160205260408120548015612e39576000612d746001836141df565b8554909150600090612d88906001906141df565b9050808214612ded576000866000018281548110612da857612da8613a25565b9060005260206000200154905080876000018481548110612dcb57612dcb613a25565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612dfe57612dfe61424b565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061068f565b600091505061068f565b6000612e6285612e538486614122565b612e5d908761427a565b61323d565b95945050505050565b6000818152600183016020526040812054612eb25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561068f565b50600061068f565b825474010000000000000000000000000000000000000000900460ff161580612ee1575081155b15612eeb57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612f3190700100000000000000000000000000000000900463ffffffff16426141df565b90508015612ff15781831115612f73576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612fad9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612e43565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156130a85773ffffffffffffffffffffffffffffffffffffffff8416613050576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610978565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610978565b848310156131bb5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906130ec90826141df565b6130f6878a6141df565b613100919061427a565b61310a91906140e7565b905073ffffffffffffffffffffffffffffffffffffffff8616613163576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610978565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610978565b6131c585846141df565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081831061324c5781611e97565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611e97565b50805461328e90613a70565b6000825580601f1061329e575050565b601f01602090049060005260206000209081019061198491906132d6565b508054600082559060005260206000209081019061198491905b5b808211156132eb57600081556001016132d7565b5090565b60006020828403121561330157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9757600080fd5b6000815180845260005b818110156133575760208185018101518683018201520161333b565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000611e976020830184613331565b73ffffffffffffffffffffffffffffffffffffffff8116811461198457600080fd5b6000602082840312156133dc57600080fd5b8135611e97816133a8565b6000602082840312156133f957600080fd5b813567ffffffffffffffff81111561341057600080fd5b82016101008185031215611e9757600080fd5b803567ffffffffffffffff8116811461343b57600080fd5b919050565b60008060006040848603121561345557600080fd5b61345e84613423565b9250602084013567ffffffffffffffff8082111561347b57600080fd5b818601915086601f83011261348f57600080fd5b81358181111561349e57600080fd5b8760208285010111156134b057600080fd5b6020830194508093505050509250925092565b60008083601f8401126134d557600080fd5b50813567ffffffffffffffff8111156134ed57600080fd5b6020830191508360208260051b850101111561350857600080fd5b9250929050565b6000806000806040858703121561352557600080fd5b843567ffffffffffffffff8082111561353d57600080fd5b613549888389016134c3565b9096509450602087013591508082111561356257600080fd5b5061356f878288016134c3565b95989497509550505050565b60006020828403121561358d57600080fd5b611e9782613423565b60008083601f8401126135a857600080fd5b50813567ffffffffffffffff8111156135c057600080fd5b60208301915083602060608302850101111561350857600080fd5b600080600080600080606087890312156135f457600080fd5b863567ffffffffffffffff8082111561360c57600080fd5b6136188a838b016134c3565b9098509650602089013591508082111561363157600080fd5b61363d8a838b01613596565b9096509450604089013591508082111561365657600080fd5b5061366389828a01613596565b979a9699509497509295939492505050565b60006020828403121561368757600080fd5b813567ffffffffffffffff81111561369e57600080fd5b820160a08185031215611e9757600080fd5b6020815260008251604060208401526136cc6060840182613331565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612e628282613331565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561377c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261376a858351613331565b94509285019290850190600101613730565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137d757835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016137a5565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137d757835167ffffffffffffffff16835292840192918401916001016137ff565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561387757613877613825565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156138c4576138c4613825565b604052919050565b801515811461198457600080fd5b80356fffffffffffffffffffffffffffffffff8116811461343b57600080fd5b60006060828403121561390c57600080fd5b6040516060810181811067ffffffffffffffff8211171561392f5761392f613825565b6040529050808235613940816138cc565b815261394e602084016138da565b602082015261395f604084016138da565b60408201525092915050565b600080600060e0848603121561398057600080fd5b61398984613423565b925061399885602086016138fa565b91506139a785608086016138fa565b90509250925092565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139e557600080fd5b83018035915067ffffffffffffffff821115613a0057600080fd5b60200191503681900382131561350857600080fd5b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060608284031215613a6657600080fd5b611e9783836138fa565b600181811c90821680613a8457607f821691505b602082108103613abd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b67ffffffffffffffff84168152604060208201526000612e62604083018486613ac3565b6020815260006108a6602083018486613ac3565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1833603018112613b7857600080fd5b9190910192915050565b600082601f830112613b9357600080fd5b813567ffffffffffffffff811115613bad57613bad613825565b613bde60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161387d565b818152846020838601011115613bf357600080fd5b816020850160208301376000918101602001919091529392505050565b60006101208236031215613c2357600080fd5b613c2b613854565b613c3483613423565b815260208084013567ffffffffffffffff80821115613c5257600080fd5b9085019036601f830112613c6557600080fd5b813581811115613c7757613c77613825565b8060051b613c8685820161387d565b9182528381018501918581019036841115613ca057600080fd5b86860192505b83831015613cdc57823585811115613cbe5760008081fd5b613ccc3689838a0101613b82565b8352509186019190860190613ca6565b8087890152505050506040860135925080831115613cf957600080fd5b5050613d0736828601613b82565b604083015250613d1a36606085016138fa565b6060820152613d2c3660c085016138fa565b608082015292915050565b601f8211156109c1576000816000526020600020601f850160051c81016020861015613d605750805b601f850160051c820191505b81811015613d7f57828155600101613d6c565b505050505050565b815167ffffffffffffffff811115613da157613da1613825565b613db581613daf8454613a70565b84613d37565b602080601f831160018114613e085760008415613dd25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613d7f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e5557888601518255948401946001909101908401613e36565b5085821015613e9157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613ec581840187613331565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613f039050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612e62565b600060208284031215613f4c57600080fd5b8151611e97816138cc565b600060208284031215613f6957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff828116828216039081111561068f5761068f613f70565b600181815b8085111561401157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613ff757613ff7613f70565b8085161561400457918102915b93841c9390800290613fbd565b509250929050565b6000826140285750600161068f565b816140355750600061068f565b816001811461404b576002811461405557614071565b600191505061068f565b60ff84111561406657614066613f70565b50506001821b61068f565b5060208310610133831016604e8410600b8410161715614094575081810a61068f565b61409e8383613fb8565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156140d0576140d0613f70565b029392505050565b6000611e9760ff841683614019565b60008261411d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761068f5761068f613f70565b67ffffffffffffffff831681526040602082015260006108a66040830184613331565b67ffffffffffffffff8416815260e081016141a860208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526108a6565b8181038181111561068f5761068f613f70565b6060810161068f82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561424057600080fd5b8151611e97816133a8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8082018082111561068f5761068f613f7056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIBurnMintERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x610100806040523461035457614bb5803803809161001d82856105b2565b8339810160a0828203126103545781516001600160a01b03811692908390036103545761004c602082016105d5565b60408201516001600160401b0381116103545782019280601f85011215610354578351936001600160401b038511610359578460051b90602082019561009560405197886105b2565b865260208087019282010192831161035457602001905b82821061059a575050506100ce60806100c7606085016105e3565b93016105e3565b91331561058957600180546001600160a01b0319163317905584158015610578575b8015610567575b61055657608085905260c05260405163313ce56760e01b8152602081600481885afa6000918161051a575b506104ef575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526103d2575b50604051636eb1769f60e11b81523060048201819052602482015290602082604481845afa9182156103c657600092610392575b50600019820180921161037c57604051602081019263095ea7b360e01b84523060248301526044820152604481526101c76064826105b2565b6000806040948551936101da87866105b2565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082865af13d1561036f573d906001600160401b03821161035957845161024b94909261023c601f8201601f1916602001856105b2565b83523d6000602085013e610781565b8051806102d9575b8251614363908161085282396080518181816115fc015281816117e80152818161220e015281816123ea01528181612707015261277f015260a0518181816118a90152818161268e0152818161316801526131eb015260c051818181610bd50152818161169801526122a9015260e051818181610b65015281816116db01526120050152f35b81602091810103126103545760200151801590811503610354576102fe573880610253565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b9161024b92606091610781565b634e487b7160e01b600052601160045260246000fd5b9091506020813d6020116103be575b816103ae602093836105b2565b810103126103545751903861018e565b3d91506103a1565b6040513d6000823e3d90fd5b60206040516103e182826105b2565b60008152600036813760e051156104de5760005b815181101561045c576001906001600160a01b0361041382856105f7565b51168461041f82610639565b61042c575b5050016103f5565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13884610424565b505060005b82518110156104d5576001906001600160a01b0361047f82866105f7565b511680156104cf578361049182610721565b61049f575b50505b01610461565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a13883610496565b50610499565b5050503861015a565b6335f4a7b360e01b60005260046000fd5b60ff1660ff82168181036105035750610128565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161054e575b81610536602093836105b2565b8101031261035457610547906105d5565b9038610122565b3d9150610529565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038116156100f7565b506001600160a01b038316156100f0565b639b15e16f60e01b60005260046000fd5b602080916105a7846105e3565b8152019101906100ac565b601f909101601f19168101906001600160401b0382119082101761035957604052565b519060ff8216820361035457565b51906001600160a01b038216820361035457565b805182101561060b5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561060b5760005260206000200190600090565b600081815260036020526040902054801561071a57600019810181811161037c5760025460001981019190821161037c578181036106c9575b50505060025480156106b3576000190161068d816002610621565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6107026106da6106eb936002610621565b90549060031b1c9283926002610621565b819391549060031b91821b91600019901b19161790565b90556000526003602052604060002055388080610672565b5050600090565b8060005260036020526040600020541560001461077b5760025468010000000000000000811015610359576107626106eb8260018594016002556002610621565b9055600254906000526003602052604060002055600190565b50600090565b919290156107e35750815115610795575090565b3b1561079e5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156107f65750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b8381106108395750508160006044809484010152601f80199101168101030190fd5b6020828201810151604487840101528593500161081756fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461282257508063181f5a77146127a357806321df0da714612734578063240028e8146126b257806324f65ee71461265657806339077537146121685780634c5ef0ed1461214e57806354c8a4f314611fd157806362ddd3c414611f4d5780636d3d1a5814611efb57806379ba509714611e165780637d54534e14611d695780638926f54f14611d055780638da5cb5b14611cb3578063962d402014611b0f5780639a4575b914611554578063a42a7b8b146113cf578063a7cd63b714611303578063acfecf91146111df578063af58d59f14611178578063b0f479a114611126578063b7946580146110cf578063c0d7865514610fd7578063c4bffe2b14610e8e578063c75eea9c14610dc8578063cf7401f314610bf9578063dc0bd97114610b8a578063e0351e1314610b2f578063e8a1da171461025a5763f2fde38b1461016b57600080fd5b346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff6101b7612970565b6101bf6132f5565b1633811461022f57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102575761026936612a5e565b939190926102756132f5565b82915b80831061099a575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b85821015610996578160051b85013581811215610992578501906101208236031261099257604051956102e387612b66565b823567ffffffffffffffff8116810361098d578752602083013567ffffffffffffffff81116109895783019536601f880112156109895786359661032688612d6a565b97610334604051998a612b9e565b8089526020808a019160051b830101903682116109855760208301905b828210610952575050505060208801968752604084013567ffffffffffffffff811161094e5761038490369086016130c2565b9860408901998a526103ae61039c3660608801612bfc565b9560608b0196875260c0369101612bfc565b9660808a019788526103c0865161376c565b6103ca885161376c565b8a515115610926576103e667ffffffffffffffff8b5116613fbf565b156108ef5767ffffffffffffffff8a5116815260076020526040812061052687516fffffffffffffffffffffffffffffffff604082015116906104e16fffffffffffffffffffffffffffffffff6020830151169151151583608060405161044c81612b66565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b61064c89516fffffffffffffffffffffffffffffffff604082015116906106076fffffffffffffffffffffffffffffffff6020830151169151151583608060405161057081612b66565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff82116108c25761066f8354612e62565b601f8111610887575b50602090601f83116001146107e8576106c692918591836107dd575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b8951805182101561070157906106fb6001926106f4838f67ffffffffffffffff90511692612e4e565b5190613340565b016106cb565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2929593966107cf67ffffffffffffffff600197949c511692519351915161079b61076660405196879687526101006020880152610100870190612911565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a10190939492916102b1565b015190503880610694565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b81811061086f5750908460019594939210610838575b505050811b0190556106c9565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061082b565b92936020600181928786015181550195019301610815565b6108b29084865260208620601f850160051c810191602086106108b8575b601f0160051c0190613069565b38610678565b90915081906108a5565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff81116109815760209161097683928336918901016130c2565b815201910190610351565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff6109ba6109b5878588612dea565b612e29565b16956109c587613cf3565b15610b035786845260076020526109e160056040862001613afa565b94845b8651811015610a1a576001908987526007602052610a1360056040892001610a0c838b612e4e565b5190613e1e565b50016109e4565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610a538154612e62565b80610ac2575b5050500180549086815581610aa4575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a1019190949394610278565b865260208620908101905b81811015610a6957868155600101610aaf565b601f8111600114610ad85750555b863880610a59565b81835260208320610af391601f01861c810190600101613069565b8082528160208120915555610ad0565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610c31612993565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261025757604051610c6881612b82565b6024358015158103610dc45781526044356fffffffffffffffffffffffffffffffff81168103610dc45760208201526064356fffffffffffffffffffffffffffffffff81168103610dc457604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610dc05760405190610cef82612b82565b608435801515810361099257825260a4356fffffffffffffffffffffffffffffffff8116810361099257602083015260c4356fffffffffffffffffffffffffffffffff8116810361099257604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610d9e575b610d7257610d6f92936135aa565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610d61565b5080fd5b8280fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c6040610e8a9367ffffffffffffffff610e15612993565b610e1d612fb6565b50168152600760205220612fe1565b6136e7565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051906005548083528260208101600584526020842092845b818110610fbe575050610eec92500383612b9e565b8151610f10610efa82612d6a565b91610f086040519384612b9e565b808352612d6a565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015610f6f578067ffffffffffffffff610f5c60019388612e4e565b5116610f688286612e4e565b5201610f3d565b50925090604051928392602084019060208552518091526040840192915b818110610f9b575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101610f8d565b8454835260019485019487945060209093019201610ed7565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff611024612970565b61102c6132f5565b1680156110a75760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e8a61111261110d612993565b613047565b604051918291602083526020830190612911565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c60026040610e8a9467ffffffffffffffff6111c7612993565b6111cf612fb6565b5016815260076020522001612fe1565b50346102575767ffffffffffffffff6111f7366129aa565b9290916112026132f5565b169161121b836000526006602052604060002054151590565b156112d757828452600760205261124a6005604086200161123d368486612c99565b6020815191012090613e1e565b1561128f57907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691611289604051928392602084526020840191612f77565b0390a280f35b826112d3836040519384937f74f23c7c0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191612f77565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051600254808252602082018091600285526020852090855b8181106113b95750505082611362910383612b9e565b604051928392602084019060208552518091526040840192915b81811061138a575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff1684528594506020938401939092019160010161137c565b825484526020909301926001928301920161134c565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575767ffffffffffffffff611410612993565b168152600760205261142760056040832001613afa565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061146c61145683612d6a565b926114646040519485612b9e565b808452612d6a565b01835b818110611543575050825b82518110156114c0578061149060019285612e4e565b51855260086020526114a460408620612eb5565b6114ae8285612e4e565b526114b98184612e4e565b500161147a565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b8282106114f857505050500390f35b91936020611533827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186528851612911565b96019201920185949391926114e9565b80606060208093860101520161146f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc05760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610dc057606060206040516115d281612b4a565b8281520152608481016115e481612cfe565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611ac55750602481019177ffffffffffffffff0000000000000000000000000000000061164b84612e29565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611955578291611a96575b50611a6e576116d960448301612cfe565b7f0000000000000000000000000000000000000000000000000000000000000000611a1b575b5067ffffffffffffffff61171284612e29565b1661172a816000526006602052604060002054151590565b156119ef57602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa801561195557829061198c575b73ffffffffffffffffffffffffffffffffffffffff91501633036119605767ffffffffffffffff60646117bd85612e29565b930135921681526007602052816118106040832073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692839161406e565b803b15610dc0576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018490529082908290604490829084905af1801561195557611940575b61190f61189f61110d86866040519081527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df760203392a2612e29565b610e8a60405160ff7f0000000000000000000000000000000000000000000000000000000000000000166020820152602081526118dd604082612b9e565b604051926118ea84612b4a565b8352602083019081526040519384936020855251604060208601526060850190612911565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612911565b61194b828092612b9e565b6102575780611863565b6040513d84823e3d90fd5b807f728fe07b000000000000000000000000000000000000000000000000000000006024925233600452fd5b506020813d6020116119e7575b816119a660209383612b9e565b81010312610dc0575173ffffffffffffffffffffffffffffffffffffffff81168103610dc05773ffffffffffffffffffffffffffffffffffffffff9061178b565b3d9150611999565b602492507fa9902c7e000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16808252600360205260408220546116ff57602492507fd0d25976000000000000000000000000000000000000000000000000000000008252600452fd5b807f53ad11d80000000000000000000000000000000000000000000000000000000060049252fd5b611ab8915060203d602011611abe575b611ab08183612b9e565b8101906130dd565b386116c8565b503d611aa6565b8273ffffffffffffffffffffffffffffffffffffffff611ae6602493612cfe565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b50346102575760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057611b5f903690600401612a2d565b60243567ffffffffffffffff811161099257611b7f903690600401612ace565b60449291923567ffffffffffffffff811161098957611ba2903690600401612ace565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611c91575b611c6557818114801590611c5b575b611c3357865b818110611be7578780f35b80611c2d611bfb6109b5600194868c612dea565b611c0683878b612e3e565b611c27611c1f611c17868b8d612e3e565b923690612bfc565b913690612bfc565b916135aa565b01611bdc565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611bd6565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611bc7565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020611d5f67ffffffffffffffff611d4b612993565b166000526006602052604060002054151590565b6040519015158152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611dd9612970565b611de16132f5565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757805473ffffffffffffffffffffffffffffffffffffffff81163303611ed3577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b503461025757611f5c366129aa565b611f68939291936132f5565b67ffffffffffffffff8216611f8a816000526006602052604060002054151590565b15611fa65750610d6f9293611fa0913691612c99565b90613340565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b503461025757611ffb90612003611fe736612a5e565b9591611ff49391936132f5565b3691612d82565b933691612d82565b7f00000000000000000000000000000000000000000000000000000000000000001561212657815b835181101561209e578073ffffffffffffffffffffffffffffffffffffffff61205660019387612e4e565b511661206181613b5d565b61206d575b500161202b565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a138612066565b5090805b8251811015612122578073ffffffffffffffffffffffffffffffffffffffff6120cd60019386612e4e565b5116801561211c576120de81613f5f565b6120eb575b505b016120a2565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1846120e3565b506120e5565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b5034610257576020611d5f612162366129aa565b91612d1f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610dc457826040516121e881612aff565b52608482016121f681612cfe565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361263557506024820177ffffffffffffffff0000000000000000000000000000000061225c82612e29565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156125b8578591612616575b506125ee5767ffffffffffffffff6122f082612e29565b16612308816000526006602052604060002054151590565b156125c357602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156125b8578591612599575b501561256d5761237f81612e29565b61239160a48501916121628386612c48565b15612526575061242e67ffffffffffffffff9261242861242361241c6123b8604496612e29565b936064890135978895168a526007602052612412600260408c200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016998a9161406e565b60c4890190612c48565b3691612c99565b6130f5565b906131e8565b9201908361243b83612cfe565b823b15610dc0576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91909116600482015260248101859052918290604490829084905af1801561251b57916020946124c99273ffffffffffffffffffffffffffffffffffffffff9461250b575b5050612cfe565b166040518281527f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0843392a38060405161250281612aff565b52604051908152f35b8161251591612b9e565b386124c2565b6040513d86823e3d90fd5b6125309083612c48565b6112d36040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452602060048501526024840191612f77565b6024847f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b6125b2915060203d602011611abe57611ab08183612b9e565b38612370565b6040513d87823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008552600452602484fd5b6004847f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b61262f915060203d602011611abe57611ab08183612b9e565b386122d9565b8373ffffffffffffffffffffffffffffffffffffffff611ae6602493612cfe565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020906126ed612970565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575750610e8a6040516127e4604082612b9e565b601f81527f4275726e5769746846726f6d4d696e74546f6b656e506f6f6c20312e352e31006020820152604051918291602083526020830190612911565b905034610dc05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610dc0576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610dc457602092507faff2afbf0000000000000000000000000000000000000000000000000000000081149081156128e7575b81156128bd575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386128b6565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506128af565b919082519283825260005b84811061295b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161291c565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361098d57565b6004359067ffffffffffffffff8216820361098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff8116810361098d579160243567ffffffffffffffff811161098d578260238201121561098d5780600401359267ffffffffffffffff841161098d576024848301011161098d576024019190565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501948460051b01011161098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff811161098d5781612aa791600401612a2d565b929092916024359067ffffffffffffffff821161098d57612aca91600401612a2d565b9091565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501946060850201011161098d57565b6020810190811067ffffffffffffffff821117612b1b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117612b1b57604052565b60a0810190811067ffffffffffffffff821117612b1b57604052565b6060810190811067ffffffffffffffff821117612b1b57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612b1b57604052565b35906fffffffffffffffffffffffffffffffff8216820361098d57565b919082606091031261098d57604051612c1481612b82565b8092803590811515820361098d576040612c439181938552612c3860208201612bdf565b602086015201612bdf565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561098d570180359067ffffffffffffffff821161098d5760200191813603831361098d57565b92919267ffffffffffffffff8211612b1b5760405191612ce1601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200184612b9e565b82948184528183011161098d578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff8116810361098d5790565b612d67929167ffffffffffffffff612d4a921660005260076020526005604060002001923691612c99565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff8111612b1b5760051b60200190565b9291612d8d82612d6a565b93612d9b6040519586612b9e565b602085848152019260051b810191821161098d57915b818310612dbd57505050565b823573ffffffffffffffffffffffffffffffffffffffff8116810361098d57815260209283019201612db1565b9190811015612dfa5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff8116810361098d5790565b9190811015612dfa576060020190565b8051821015612dfa5760209160051b010190565b90600182811c92168015612eab575b6020831014612e7c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612e71565b9060405191826000825492612ec984612e62565b8084529360018116908115612f375750600114612ef0575b50612eee92500383612b9e565b565b90506000929192526020600020906000915b818310612f1b575050906020612eee9282010138612ee1565b6020919350806001915483858901015201910190918492612f02565b60209350612eee9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612ee1565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60405190612fc382612b66565b60006080838281528260208201528260408201528260608201520152565b90604051612fee81612b66565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff166000526007602052612d676004604060002001612eb5565b818110613074575050565b60008155600101613069565b8181029291811591840414171561309357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f8301121561098d57816020612d6793359101612c99565b9081602091031261098d5751801515810361098d5790565b80518015613164576020036131265760208180518101031261098d5760208101519060ff8211613126575060ff1690565b6112d3906040519182917f953576f7000000000000000000000000000000000000000000000000000000008352602060048401526024830190612911565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161309357565b60ff16604d811161309357600a0a90565b81156131b9570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146132ee578284116132c4579061322d9161318a565b91604d60ff841611801561328b575b6132555750509061324f612d679261319e565b90613080565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b506132958361319e565b80156131b9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04841161323c565b6132cd9161318a565b91604d60ff841611613255575050906132e8612d679261319e565b906131af565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff60015416330361331657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156135805767ffffffffffffffff81516020830120921691826000526007602052613375816005604060002001614019565b1561353c5760005260086020526040600020815167ffffffffffffffff8111612b1b576133a28254612e62565b601f811161350a575b506020601f8211600114613444579161341e827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea959361343495600091613439575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9055604051918291602083526020830190612911565b0390a2565b9050840151386133ed565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106134f25750926134349492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9896106134bb575b5050811b019055611112565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538806134af565b9192602060018192868a015181550194019201613474565b61353690836000526020600020601f840160051c810191602085106108b857601f0160051c0190613069565b386133ab565b50906112d36040519283927f393b8ad20000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190612911565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff1660008181526006602052604090205490929190156136ac57916136a960e092613675856136017f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761376c565b8460005260076020526136188160406000206138c7565b6136218361376c565b84600052600760205261363b8360026040600020016138c7565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161309357565b6136ef612fb6565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161374c602085019361374661373963ffffffff875116426136da565b8560808901511690613080565b90613f52565b8082101561376557505b16825263ffffffff4216905290565b9050613756565b805115613820576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116811090811591613817575b506137b45750565b606490613815604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b905015386137ac565b6fffffffffffffffffffffffffffffffff604082015116158015906138a8575b6138475750565b606490613815604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613840565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1991613a00606092805461390463ffffffff8260801c16426136da565b9081613a3f575b50506fffffffffffffffffffffffffffffffff6001816020860151169282815416808510600014613a3757508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556139b48651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b6136a960405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161393b565b6fffffffffffffffffffffffffffffffff91613a74839283613a6d6001880154948286169560801c90613080565b9116613f52565b80821015613af357505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff0000000000000000000000000000000016178155388061390b565b9050613a7e565b906040519182815491828252602082019060005260206000209260005b818110613b2c575050612eee92500383612b9e565b8454835260019485019487945060209093019201613b17565b8054821015612dfa5760005260206000200190600090565b6000818152600360205260409020548015613cec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161309357600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613c7d575b5050506002548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613c0b816002613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613cd4613c8e613c9f936002613b45565b90549060031b1c9283926002613b45565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526003602052604060002055388080613bd2565b5050600090565b6000818152600660205260409020548015613cec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161309357600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613de4575b5050506005548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613da1816005613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b613e06613df5613c9f936005613b45565b90549060031b1c9283926005613b45565b90556000526006602052604060002055388080613d68565b9060018201918160005282602052604060002054801515600014613f49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613093578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613f12575b50505080548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613ed38282613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b613f32613f22613c9f9386613b45565b90549060031b1c92839286613b45565b905560005283602052604060002055388080613e9b565b50505050600090565b9190820180921161309357565b80600052600360205260406000205415600014613fb95760025468010000000000000000811015612b1b57613fa0613c9f8260018594016002556002613b45565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014613fb95760055468010000000000000000811015612b1b57614000613c9f8260018594016005556005613b45565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054613cec5780549068010000000000000000821015612b1b5782614057613c9f846001809601855584613b45565b905580549260005201602052604060002055600190565b929192805460ff8160a01c1615801561434e575b614347576fffffffffffffffffffffffffffffffff811690600183019081546140c763ffffffff6fffffffffffffffffffffffffffffffff83169360801c16426136da565b90816142a9575b5050848110614227575083821061415657507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff8061412485602096956136da565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061416892505460801c926136da565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613093576141b66141bb9273ffffffffffffffffffffffffffffffffffffffff94613f52565b6131af565b92169182156141f7577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614279577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b82859293951161431d576142c4926137469160801c90613080565b808310156143185750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806140ce565b6142cf565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b50821561408256fea164736f6c634300081a000a",
}
var BurnWithFromMintTokenPoolABI = BurnWithFromMintTokenPoolMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go b/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go
index 208c0e37d63..4e34b55cfcf 100644
--- a/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go
+++ b/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go
@@ -89,7 +89,7 @@ type RMNRemoteReport struct {
}
var EncodingUtilsMetaData = &bind.MetaData{
- ABI: "[{\"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\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNRemote.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"commitReport\",\"type\":\"tuple\"}],\"name\":\"exposeCommitReport\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config[]\",\"name\":\"config\",\"type\":\"tuple[]\"}],\"name\":\"exposeOCR3Config\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"rmnReportVersion\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnRemoteContractAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"offrampAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"internalType\":\"structRMNRemote.Report\",\"name\":\"rmnReport\",\"type\":\"tuple\"}],\"name\":\"exposeRmnReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"exposeCommitReport\",\"inputs\":[{\"name\":\"commitReport\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exposeOCR3Config\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Config[]\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exposeRmnReport\",\"inputs\":[{\"name\":\"rmnReportVersion\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rmnReport\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Report\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemoteContractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"offrampAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]",
}
var EncodingUtilsABI = EncodingUtilsMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
index 7ea7f633147..83a854121f5 100644
--- a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
+++ b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go
@@ -65,8 +65,8 @@ type CCIPHomeVersionedConfig struct {
}
var CCIPHomeMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"gotConfigDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"callDonId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"capabilityRegistryDonId\",\"type\":\"uint32\"}],\"name\":\"DONIdMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FChainMustBePositive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"fChain\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"FRoleDON\",\"type\":\"uint256\"}],\"name\":\"FChainTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node\",\"name\":\"node\",\"type\":\"tuple\"}],\"name\":\"InvalidNode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"InvalidSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoOpStateTransitionNotAllowed\",\"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\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RMNHomeAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RevokingZeroDigestNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ActiveConfigRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"CandidateConfigRevoked\",\"type\":\"event\"},{\"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\":\"structCCIPHome.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigPromoted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"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\":\"structCCIPHome.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"update\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getActiveDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getAllConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.VersionedConfig\",\"name\":\"activeConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.VersionedConfig\",\"name\":\"candidateConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getCandidateDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"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\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.ChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPHome.VersionedConfig\",\"name\":\"versionedConfig\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"ok\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getConfigDigests\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"activeConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumChainConfigurations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"digestToPromote\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"digestToRevoke\",\"type\":\"bytes32\"}],\"name\":\"promoteCandidateAndRevokeActive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"revokeCandidate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"FRoleDON\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rmnHomeAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signerKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transmitterKey\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPHome.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"digestToOverwrite\",\"type\":\"bytes32\"}],\"name\":\"setCandidate\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"newConfigDigest\",\"type\":\"bytes32\"}],\"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: "0x60a06040526006805463ffffffff191690553480156200001e57600080fd5b5060405162004e0238038062004e0283398101604081905262000041916200014c565b336000816200006357604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b038481169190911790915581161562000096576200009681620000d2565b50506001600160a01b038116620000c0576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03166080526200017e565b336001600160a01b03821603620000fc57604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200015f57600080fd5b81516001600160a01b03811681146200017757600080fd5b9392505050565b608051614c5a620001a86000396000818161019b015281816123600152612dba0152614c5a6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80637ac0d41e116100cd578063b74b235611610081578063f2fde38b11610066578063f2fde38b14610391578063f442c89a146103a4578063fba64a7c146103b757600080fd5b8063b74b23561461035e578063bae4e0fa1461037e57600080fd5b80638da5cb5b116100b25780638da5cb5b1461030d578063922ea4061461032b578063b149092b1461033e57600080fd5b80637ac0d41e146102e45780638318ed5d146102ec57600080fd5b80634851d549116101245780635f1edd9c116101095780635f1edd9c146102a85780637524051a146102c957806379ba5097146102dc57600080fd5b80634851d5491461026b5780635a837f971461029357600080fd5b8063181f5a7711610155578063181f5a77146101e057806333d9704a146102295780633df45a721461024a57600080fd5b806301ffc9a714610171578063020330e614610199575b600080fd5b61018461017f366004613127565b6103ca565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b61021c6040518060400160405280601281526020017f43434950486f6d6520312e362e302d646576000000000000000000000000000081525081565b60405161019091906131b9565b61023c610237366004613206565b610463565b60405161019092919061344d565b61025d610258366004613471565b61095d565b6040516101909291906134aa565b61027e610279366004613471565b61125d565b60408051928352602083019190915201610190565b6102a66102a13660046134cf565b611353565b005b6102bb6102b6366004613471565b611666565b604051908152602001610190565b6102a66102d7366004613206565b6116dd565b6102a66118c8565b6102bb611996565b61021c6102fa366004613515565b5060408051602081019091526000815290565b60015473ffffffffffffffffffffffffffffffffffffffff166101bb565b6102bb610339366004613471565b6119a7565b61035161034c366004613553565b6119f8565b60405161019091906135e7565b61037161036c3660046135fa565b611b32565b604051610190919061361c565b6102bb61038c3660046136ba565b611d97565b6102a661039f36600461372a565b611f95565b6102a66103b23660046137a5565b611fa9565b6102a66103c5366004613811565b612348565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea72100000000000000000000000000000000000000000000000000000000148061045d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b61046b612fb0565b6000805b600281101561094f5763ffffffff8616600090815260056020526040812085918760018111156104a1576104a1613247565b60018111156104b2576104b2613247565b815260200190815260200160002082600281106104d1576104d16138ce565b60070201600101541480156104e557508315155b156109475763ffffffff861660009081526005602052604081209086600181111561051257610512613247565b600181111561052357610523613247565b81526020019081526020016000208160028110610542576105426138ce565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054939592949386938501929190829060ff168781111561059b5761059b613247565b60018111156105ac576105ac613247565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610604906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610630906138fd565b801561067d5780601f106106525761010080835404028352916020019161067d565b820191906000526020600020905b81548152906001019060200180831161066057829003601f168201915b50505050508152602001600282018054610696906138fd565b80601f01602080910402602001604051908101604052809291908181526020018280546106c2906138fd565b801561070f5780601f106106e45761010080835404028352916020019161070f565b820191906000526020600020905b8154815290600101906020018083116106f257829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561089d57838290600052602060002090600302016040518060600160405290816000820154815260200160018201805461077a906138fd565b80601f01602080910402602001604051908101604052809291908181526020018280546107a6906138fd565b80156107f35780601f106107c8576101008083540402835291602001916107f3565b820191906000526020600020905b8154815290600101906020018083116107d657829003601f168201915b5050505050815260200160028201805461080c906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610838906138fd565b80156108855780601f1061085a57610100808354040283529160200191610885565b820191906000526020600020905b81548152906001019060200180831161086857829003601f168201915b5050505050815250508152602001906001019061073d565b5050505081526020016004820180546108b5906138fd565b80601f01602080910402602001604051908101604052809291908181526020018280546108e1906138fd565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050815250508152505091509250925050610955565b60010161046f565b50600090505b935093915050565b610965612fb0565b61096d612fb0565b63ffffffff841660009081526005602052604081208185600181111561099557610995613247565b60018111156109a6576109a6613247565b81526020019081526020016000206109be8686612605565b63ffffffff16600281106109d4576109d46138ce565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff90911690811115610a2f57610a2f613247565b6001811115610a4057610a40613247565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610a98906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac4906138fd565b8015610b115780601f10610ae657610100808354040283529160200191610b11565b820191906000526020600020905b815481529060010190602001808311610af457829003601f168201915b50505050508152602001600282018054610b2a906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b56906138fd565b8015610ba35780601f10610b7857610100808354040283529160200191610ba3565b820191906000526020600020905b815481529060010190602001808311610b8657829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b82821015610d31578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054610c0e906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3a906138fd565b8015610c875780601f10610c5c57610100808354040283529160200191610c87565b820191906000526020600020905b815481529060010190602001808311610c6a57829003601f168201915b50505050508152602001600282018054610ca0906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccc906138fd565b8015610d195780601f10610cee57610100808354040283529160200191610d19565b820191906000526020600020905b815481529060010190602001808311610cfc57829003601f168201915b50505050508152505081526020019060010190610bd1565b505050508152602001600482018054610d49906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610d75906138fd565b8015610dc25780601f10610d9757610100808354040283529160200191610dc2565b820191906000526020600020905b815481529060010190602001808311610da557829003601f168201915b50505091909252505050905250602081015190915015610de0578092505b63ffffffff8516600090815260056020526040812081866001811115610e0857610e08613247565b6001811115610e1957610e19613247565b8152602001908152602001600020610e31878761265c565b63ffffffff1660028110610e4757610e476138ce565b6040805160608101825260079290920292909201805463ffffffff1682526001808201546020840152835161010081018552600283018054949593949386019391929091839160ff90911690811115610ea257610ea2613247565b6001811115610eb357610eb3613247565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a0100000000000000000000909104166060820152600182018054608090920191610f0b906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610f37906138fd565b8015610f845780601f10610f5957610100808354040283529160200191610f84565b820191906000526020600020905b815481529060010190602001808311610f6757829003601f168201915b50505050508152602001600282018054610f9d906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc9906138fd565b80156110165780601f10610feb57610100808354040283529160200191611016565b820191906000526020600020905b815481529060010190602001808311610ff957829003601f168201915b5050505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b828210156111a4578382906000526020600020906003020160405180606001604052908160008201548152602001600182018054611081906138fd565b80601f01602080910402602001604051908101604052809291908181526020018280546110ad906138fd565b80156110fa5780601f106110cf576101008083540402835291602001916110fa565b820191906000526020600020905b8154815290600101906020018083116110dd57829003601f168201915b50505050508152602001600282018054611113906138fd565b80601f016020809104026020016040519081016040528092919081815260200182805461113f906138fd565b801561118c5780601f106111615761010080835404028352916020019161118c565b820191906000526020600020905b81548152906001019060200180831161116f57829003601f168201915b50505050508152505081526020019060010190611044565b5050505081526020016004820180546111bc906138fd565b80601f01602080910402602001604051908101604052809291908181526020018280546111e8906138fd565b80156112355780601f1061120a57610100808354040283529160200191611235565b820191906000526020600020905b81548152906001019060200180831161121857829003601f168201915b50505091909252505050905250602081015190915015611253578092505b50505b9250929050565b63ffffffff8216600090815260056020526040812081908184600181111561128757611287613247565b600181111561129857611298613247565b81526020019081526020016000206112b08585612605565b63ffffffff16600281106112c6576112c66138ce565b6007020160010154600560008663ffffffff1663ffffffff168152602001908152602001600020600085600181111561130157611301613247565b600181111561131257611312613247565b815260200190815260200160002061132a868661265c565b63ffffffff1660028110611340576113406138ce565b6007020160010154915091509250929050565b61135b6126b7565b81158015611367575080155b1561139e576040517f7b4d1e4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113aa858561265c565b63ffffffff86811660009081526005602052604081209290911692508491908660018111156113db576113db613247565b60018111156113ec576113ec613247565b8152602001908152602001600020826002811061140b5761140b6138ce565b6007020160010154146114bf5763ffffffff851660009081526005602052604081209085600181111561144057611440613247565b600181111561145157611451613247565b81526020019081526020016000208160028110611470576114706138ce565b6007020160010154836040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016114b6929190918252602082015260400190565b60405180910390fd5b63ffffffff85166000908152600560205260408120818660018111156114e7576114e7613247565b60018111156114f8576114f8613247565b81526020019081526020016000206115108787612605565b63ffffffff1660028110611526576115266138ce565b600702019050828160010154146115795760018101546040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016114b6565b6000600180830182905563ffffffff88168252600760205260408220909187838111156115a8576115a8613247565b60018111156115b9576115b9613247565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000811663ffffffff918216939093181691909117905582156116335760405183907f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b890600090a25b60405184907ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e90600090a2505050505050565b63ffffffff821660009081526005602052604081208183600181111561168e5761168e613247565b600181111561169f5761169f613247565b81526020019081526020016000206116b78484612605565b63ffffffff16600281106116cd576116cd6138ce565b6007020160010154905092915050565b6116e56126b7565b8061171c576040517f0849d8cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611728848461265c565b63ffffffff858116600090815260056020526040812092909116925083919085600181111561175957611759613247565b600181111561176a5761176a613247565b81526020019081526020016000208260028110611789576117896138ce565b6007020160010154146118345763ffffffff84166000908152600560205260408120908460018111156117be576117be613247565b60018111156117cf576117cf613247565b815260200190815260200160002081600281106117ee576117ee6138ce565b6007020160010154826040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016114b6929190918252602082015260400190565b60405182907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a263ffffffff841660009081526005602052604081209084600181111561188757611887613247565b600181111561189857611898613247565b815260200190815260200160002081600281106118b7576118b76138ce565b600702016001016000905550505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611919576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006119a260036126f2565b905090565b63ffffffff82166000908152600560205260408120818360018111156119cf576119cf613247565b60018111156119e0576119e0613247565b81526020019081526020016000206116b7848461265c565b6040805160608082018352808252600060208301529181019190915267ffffffffffffffff821660009081526002602090815260409182902082518154608093810282018401909452606081018481529093919284928491840182828015611a7f57602002820191906000526020600020905b815481526020019060010190808311611a6b575b5050509183525050600182015460ff166020820152600282018054604090920191611aa9906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad5906138fd565b8015611b225780601f10611af757610100808354040283529160200191611b22565b820191906000526020600020905b815481529060010190602001808311611b0557829003601f168201915b5050505050815250509050919050565b60606000611b4060036126f2565b90506000611b4e848661397f565b9050831580611b5d5750818110155b15611b9d576040805160008082526020820190925290611b93565b611b8061302c565b815260200190600190039081611b785790505b509250505061045d565b6000611ba985836139c5565b905082811115611bb65750815b6000611bc283836139d8565b67ffffffffffffffff811115611bda57611bda613996565b604051908082528060200260200182016040528015611c1357816020015b611c0061302c565b815260200190600190039081611bf85790505b509050825b82811015611d8c576000611c2d6003836126fc565b60408051808201825267ffffffffffffffff83168082526000908152600260209081529083902083518154608081850283018101909652606082018181529697509395928601949093919284929091849190840182828015611cae57602002820191906000526020600020905b815481526020019060010190808311611c9a575b5050509183525050600182015460ff166020820152600282018054604090920191611cd8906138fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611d04906138fd565b8015611d515780601f10611d2657610100808354040283529160200191611d51565b820191906000526020600020905b815481529060010190602001808311611d3457829003601f168201915b50505091909252505050905283611d6887856139d8565b81518110611d7857611d786138ce565b602090810291909101015250600101611c18565b509695505050505050565b6000611da16126b7565b611db2611dad84613c06565b61270f565b6000611dbe86866119a7565b9050828114611e03576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018490526044016114b6565b8015611e355760405183907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a25b60068054600091908290611e4e9063ffffffff16613d02565b91906101000a81548163ffffffff021916908363ffffffff16021790559050611e98878787604051602001611e839190613fde565b60405160208183030381529060405284612b7d565b63ffffffff881660009081526005602052604081209194509081886001811115611ec457611ec4613247565b6001811115611ed557611ed5613247565b8152602001908152602001600020611eed898961265c565b63ffffffff1660028110611f0357611f036138ce565b600702016001810185905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff841617815590508560028201611f4d82826144c4565b905050837f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c68388604051611f8292919061468b565b60405180910390a2505050949350505050565b611f9d612c3d565b611fa681612c8e565b50565b611fb1612c3d565b60005b8381101561219757611ff8858583818110611fd157611fd16138ce565b9050602002016020810190611fe69190613553565b60039067ffffffffffffffff16612d52565b6120625784848281811061200e5761200e6138ce565b90506020020160208101906120239190613553565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016114b6565b60026000868684818110612078576120786138ce565b905060200201602081019061208d9190613553565b67ffffffffffffffff16815260208101919091526040016000908120906120b4828261306f565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556120ec60028301600061308d565b505061212a858583818110612103576121036138ce565b90506020020160208101906121189190613553565b60039067ffffffffffffffff16612d6a565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f085858381811061215e5761215e6138ce565b90506020020160208101906121739190613553565b60405167ffffffffffffffff909116815260200160405180910390a1600101611fb4565b5060005b818110156123415760008383838181106121b7576121b76138ce565b90506020028101906121c991906146b2565b6121d7906020810190614227565b6121e0906146e6565b905060008484848181106121f6576121f66138ce565b905060200281019061220891906146b2565b612216906020810190613553565b90506122258260000151612d76565b816020015160ff16600003612266576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff811660009081526002602090815260409091208351805185936122969284929101906130c7565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff909216919091179055604082015160028201906122e390826147b8565b506122fd91506003905067ffffffffffffffff8316612e38565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e0818360405161232f9291906148b4565b60405180910390a1505060010161219b565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146123b7576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006123c660048286886148d7565b6123cf91614901565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa000000000000000000000000000000000000000000000000000000001480159061246557507fffffffff0000000000000000000000000000000000000000000000000000000081167f7524051a0000000000000000000000000000000000000000000000000000000014155b80156124b357507fffffffff0000000000000000000000000000000000000000000000000000000081167f5a837f970000000000000000000000000000000000000000000000000000000014155b1561250e576040517f12ba286f0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016114b6565b600061251e6024600487896148d7565b81019061252b9190614949565b90508263ffffffff16811461257c576040517f8a6e4ce800000000000000000000000000000000000000000000000000000000815263ffffffff8083166004830152841660248201526044016114b6565b6000803073ffffffffffffffffffffffffffffffffffffffff1688886040516125a6929190614962565b6000604051808303816000865af19150503d80600081146125e3576040519150601f19603f3d011682016040523d82523d6000602084013e6125e8565b606091505b5091509150816125f9573d60208201fd5b50505050505050505050565b63ffffffff821660009081526007602052604081208183600181111561262d5761262d613247565b600181111561263e5761263e613247565b815260208101919091526040016000205463ffffffff169392505050565b63ffffffff821660009081526007602052604081208183600181111561268457612684613247565b600181111561269557612695613247565b815260208101919091526040016000205463ffffffff16600118905092915050565b3330146126f0576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600061045d825490565b60006127088383612e44565b9392505050565b806020015167ffffffffffffffff16600003612757576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600181111561276c5761276c613247565b1415801561278d575060018151600181111561278a5761278a613247565b14155b156127c4576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080810151511580612801575060408051600060208201520160405160208183030381529060405280519060200120816080015180519060200120145b15612838576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a08101515115806128755750604080516000602082015201604051602081830303815290604052805190602001208160a0015180519060200120145b156128ac576040517fdee9857400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516128c79060039067ffffffffffffffff16612d52565b61290f5760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016114b6565b60408082015160208084015167ffffffffffffffff1660009081526002909152919091206001015460ff918216911681811115612982576040517f2db2204000000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016114b6565b60c0830151516101008111156129c4576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129cf83600361397f565b8111612a07576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808267ffffffffffffffff811115612a2357612a23613996565b604051908082528060200260200182016040528015612a4c578160200160208202803683370190505b50905060005b83811015612b0c5760008760c001518281518110612a7257612a726138ce565b60200260200101519050806040015151600014612a975783612a9381614972565b9450505b6020810151511580612aa857508051155b15612ae157806040517f9fa403140000000000000000000000000000000000000000000000000000000081526004016114b691906149aa565b8060000151838381518110612af857612af86138ce565b602090810291909101015250600101612a52565b506000612b1a85600361397f565b612b259060016139c5565b905080831015612b6b576040517f548dd21f00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016114b6565b612b7482612d76565b50505050505050565b6040516000907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90612bdb907f45564d000000000000000000000000000000000000000000000000000000000090469030908a908a9089906020016149bd565b60408051601f1981840301815290829052612bfa918690602001614a16565b60408051808303601f190181529190528051602090910120167e0a0000000000000000000000000000000000000000000000000000000000001795945050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146126f0576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612cdd576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515612708565b60006127088383612e6e565b805115611fa6576040517f05a5196600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305a5196690612def908490600401614a45565b600060405180830381865afa158015612e0c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e349190810190614ac2565b5050565b60006127088383612f61565b6000826000018281548110612e5b57612e5b6138ce565b9060005260206000200154905092915050565b60008181526001830160205260408120548015612f57576000612e926001836139d8565b8554909150600090612ea6906001906139d8565b9050808214612f0b576000866000018281548110612ec657612ec66138ce565b9060005260206000200154905080876000018481548110612ee957612ee96138ce565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612f1c57612f1c614c1e565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061045d565b600091505061045d565b6000818152600183016020526040812054612fa85750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561045d565b50600061045d565b60408051606081018252600080825260208201529081016130276040805161010081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b905290565b6040518060400160405280600067ffffffffffffffff168152602001613027604051806060016040528060608152602001600060ff168152602001606081525090565b5080546000825590600052602060002090810190611fa69190613112565b508054613099906138fd565b6000825580601f106130a9575050565b601f016020900490600052602060002090810190611fa69190613112565b828054828255906000526020600020908101928215613102579160200282015b828111156131025782518255916020019190600101906130e7565b5061310e929150613112565b5090565b5b8082111561310e5760008155600101613113565b60006020828403121561313957600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461270857600080fd5b60005b8381101561318457818101518382015260200161316c565b50506000910152565b600081518084526131a5816020860160208601613169565b601f01601f19169290920160200192915050565b602081526000612708602083018461318d565b63ffffffff81168114611fa657600080fd5b80356131e9816131cc565b919050565b60028110611fa657600080fd5b80356131e9816131ee565b60008060006060848603121561321b57600080fd5b8335613226816131cc565b92506020840135613236816131ee565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106132ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8051825260006020820151606060208501526132d0606085018261318d565b9050604083015184820360408601526132e9828261318d565b95945050505050565b60008282518085526020808601955060208260051b8401016020860160005b8481101561333f57601f1986840301895261332d8383516132b1565b98840198925090830190600101613311565b5090979650505050505050565b63ffffffff815116825260208101516020830152600060408201516060604085015261337c606085018251613276565b602081015167ffffffffffffffff8116608086015250604081015160ff811660a086015250606081015167ffffffffffffffff811660c08601525060808101516101008060e08701526133d361016087018361318d565b915060a08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa080888503018389015261340e848361318d565b935060c08501519250808885030161012089015261342c84846132f2565b935060e0850151945080888503016101408901525050506132e9818361318d565b604081526000613460604083018561334c565b905082151560208301529392505050565b6000806040838503121561348457600080fd5b823561348f816131cc565b9150602083013561349f816131ee565b809150509250929050565b6040815260006134bd604083018561334c565b82810360208401526132e9818561334c565b600080600080608085870312156134e557600080fd5b84356134f0816131cc565b93506020850135613500816131ee565b93969395505050506040820135916060013590565b60006020828403121561352757600080fd5b8135612708816131cc565b67ffffffffffffffff81168114611fa657600080fd5b80356131e981613532565b60006020828403121561356557600080fd5b813561270881613532565b60008151808452602080850194506020840160005b838110156135a157815187529582019590820190600101613585565b509495945050505050565b60008151606084526135c16060850182613570565b905060ff6020840151166020850152604083015184820360408601526132e9828261318d565b60208152600061270860208301846135ac565b6000806040838503121561360d57600080fd5b50508035926020909101359150565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156136ac578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff168452870151878401879052613699878501826135ac565b9588019593505090860190600101613645565b509098975050505050505050565b600080600080608085870312156136d057600080fd5b84356136db816131cc565b935060208501356136eb816131ee565b9250604085013567ffffffffffffffff81111561370757600080fd5b8501610100818803121561371a57600080fd5b9396929550929360600135925050565b60006020828403121561373c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461270857600080fd5b60008083601f84011261377257600080fd5b50813567ffffffffffffffff81111561378a57600080fd5b6020830191508360208260051b850101111561125657600080fd5b600080600080604085870312156137bb57600080fd5b843567ffffffffffffffff808211156137d357600080fd5b6137df88838901613760565b909650945060208701359150808211156137f857600080fd5b5061380587828801613760565b95989497509550505050565b6000806000806000806080878903121561382a57600080fd5b863567ffffffffffffffff8082111561384257600080fd5b61384e8a838b01613760565b9098509650602089013591508082111561386757600080fd5b818901915089601f83011261387b57600080fd5b81358181111561388a57600080fd5b8a602082850101111561389c57600080fd5b6020830196508095505050506138b460408801613548565b91506138c2606088016131de565b90509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061391157607f821691505b60208210810361394a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761045d5761045d613950565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8082018082111561045d5761045d613950565b8181038181111561045d5761045d613950565b6040516060810167ffffffffffffffff81118282101715613a0e57613a0e613996565b60405290565b604051610100810167ffffffffffffffff81118282101715613a0e57613a0e613996565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a6157613a61613996565b604052919050565b60ff81168114611fa657600080fd5b80356131e981613a69565b600082601f830112613a9457600080fd5b813567ffffffffffffffff811115613aae57613aae613996565b613ac16020601f19601f84011601613a38565b818152846020838601011115613ad657600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115613b0d57613b0d613996565b5060051b60200190565b600082601f830112613b2857600080fd5b81356020613b3d613b3883613af3565b613a38565b82815260059290921b84018101918181019086841115613b5c57600080fd5b8286015b84811015611d8c57803567ffffffffffffffff80821115613b815760008081fd5b8189019150606080601f19848d03011215613b9c5760008081fd5b613ba46139eb565b87840135815260408085013584811115613bbe5760008081fd5b613bcc8e8b83890101613a83565b838b015250918401359183831115613be45760008081fd5b613bf28d8a85880101613a83565b908201528652505050918301918301613b60565b60006101008236031215613c1957600080fd5b613c21613a14565b613c2a836131fb565b8152613c3860208401613548565b6020820152613c4960408401613a78565b6040820152613c5a60608401613548565b6060820152608083013567ffffffffffffffff80821115613c7a57600080fd5b613c8636838701613a83565b608084015260a0850135915080821115613c9f57600080fd5b613cab36838701613a83565b60a084015260c0850135915080821115613cc457600080fd5b613cd036838701613b17565b60c084015260e0850135915080821115613ce957600080fd5b50613cf636828601613a83565b60e08301525092915050565b600063ffffffff808316818103613d1b57613d1b613950565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613d5a57600080fd5b830160208101925035905067ffffffffffffffff811115613d7a57600080fd5b80360382131561125657600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613de957600080fd5b830160208101925035905067ffffffffffffffff811115613e0957600080fd5b8060051b360382131561125657600080fd5b60008383855260208086019550808560051b830101846000805b88811015613ed957601f19868503018a5282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1893603018112613e77578283fd5b8801803585526060613e8b87830183613d25565b8289890152613e9d8389018284613d89565b925050506040613eaf81840184613d25565b935087830382890152613ec3838583613d89565b9d89019d97505050938601935050600101613e35565b509198975050505050505050565b6000610100613efe84613ef9856131fb565b613276565b613f0a60208401613548565b67ffffffffffffffff166020850152613f2560408401613a78565b60ff166040850152613f3960608401613548565b67ffffffffffffffff166060850152613f556080840184613d25565b826080870152613f688387018284613d89565b92505050613f7960a0840184613d25565b85830360a0870152613f8c838284613d89565b92505050613f9d60c0840184613db4565b85830360c0870152613fb0838284613e1b565b92505050613fc160e0840184613d25565b85830360e0870152613fd4838284613d89565b9695505050505050565b6020815260006127086020830184613ee7565b6000813561045d81613532565b6000813561045d81613a69565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261404057600080fd5b83018035915067ffffffffffffffff82111561405b57600080fd5b60200191503681900382131561125657600080fd5b5b81811015612e345760008155600101614071565b601f8211156140be57806000526020600020601f840160051c810160208510156140ac5750805b612341601f850160051c830182614070565b505050565b67ffffffffffffffff8311156140db576140db613996565b6140ef836140e983546138fd565b83614085565b6000601f841160018114614141576000851561410b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355612341565b600083815260209020601f19861690835b828110156141725786850135825560209485019460019092019101614152565b50868210156141ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126141f457600080fd5b83018035915067ffffffffffffffff82111561420f57600080fd5b6020019150600581901b360382131561125657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261425b57600080fd5b9190910192915050565b61426f81546138fd565b8015612e3457601f81116001811461428957505060009055565b8260005260206000206142a7601f840160051c820160018301614070565b60008085559055505050565b81358155600180820160206142cb602086018661400b565b67ffffffffffffffff8111156142e3576142e3613996565b6142f7816142f186546138fd565b86614085565b6000601f82116001811461434957600083156143135750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b1786556143be565b600086815260209020601f19841690835b82811015614377578685013582559387019390890190870161435a565b50848210156143b2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19848701351681555b505060018360011b0186555b505050505050506143d2604083018361400b565b6143e08183600286016140c3565b50505050565b680100000000000000008311156143ff576143ff613996565b80548382558084101561447e5760038160030260038104831461442457614424613950565b8560030260038104871461443a5761443a613950565b6000858152602081209283019291909101905b828210156144795780825561446460018301614265565b61447060028301614265565b9083019061444d565b505050505b5060008181526020812083915b858110156144bc576144a66144a08487614227565b836142b3565b602092909201916003919091019060010161448b565b505050505050565b81356144cf816131ee565b60028110614506577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541660ff821681178355505061457d61454360208401613ff1565b82547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178255565b6145c761458c60408401613ffe565b82547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178255565b6146196145d660608401613ff1565b82547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178255565b614626608083018361400b565b6146348183600186016140c3565b505061464360a083018361400b565b6146518183600286016140c3565b505061466060c08301836141bf565b61466e8183600386016143e6565b505061467d60e083018361400b565b6143e08183600486016140c3565b63ffffffff831681526040602082015260006146aa6040830184613ee7565b949350505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261425b57600080fd5b6000606082360312156146f857600080fd5b6147006139eb565b823567ffffffffffffffff8082111561471857600080fd5b9084019036601f83011261472b57600080fd5b8135602061473b613b3883613af3565b82815260059290921b8401810191818101903684111561475a57600080fd5b948201945b838610156147785785358252948201949082019061475f565b865250614786878201613a78565b9085015250604085013591508082111561479f57600080fd5b506147ac36828601613a83565b60408301525092915050565b815167ffffffffffffffff8111156147d2576147d2613996565b6147e6816147e084546138fd565b84614085565b602080601f83116001811461483957600084156148035750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556144bc565b600085815260208120601f198616915b8281101561486857888601518255948401946001909101908401614849565b50858210156148a457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff831681526040602082015260006146aa60408301846135ac565b600080858511156148e757600080fd5b838611156148f457600080fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156149415780818660040360031b1b83161692505b505092915050565b60006020828403121561495b57600080fd5b5035919050565b8183823760009101908152919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149a3576149a3613950565b5060010190565b60208152600061270860208301846132b1565b8681526020810186905273ffffffffffffffffffffffffffffffffffffffff8516604082015263ffffffff848116606083015260c0820190614a026080840186613276565b80841660a084015250979650505050505050565b60008351614a28818460208801613169565b835190830190614a3c818360208801613169565b01949350505050565b6020815260006127086020830184613570565b80516131e9816131cc565b600082601f830112614a7457600080fd5b81516020614a84613b3883613af3565b8083825260208201915060208460051b870101935086841115614aa657600080fd5b602086015b84811015611d8c5780518352918301918301614aab565b60006020808385031215614ad557600080fd5b825167ffffffffffffffff80821115614aed57600080fd5b818501915085601f830112614b0157600080fd5b8151614b0f613b3882613af3565b81815260059190911b83018401908481019088831115614b2e57600080fd5b8585015b83811015614c1157805185811115614b4957600080fd5b8601610100818c03601f1901811315614b6157600080fd5b614b69613a14565b614b748a8401614a58565b8152614b8260408401614a58565b8a820152614b9260608401614a58565b60408201526080830151606082015260a0830151608082015260c083015160a082015260e08084015189811115614bc95760008081fd5b614bd78f8d83880101614a63565b60c084015250918301519188831115614bf05760008081fd5b614bfe8e8c85870101614a63565b9082015285525050918601918601614b32565b5098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"capabilitiesRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainConfigUpdates\",\"inputs\":[{\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeCapabilityConfigSet\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"update\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveDigest\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllChainConfigs\",\"inputs\":[{\"name\":\"pageIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pageSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllConfigs\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"activeConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"candidateConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCandidateDigest\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCapabilityConfiguration\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"configuration\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getCapabilityRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChainConfig\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"versionedConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"ok\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfigDigests\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"activeConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNumChainConfigurations\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"promoteCandidateAndRevokeActive\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"digestToPromote\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestToRevoke\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeCandidate\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCandidate\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"digestToOverwrite\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"newConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ActiveConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CandidateConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CapabilityConfigurationSet\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigRemoved\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigSet\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigPromoted\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainSelectorNotFound\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainSelectorNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"gotConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DONIdMismatch\",\"inputs\":[{\"name\":\"callDonId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"capabilityRegistryDonId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"FChainMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FChainTooHigh\",\"inputs\":[{\"name\":\"fChain\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"FRoleDON\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"FTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Node\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"type\":\"error\",\"name\":\"InvalidPluginType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSelector\",\"inputs\":[{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoOpStateTransitionNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughTransmitters\",\"inputs\":[{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimum\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OfframpAddressCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RMNHomeAddressCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RevokingZeroDigestNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TooManySigners\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x60a03460bf57601f613d6638819003918201601f19168301916001600160401b0383118484101760c45780849260209460405283398101031260bf57516001600160a01b03811680820360bf57331560ae57600180546001600160a01b031916331790556006805463ffffffff1916905515609d57608052604051613c8b90816100db823960805181818161026601528181612f3901526139bd0152f35b6342bcdf7f60e11b60005260046000fd5b639b15e16f60e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610157578063020330e614610152578063181f5a771461014d57806333d9704a146101485780633df45a72146101435780634851d5491461013e5780635a837f97146101395780635f1edd9c146101345780637524051a1461012f57806379ba50971461012a5780637ac0d41e146101255780638318ed5d146101205780638da5cb5b1461011b578063922ea40614610116578063b149092b14610111578063b74b23561461010c578063bae4e0fa14610107578063f2fde38b14610102578063f442c89a146100fd5763fba64a7c146100f857600080fd5b61172d565b611472565b61134e565b6110e5565b61100a565b610f90565b610ee2565b610e90565b610e2f565b610df3565b610d0a565b610c0f565b610bbb565b610934565b6108ae565b6107ce565b61072c565b610415565b61021b565b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361021657807f78bea72100000000000000000000000000000000000000000000000000000000602092149081156101ec575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386101e1565b600080fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176102d557604052565b61028a565b610100810190811067ffffffffffffffff8211176102d557604052565b6040810190811067ffffffffffffffff8211176102d557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d557604052565b60405190610363604083610313565b565b6040519061036361010083610313565b67ffffffffffffffff81116102d557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106103c25750506000910152565b81810151838201526020016103b2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361040e815180928187528780880191016103af565b0116010190565b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165761049260408051906104568183610313565b601282527f43434950486f6d6520312e362e302d64657600000000000000000000000000006020830152519182916020835260208301906103d2565b0390f35b63ffffffff81160361021657565b6064359061036382610496565b6002111561021657565b3590610363826104b1565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6060910112610216576004356104fc81610496565b90602435610509816104b1565b9060443590565b6002111561051a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90600282101561051a5752565b61058a9181518152604061057960208401516060602085015260608401906103d2565b9201519060408184039101526103d2565b90565b9080602083519182815201916020808360051b8301019401926000915b8383106105b957505050505090565b90919293946020806105f5837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528951610556565b970193019301919392906105aa565b90604061058a9263ffffffff81511683526020810151602084015201519060606040820152610637606082018351610549565b602082015167ffffffffffffffff166080820152604082015160ff1660a0820152606082015167ffffffffffffffff1660c082015260e06106f86106c361068e6080860151610100858701526101608601906103d2565b60a08601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0868303016101008701526103d2565b60c08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08583030161012086015261058d565b920151906101407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0828503019101526103d2565b346102165761075a610746610740366104c6565b91611b23565b604051928392604084526040840190610604565b90151560208301520390f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126102165760043561079c81610496565b9060243561058a816104b1565b90916107c061058a93604084526040840190610604565b916020818403910152610604565b34610216576107dc36610766565b906107e56117dc565b906107ee6117dc565b9261083d61083763ffffffff841680600052600560205261081384604060002061183b565b90600052600760205263ffffffff61082f85604060002061183b565b541690611882565b50611a52565b60208101516108a4575b508161087c82610876610837946108716108829763ffffffff166000526005602052604060002090565b61183b565b9261312a565b90611882565b602081015161089c575b50610492604051928392836107a9565b91503861088c565b9250610882610847565b346102165761091f60016108c136610766565b929061087c63ffffffff821694856000526005602052846109056108e983604060002061183b565b88600052600760205263ffffffff61082f85604060002061183b565b50015495600052600560205261087681604060002061183b565b50015460408051928352602083019190915290f35b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043561096f81610496565b6024359061097c826104b1565b604435916064359161098c613150565b831580610bb3575b610b89576109ae6109a5838361312a565b63ffffffff1690565b8460016109d8836109d3876108718863ffffffff166000526005602052604060002090565b611882565b50015403610b2f57506001610a2f610a04846108718563ffffffff166000526005602052604060002090565b61087c610a25866108718763ffffffff166000526007602052604060002090565b5463ffffffff1690565b50018054848103610af9575091610871610a60926000610aa0955563ffffffff166000526007602052604060002090565b6001610a70825463ffffffff1690565b1863ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055565b80610ace575b507ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e600080a2005b7f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8600080a238610aa6565b7f93df584c00000000000000000000000000000000000000000000000000000000600052600452602484905260446000fd5b6000fd5b610b576001916109d3610b2b95610871899663ffffffff166000526005602052604060002090565b5001547f93df584c00000000000000000000000000000000000000000000000000000000600052600452602452604490565b7f7b4d1e4f0000000000000000000000000000000000000000000000000000000060005260046000fd5b508215610994565b346102165760206001610c0463ffffffff8061082f610bd936610766565b9316928360005260058752610bf281604060002061183b565b9360005260078752604060002061183b565b500154604051908152f35b3461021657610c1d366104c6565b91610c26613150565b8215610ce05763ffffffff610c3b838361312a565b169263ffffffff82166000526005602052806001610c61866109d387604060002061183b565b50015403610cb957926109d3600193610871610cb4946000977f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b8980a263ffffffff166000526005602052604060002090565b500155005b6001610b57856109d386610871610b2b9763ffffffff166000526005602052604060002090565b7f0849d8cc0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760005473ffffffffffffffffffffffffffffffffffffffff81163303610dc9577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576020600354604051908152f35b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657610e69600435610496565b6040516020610e788183610313565b600082526104926040519282849384528301906103d2565b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b34610216576020610efb610ef536610766565b90611bed565b604051908152f35b67ffffffffffffffff81160361021657565b6044359061036382610f03565b359061036382610f03565b9190606081019083519160608252825180915260206080830193019060005b818110610f7a5750505060408460ff602061058a9697015116602084015201519060408184039101526103d2565b8251855260209485019490920191600101610f4c565b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165767ffffffffffffffff600435610fd481610f03565b610fdc611c1a565b50166000526002602052610492610ff66040600020611c3a565b604051918291602083526020830190610f2d565b346102165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657611047602435600435611e24565b6040518091602082016020835281518091526040830190602060408260051b8601019301916000905b82821061107f57505050500390f35b919360206110d5827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186526040838a5167ffffffffffffffff815116845201519181858201520190610f2d565b9601920192018594939192611070565b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043561112081610496565b60243561112c816104b1565b60443567ffffffffffffffff8111610216576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc826004019236030112610216576064359261117b613150565b61118d611188368461206f565b613231565b6111978382611bed565b9380850361131c57917f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c69161087c9493610492966112f1575b506112cf8260026112936111f16111ec60065463ffffffff1690565b612158565b946112278663ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006006541617600655565b6112728660405161126b8161123f8960208301612418565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610313565b8b846135b0565b99896108768c9b6108718563ffffffff166000526005602052604060002090565b506001810188905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff861617815501612936565b6112de60405192839283612abe565b0390a26040519081529081906020820190565b7f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b600080a2386111d0565b7f93df584c00000000000000000000000000000000000000000000000000000000600052600485905260245260446000fd5b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043573ffffffffffffffffffffffffffffffffffffffff8116809103610216576113a66136c5565b33811461141757807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b9181601f840112156102165782359167ffffffffffffffff8311610216576020808501948460051b01011161021657565b346102165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043567ffffffffffffffff8111610216576114c1903690600401611441565b60243567ffffffffffffffff8111610216576114e1903690600401611441565b9190926114ec6136c5565b60005b8281106116015750505060005b81811061150557005b611525611520611516838587612b7a565b6020810190612662565b612bba565b90611539611534828587612b7a565b612429565b6115438351613948565b61155a611554602085015160ff1690565b60ff1690565b156115d75782816115ab6001956115a67f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e09567ffffffffffffffff166000526002602052604060002090565b612d9a565b6115be67ffffffffffffffff8216613bed565b506115ce60405192839283612e2d565b0390a1016114fc565b7fa9b3766e0000000000000000000000000000000000000000000000000000000060005260046000fd5b61163c611638611625611618611534858888612adb565b67ffffffffffffffff1690565b6000526004602052604060002054151590565b1590565b6116e657806116766116716116576115346001958888612adb565b67ffffffffffffffff166000526002602052604060002090565b612b33565b61168f61168a611618611534848888612adb565b613b09565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f06116dd6116c2611534848888612adb565b60405167ffffffffffffffff90911681529081906020820190565b0390a1016114ef565b61153490610b2b936116f793612adb565b7f1bd4d2d20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043567ffffffffffffffff81116102165761177c903690600401611441565b505060243567ffffffffffffffff811161021657366023820112156102165780600401359067ffffffffffffffff8211610216573660248383010111610216576117da916117c8610f15565b5060246117d36104a4565b9201612f20565b005b604051906117e9826102b9565b8160008152600060208201526040805191611803836102da565b60008352600060208401526000828401526000606084015260606080840152606060a0840152606060c0840152606060e08401520152565b90600281101561051a57600052602052604060002090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906002811015611896576007020190600090565b611853565b600282101561051a5752565b90600182811c921680156118f0575b60208310146118c157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916118b6565b906040519182600082549261190e846118a7565b808452936001811690811561197a5750600114611933575b5061036392500383610313565b90506000929192526020600020906000915b81831061195e5750509060206103639282010138611926565b6020919350806001915483858901015201910190918492611945565b602093506103639592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611926565b67ffffffffffffffff81116102d55760051b60200190565b9081546119de816119ba565b926119ec6040519485610313565b818452602084019060005260206000206000915b838310611a0d5750505050565b60036020600192604051611a20816102b9565b85548152611a2f8587016118fa565b83820152611a3f600287016118fa565b6040820152815201920192019190611a00565b9060405191611a60836102b9565b60408363ffffffff835416815260018301546020820152611b1a6006835194611a88866102da565b611ae1611ad06002830154611aa060ff82168a61189b565b67ffffffffffffffff600882901c1660208a015260ff604882901c16888a015260501c67ffffffffffffffff1690565b67ffffffffffffffff166060880152565b611aed600382016118fa565b6080870152611afe600482016118fa565b60a0870152611b0f600582016119d2565b60c0870152016118fa565b60e08401520152565b90611b2c6117dc565b9260005b60028110611b42575050505090600090565b63ffffffff8416806000526005602052826001611b67846109d388604060002061183b565b5001541480611ba8575b611b7e5750600101611b30565b611ba2955061083794506109d392506000939193526005602052604060002061183b565b90600190565b50821515611b71565b91611be9918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b611c149061087c60019363ffffffff8316600052600560205261087681604060002061183b565b50015490565b60405190611c27826102b9565b6060604083828152600060208201520152565b90604051611c47816102b9565b809260405180602083549182815201908360005260206000209060005b818110611cab5750505060409282611c83611ca6946002940382610313565b8552611ca0611c96600183015460ff1690565b60ff166020870152565b016118fa565b910152565b8254845260209093019260019283019201611c64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9081600302916003830403611d0157565b611cc1565b81810292918115918404141715611d0157565b60405190611d28602083610313565b600080835282815b828110611d3c57505050565b602090604051611d4b816102f7565b60008152611d57611c1a565b8382015282828501015201611d30565b90611d71826119ba565b611d7e6040519182610313565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611dac82946119ba565b019060005b828110611dbd57505050565b602090604051611dcc816102f7565b60008152611dd8611c1a565b8382015282828501015201611db1565b9060018201809211611d0157565b91908201809211611d0157565b91908203918211611d0157565b80518210156118965760209160051b010190565b611e318260035492611d06565b9180158015611f03575b611ef857611e499083611df6565b90808211611ef0575b50611e65611e608383611e03565b611d67565b91805b828110611e755750505090565b80611ee9611e87611618600194613a41565b611ec8611ea88267ffffffffffffffff166000526002602052604060002090565b611ec3611eb3610354565b67ffffffffffffffff9094168452565b611c3a565b6020820152611ed78584611e03565b90611ee28289611e10565b5286611e10565b5001611e68565b905038611e52565b50505061058a611d19565b5081831015611e3b565b60ff81160361021657565b359061036382611f0d565b81601f8201121561021657803590611f3a82610375565b92611f486040519485610313565b8284526020838301011161021657816000926020809301838601378301015290565b9080601f8301121561021657813591611f82836119ba565b92611f906040519485610313565b80845260208085019160051b830101918383116102165760208101915b838310611fbc57505050505090565b823567ffffffffffffffff81116102165782019060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126102165760405190612009826102b9565b60208301358252604083013567ffffffffffffffff81116102165787602061203392860101611f23565b602083015260608301359167ffffffffffffffff83116102165761205f88602080969581960101611f23565b6040820152815201920191611fad565b9190916101008184031261021657612085610365565b9261208f826104bb565b845261209d60208301610f22565b60208501526120ae60408301611f18565b60408501526120bf60608301610f22565b6060850152608082013567ffffffffffffffff811161021657816120e4918401611f23565b608085015260a082013567ffffffffffffffff81116102165781612109918401611f23565b60a085015260c082013567ffffffffffffffff8111610216578161212e918401611f6a565b60c085015260e082013567ffffffffffffffff8111610216576121519201611f23565b60e0830152565b63ffffffff1663ffffffff8114611d015760010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561021657016020813591019167ffffffffffffffff821161021657813603831361021657565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561021657016020813591019167ffffffffffffffff8211610216578160051b3603831361021657565b90602083828152019060208160051b85010193836000915b8383106122795750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301865286357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1843603018112156102165760206123206001938683940190813581526123126123076122f78685018561216f565b60608886015260608501916121bf565b92604081019061216f565b9160408185039101526121bf565b980196019493019190612269565b61058a916123448161233f846104bb565b610549565b61236461235360208401610f22565b67ffffffffffffffff166020830152565b61237d61237360408401611f18565b60ff166040830152565b61239d61238c60608401610f22565b67ffffffffffffffff166060830152565b61240a6123ff6123e46123c96123b6608087018761216f565b61010060808801526101008701916121bf565b6123d660a087018761216f565b9086830360a08801526121bf565b6123f160c08601866121fe565b9085830360c0870152612251565b9260e081019061216f565b9160e08185039101526121bf565b90602061058a92818152019061232e565b3561058a81610f03565b3561058a81611f0d565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610216570180359067ffffffffffffffff82116102165760200191813603831361021657565b818110612499575050565b6000815560010161248e565b9190601f81116124b457505050565b610363926000526020600020906020601f840160051c830193106124e0575b601f0160051c019061248e565b90915081906124d3565b90929167ffffffffffffffff81116102d5576125108161250a84546118a7565b846124a5565b6000601f821160011461256a578190611be993949560009261255f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b01359050388061252d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169461259d84600052602060002090565b91805b8781106125f65750836001959697106125be575b505050811b019055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690553880806125b4565b909260206001819286860135815501940191016125a0565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610216570180359067ffffffffffffffff821161021657602001918160051b3603831361021657565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610216570190565b61269f81546118a7565b90816126a9575050565b81601f600093116001146126bb575055565b818352602083206126d791601f0160051c81019060010161248e565b808252602082209081548360011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8560031b1c191617905555565b90803582556001820161272a602083018361243d565b9067ffffffffffffffff82116102d55761274e8261274885546118a7565b856124a5565b600090601f83116001146127bd57926127a7836127b49460029794610363999760009261255f5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b604081019061243d565b929091016124ea565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316916127f085600052602060002090565b92815b81811061285957509360029693610363989693600193836127b49810612821575b505050811b0190556127aa565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080612814565b919360206001819287870135815501950192016127f3565b6801000000000000000083116102d55780548382558084106128d9575b50906128a08192600052602060002090565b906000925b8484106128b3575050505050565b60036020826128cd6128c760019587612662565b87612714565b019301930192916128a5565b80600302906003820403611d015783600302600381048503611d015782600052602060002091820191015b818110612911575061288e565b6003906000815561292460018201612695565b61293060028201612695565b01612904565b90803591612943836104b1565b600283101561051a576127b46004926103639460ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0085541691161783556129ca61299060208301612429565b84547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178455565b612a146129d960408301612433565b84547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178455565b612a66612a2360608301612429565b84547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178455565b612a80612a76608083018361243d565b90600186016124ea565b612a9a612a9060a083018361243d565b90600286016124ea565b612ab4612aaa60c083018361260e565b9060038601612871565b60e081019061243d565b60409063ffffffff61058a9493168152816020820152019061232e565b91908110156118965760051b0190565b906801000000000000000081116102d557815491818155828210612b0e57505050565b600052602060002091820191015b818110612b27575050565b60008155600101612b1c565b80546000825580612b53575b506002816000600161036394015501612695565b816000526020600020908101905b818110612b6e5750612b3f565b60008155600101612b61565b91908110156118965760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610216570190565b6060813603126102165760405190612bd1826102b9565b803567ffffffffffffffff811161021657810136601f8201121561021657803590612bfb826119ba565b91612c096040519384610313565b80835260208084019160051b8301019136831161021657602001905b828210612c6b575050508252612c3d60208201611f18565b602083015260408101359067ffffffffffffffff821161021657612c6391369101611f23565b604082015290565b8135815260209182019101612c25565b919091825167ffffffffffffffff81116102d557612c9d8161250a84546118a7565b6020601f8211600114612cf6578190611be9939495600092612ceb5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b01519050388061252d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0821690612d2984600052602060002090565b9160005b818110612d8257509583600195969710612d4b57505050811b019055565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806125b4565b9192602060018192868b015181550194019201612d2d565b90805180519067ffffffffffffffff82116102d557602090612dbc8386612aeb565b0183600052602060002060005b838110612e1957505050509060026040610363936001840160ff6020830151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905501519101612c7b565b600190602084519401938184015501612dc9565b60409067ffffffffffffffff61058a94931681528160208201520190610f2d565b906004116102165790600490565b906024116102165760040190602090565b919091357fffffffff0000000000000000000000000000000000000000000000000000000081169260048110612ea1575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b90816020910312610216573590565b908092918237016000815290565b3d15612f1b573d90612f0182610375565b91612f0f6040519384610313565b82523d6000602084013e565b606090565b909173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361310057612f72612f6c8484612e4e565b90612e6d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa0000000000000000000000000000000000000000000000000000000081141590816130d5575b816130aa575b5061305b5750612fe1612fd98484612e5c565b810190612ed3565b63ffffffff82168103613022575050600091829161300460405180938193612ee2565b039082305af1613012612ef0565b901561301b5750565b60203d9101fd5b7f8a6e4ce80000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7f12ba286f000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7f5a837f97000000000000000000000000000000000000000000000000000000009150141538612fc6565b7f7524051a000000000000000000000000000000000000000000000000000000008114159150612fc0565b7fac7a7efd0000000000000000000000000000000000000000000000000000000060005260046000fd5b61314a60019263ffffffff8093166000526007602052604060002061183b565b54161890565b30330361315957565b7f371a73280000000000000000000000000000000000000000000000000000000060005260046000fd5b6040516020810190600082526020815261319e604082610313565b51902090565b906131ae826119ba565b6131bb6040519182610313565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06131e982946119ba565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d015760010190565b90602061058a928181520190610556565b6020810167ffffffffffffffff613250825167ffffffffffffffff1690565b161561358657815161326181610510565b61326a81610510565b151580613568575b61353e57608082015180518015918215613528575b50506134fe5760a0820151805180159182156134e8575b50506134be576132bf611638611625611618845167ffffffffffffffff1690565b6134aa576132f961155460016132f16116576132e2611554604089015160ff1690565b955167ffffffffffffffff1690565b015460ff1690565b918183116134765760c0019182515191610100831161344c5761331b90611cf0565b8211156134225760009161332e816131a4565b9360005b8281106133905750505061334861334d91611cf0565b611de8565b9081811061336057505061036390613948565b7f548dd21f0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b61339b818351611e10565b51604081015151613412575b602081015151158015613409575b6133cf5790600191516133c88289611e10565b5201613332565b613405906040519182917f9fa4031400000000000000000000000000000000000000000000000000000000835260048301613220565b0390fd5b508051156133b5565b9461341c906131f3565b946133a7565b7f4856694e0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f1b925da60000000000000000000000000000000000000000000000000000000060005260046000fd5b507f2db220400000000000000000000000000000000000000000000000000000000060005260049190915260245260446000fd5b51610b2b9067ffffffffffffffff166116f7565b7fdee985740000000000000000000000000000000000000000000000000000000060005260046000fd5b6020012090506134f6613183565b14388061329e565b7f358c19270000000000000000000000000000000000000000000000000000000060005260046000fd5b602001209050613536613183565b143880613287565b7f3302dbd70000000000000000000000000000000000000000000000000000000060005260046000fd5b506001825161357681610510565b61357f81610510565b1415613272565b7f698cf8e00000000000000000000000000000000000000000000000000000000060005260046000fd5b90613677929361360663ffffffff9283604051957f45564d0000000000000000000000000000000000000000000000000000000000602088015246604088015230606088015216608086015260a0850190610549565b1660c082015260c0815261361b60e082610313565b6020604051938261363586945180928580880191016103af565b8301613649825180938580850191016103af565b0101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610313565b602081519101207fffff00000000000000000000000000000000000000000000000000000000000019167e0a0000000000000000000000000000000000000000000000000000000000001790565b73ffffffffffffffffffffffffffffffffffffffff6001541633036136e657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b519061036382610496565b9080601f83011215610216578151613732816119ba565b926137406040519485610313565b81845260208085019260051b82010192831161021657602001905b8282106137685750505090565b815181526020918201910161375b565b9080601f8301121561021657815161378f816119ba565b9261379d6040519485610313565b81845260208085019260051b82010192831161021657602001905b8282106137c55750505090565b81518152602091820191016137b8565b6020818303126102165780519067ffffffffffffffff821161021657019080601f830112156102165781519161380a836119ba565b926138186040519485610313565b80845260208085019160051b830101918383116102165760208101915b83831061384457505050505090565b825167ffffffffffffffff8111610216578201906101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126102165761388d610365565b9061389a60208401613710565b82526138a860408401613710565b60208301526138b960608401613710565b60408301526080830151606083015260a0830151608083015260c083015160a083015260e083015167ffffffffffffffff8111610216578760206138ff9286010161371b565b60c08301526101008301519167ffffffffffffffff83116102165761392c88602080969581960101613778565b60e0820152815201920191613835565b6040513d6000823e3d90fd5b80516139515750565b60405180917f05a519660000000000000000000000000000000000000000000000000000000082526024820160206004840152815180915260206044840192019060005b818110613a10575050509080600092038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015613a0b576139ec5750565b613a08903d806000833e613a008183610313565b8101906137d5565b50565b61393c565b8251845285945060209384019390920191600101613995565b80548210156118965760005260206000200190600090565b6003548110156118965760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b015490565b80548015613ada577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613aab8282613a29565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081815260046020526040902054908115613be6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211611d0157600354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401938411611d01578383600095613ba59503613bab575b505050613b946003613a76565b600490600052602052604060002090565b55600190565b613b94613bd791613bcd613bc3613bdd956003613a29565b90549060031b1c90565b9283916003613a29565b90611bb1565b55388080613b87565b5050600090565b600081815260046020526040902054613c7857600354680100000000000000008110156102d557613c5f613c2a8260018594016003556003613a29565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600354906000526004602052604060002055600190565b5060009056fea164736f6c634300081a000a",
}
var CCIPHomeABI = CCIPHomeMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go b/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go
index 7397594d78d..c711c654ca5 100644
--- a/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go
+++ b/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go
@@ -100,8 +100,8 @@ type OffRampSourceChainConfig struct {
}
var CCIPReaderTesterMetaData = &bind.MetaData{
- ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPMessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"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[]\"}],\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"inputs\":[{\"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\"},{\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"emitCCIPMessageSent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNRemote.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"emitCommitReportAccepted\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"emitExecutionStateChanged\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"getInboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"setDestChainSeqNr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"testNonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"setInboundNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"seqNr\",\"type\":\"uint64\"}],\"name\":\"setLatestPriceSequenceNumber\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceChainConfig\",\"type\":\"tuple\"}],\"name\":\"setSourceChainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b50611960806100206000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063bfc9b78911610081578063c92236251161005b578063c9223625146101f9578063e83eabba1461020c578063e9d68a8e1461021f57600080fd5b8063bfc9b7891461017e578063c1a5a35514610191578063c7c1cba1146101e657600080fd5b806369600bca116100b257806369600bca1461010f5780639041be3d1461015857806393df28671461016b57600080fd5b80633f4b04aa146100ce5780634bf78697146100fa575b600080fd5b60035467ffffffffffffffff165b60405167ffffffffffffffff90911681526020015b60405180910390f35b61010d610108366004610a4e565b61023f565b005b61010d61011d366004610b89565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6100dc610166366004610b89565b610298565b61010d610179366004610bf4565b6102c8565b61010d61018c366004610ea2565b610343565b61010d61019f36600461102d565b67ffffffffffffffff918216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001691909216179055565b61010d6101f4366004611060565b610385565b6100dc6102073660046110f2565b6103e2565b61010d61021a366004611145565b61042e565b61023261022d366004610b89565b610518565b6040516100f19190611265565b80600001516060015167ffffffffffffffff168267ffffffffffffffff167f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f328360405161028c91906113ab565b60405180910390a35050565b67ffffffffffffffff808216600090815260016020819052604082205491926102c2921690611503565b92915050565b67ffffffffffffffff84166000908152600260205260409081902090518491906102f59085908590611552565b908152604051908190036020019020805467ffffffffffffffff929092167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905550505050565b602081015181516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e49261037a929091611656565b60405180910390a150565b848667ffffffffffffffff168867ffffffffffffffff167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b878787876040516103d1949392919061172e565b60405180910390a450505050505050565b67ffffffffffffffff8316600090815260026020526040808220905161040b9085908590611552565b9081526040519081900360200190205467ffffffffffffffff1690509392505050565b67ffffffffffffffff808316600090815260208181526040918290208451815492860151938601519094167501000000000000000000000000000000000000000000027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff93151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090931673ffffffffffffffffffffffffffffffffffffffff909516949094179190911791909116919091178155606082015182919060018201906105119082611839565b5050505050565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff87811684528383529286902086519485018752805473ffffffffffffffffffffffffffffffffffffffff8116865274010000000000000000000000000000000000000000810460ff1615159386019390935275010000000000000000000000000000000000000000009092049092169483019490945260018401805493949293918401916105d490611795565b80601f016020809104026020016040519081016040528092919081815260200182805461060090611795565b801561064d5780601f106106225761010080835404028352916020019161064d565b820191906000526020600020905b81548152906001019060200180831161063057829003601f168201915b5050505050815250509050919050565b803567ffffffffffffffff8116811461067557600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156106cc576106cc61067a565b60405290565b604051610120810167ffffffffffffffff811182821017156106cc576106cc61067a565b6040805190810167ffffffffffffffff811182821017156106cc576106cc61067a565b6040516060810167ffffffffffffffff811182821017156106cc576106cc61067a565b6040516080810167ffffffffffffffff811182821017156106cc576106cc61067a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107a6576107a661067a565b604052919050565b600060a082840312156107c057600080fd5b6107c86106a9565b9050813581526107da6020830161065d565b60208201526107eb6040830161065d565b60408201526107fc6060830161065d565b606082015261080d6080830161065d565b608082015292915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461083a57600080fd5b50565b803561067581610818565b600082601f83011261085957600080fd5b813567ffffffffffffffff8111156108735761087361067a565b6108a460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161075f565b8181528460208386010111156108b957600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff8211156108f0576108f061067a565b5060051b60200190565b600082601f83011261090b57600080fd5b8135602061092061091b836108d6565b61075f565b82815260059290921b8401810191818101908684111561093f57600080fd5b8286015b84811015610a4357803567ffffffffffffffff808211156109645760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d0301121561099d5760008081fd5b6109a56106a9565b6109b088850161083d565b8152604080850135848111156109c65760008081fd5b6109d48e8b83890101610848565b8a84015250606080860135858111156109ed5760008081fd5b6109fb8f8c838a0101610848565b83850152506080915081860135818401525082850135925083831115610a215760008081fd5b610a2f8d8a85880101610848565b908201528652505050918301918301610943565b509695505050505050565b60008060408385031215610a6157600080fd5b610a6a8361065d565b9150602083013567ffffffffffffffff80821115610a8757600080fd5b908401906101a08287031215610a9c57600080fd5b610aa46106d2565b610aae87846107ae565b8152610abc60a0840161083d565b602082015260c083013582811115610ad357600080fd5b610adf88828601610848565b60408301525060e083013582811115610af757600080fd5b610b0388828601610848565b6060830152506101008084013583811115610b1d57600080fd5b610b2989828701610848565b608084015250610b3c610120850161083d565b60a083015261014084013560c083015261016084013560e083015261018084013583811115610b6a57600080fd5b610b76898287016108fa565b8284015250508093505050509250929050565b600060208284031215610b9b57600080fd5b610ba48261065d565b9392505050565b60008083601f840112610bbd57600080fd5b50813567ffffffffffffffff811115610bd557600080fd5b602083019150836020828501011115610bed57600080fd5b9250929050565b60008060008060608587031215610c0a57600080fd5b610c138561065d565b9350610c216020860161065d565b9250604085013567ffffffffffffffff811115610c3d57600080fd5b610c4987828801610bab565b95989497509550505050565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461067557600080fd5b600082601f830112610c9257600080fd5b81356020610ca261091b836108d6565b82815260069290921b84018101918181019086841115610cc157600080fd5b8286015b84811015610a435760408189031215610cde5760008081fd5b610ce66106f6565b610cef8261065d565b8152610cfc858301610c55565b81860152835291830191604001610cc5565b600082601f830112610d1f57600080fd5b81356020610d2f61091b836108d6565b82815260059290921b84018101918181019086841115610d4e57600080fd5b8286015b84811015610a4357803567ffffffffffffffff80821115610d735760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610dac5760008081fd5b610db46106a9565b610dbf88850161065d565b815260408085013584811115610dd55760008081fd5b610de38e8b83890101610848565b8a8401525060609350610df784860161065d565b908201526080610e0885820161065d565b93820193909352920135908201528352918301918301610d52565b600082601f830112610e3457600080fd5b81356020610e4461091b836108d6565b82815260069290921b84018101918181019086841115610e6357600080fd5b8286015b84811015610a435760408189031215610e805760008081fd5b610e886106f6565b813581528482013585820152835291830191604001610e67565b60006020808385031215610eb557600080fd5b823567ffffffffffffffff80821115610ecd57600080fd5b9084019060608287031215610ee157600080fd5b610ee9610719565b823582811115610ef857600080fd5b83016040818903811315610f0b57600080fd5b610f136106f6565b823585811115610f2257600080fd5b8301601f81018b13610f3357600080fd5b8035610f4161091b826108d6565b81815260069190911b8201890190898101908d831115610f6057600080fd5b928a01925b82841015610fb05785848f031215610f7d5760008081fd5b610f856106f6565b8435610f9081610818565b8152610f9d858d01610c55565b818d0152825292850192908a0190610f65565b845250505082870135915084821115610fc857600080fd5b610fd48a838501610c81565b81880152835250508284013582811115610fed57600080fd5b610ff988828601610d0e565b8583015250604083013593508184111561101257600080fd5b61101e87858501610e23565b60408201529695505050505050565b6000806040838503121561104057600080fd5b6110498361065d565b91506110576020840161065d565b90509250929050565b600080600080600080600060e0888a03121561107b57600080fd5b6110848861065d565b96506110926020890161065d565b955060408801359450606088013593506080880135600481106110b457600080fd5b925060a088013567ffffffffffffffff8111156110d057600080fd5b6110dc8a828b01610848565b92505060c0880135905092959891949750929550565b60008060006040848603121561110757600080fd5b6111108461065d565b9250602084013567ffffffffffffffff81111561112c57600080fd5b61113886828701610bab565b9497909650939450505050565b6000806040838503121561115857600080fd5b6111618361065d565b9150602083013567ffffffffffffffff8082111561117e57600080fd5b908401906080828703121561119257600080fd5b61119a61073c565b82356111a581610818565b8152602083013580151581146111ba57600080fd5b60208201526111cb6040840161065d565b60408201526060830135828111156111e257600080fd5b6111ee88828601610848565b6060830152508093505050509250929050565b6000815180845260005b818110156112275760208185018101518683018201520161120b565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015260208201511515604082015267ffffffffffffffff6040830151166060820152600060608301516080808401526112c060a0840182611201565b949350505050565b600082825180855260208086019550808260051b84010181860160005b8481101561139e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff825116855285820151818787015261134782870182611201565b915050604080830151868303828801526113618382611201565b9250505060608083015181870152506080808301519250858203818701525061138a8183611201565b9a86019a94505050908301906001016112e5565b5090979650505050505050565b602081526113fc60208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161142560c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e08501526114426101c0850183611201565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101008187860301818801526114808584611201565b945060808801519250818786030161012088015261149e8584611201565b945060a088015192506114ca61014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e08801516101808801528701518685039091018387015290506114f983826112c8565b9695505050505050565b67ffffffffffffffff81811683821601908082111561154b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b8183823760009101908152919050565b805160408084528151848201819052600092602091908201906060870190855b818110156115db578351805173ffffffffffffffffffffffffffffffffffffffff1684528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16858401529284019291850191600101611582565b50508583015187820388850152805180835290840192506000918401905b8083101561164a578351805167ffffffffffffffff1683528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16858301529284019260019290920191908501906115f9565b50979650505050505050565b60006040808301604084528086518083526060925060608601915060608160051b8701016020808a0160005b8481101561170e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018652815160a067ffffffffffffffff8083511687528583015182878901526116d983890182611201565b848d01518316898e01528b8501519092168b890152506080928301519290960191909152509482019490820190600101611682565b5050878203908801526117218189611562565b9998505050505050505050565b84815260006004851061176a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b846020830152608060408301526117846080830185611201565b905082606083015295945050505050565b600181811c908216806117a957607f821691505b6020821081036117e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115611834576000816000526020600020601f850160051c810160208610156118115750805b601f850160051c820191505b818110156118305782815560010161181d565b5050505b505050565b815167ffffffffffffffff8111156118535761185361067a565b611867816118618454611795565b846117e8565b602080601f8311600181146118ba57600084156118845750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611830565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611907578886015182559484019460019091019084016118e8565b508582101561194357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"function\",\"name\":\"emitCCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"emitCommitReportAccepted\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"emitExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getExpectedNextSequenceNumber\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDestChainSeqNr\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"testNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setLatestPriceSequenceNumber\",\"inputs\":[{\"name\":\"seqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sourceChainConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+ Bin: "0x608080604052346015576117e2908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081633f4b04aa14611503575080634bf7869714610f7457806369600bca14610f055780639041be3d14610e5657806393df286714610d97578063bfc9b789146107b9578063c1a5a3551461072b578063c7c1cba11461065b578063c9223625146105ca578063e83eabba1461029c5763e9d68a8e1461009857600080fd5b346102975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975767ffffffffffffffff6100d8611546565b6060806040516100e7816115c1565b60008152600060208201526000604082015201521660005260006020526040600020604051610115816115c1565b815473ffffffffffffffffffffffffffffffffffffffff811682526001602083019360ff8360a01c161515855267ffffffffffffffff604085019360a81c16835201926040519360009080549061016b82611782565b808852916001811690811561024057506001146101f0575b73ffffffffffffffffffffffffffffffffffffffff866101ec8967ffffffffffffffff89896101b4848b03856115dd565b6060860193845260405196879660208852511660208701525115156040860152511660608401525160808084015260a0830190611723565b0390f35b6000908152602081209092505b81831061022657505084016020018273ffffffffffffffffffffffffffffffffffffffff610183565b6001816020929493945483858b01015201910191906101fd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166020808a019190915292151560051b8801909201925084915073ffffffffffffffffffffffffffffffffffffffff9050610183565b600080fd5b346102975760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610297576102d3611546565b60243567ffffffffffffffff81116102975760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126102975760405161031d816115c1565b816004013573ffffffffffffffffffffffffffffffffffffffff8116810361029757815260248201358015158103610297576020820190815261036260448401611574565b6040830190815260648401359367ffffffffffffffff85116102975761039967ffffffffffffffff9160046001973692010161163f565b956060850196875216600052600060205273ffffffffffffffffffffffffffffffffffffffff60406000209351167fffffff00000000000000000000000000000000000000000000000000000000007cffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000086549551151560a01b16935160a81b169316171717815501905190815167ffffffffffffffff811161059b576104528254611782565b601f8111610553575b50602092601f82116001146104b757928192936000926104ac575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b015190508380610476565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169383600052806000209160005b86811061053b5750836001959610610504575b505050811b019055005b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558380806104fa565b919260206001819286850151815501940192016104e7565b826000526020600020601f830160051c81019160208410610591575b601f0160051c01905b818110610585575061045b565b60008155600101610578565b909150819061056f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102975760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610601611546565b60243567ffffffffffffffff81116102975767ffffffffffffffff6020809361062f839436906004016116cc565b939091166000526002825260406000208360405194859384378201908152030190205416604051908152f35b346102975760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610692611546565b61069a61155d565b9060843560048110156102975760a43567ffffffffffffffff81116102975761070a6106eb7f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b92369060040161163f565b6040519360643585526020850152608060408501526080840190611723565b9160c43560608201528067ffffffffffffffff8060443597169516930390a4005b346102975760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610762611546565b67ffffffffffffffff61077361155d565b9116600052600160205267ffffffffffffffff604060002091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600080f35b346102975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975760043567ffffffffffffffff81116102975760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261029757604051906060820182811067ffffffffffffffff82111761059b57604052806004013567ffffffffffffffff811161029757810160407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126102975760405190610893826115a5565b600481013567ffffffffffffffff81116102975760049082010136601f820112156102975780356108c3816116b4565b916108d160405193846115dd565b81835260208084019260061b8201019036821161029757602001915b818310610d58575050508252602481013567ffffffffffffffff811161029757600491010136601f82011215610297578035610928816116b4565b9161093660405193846115dd565b81835260208084019260061b8201019036821161029757602001915b818310610d195750505060208201528252602481013567ffffffffffffffff81116102975781019036602383011215610297576004820135610993816116b4565b926109a160405194856115dd565b818452602060048186019360051b83010101903682116102975760248101925b828410610c5857505050506020830191825260448101359067ffffffffffffffff8211610297570136602382011215610297576004810135610a02816116b4565b91610a1060405193846115dd565b818352602060048185019360061b830101019036821161029757602401915b818310610c2757505050604083015251905160405190604082016040835283518091526060830190602060608260051b8601019501916000905b828210610b8f57505050508183036020830152604083019080519160408552825180915260206060860193019060005b818110610b3957505050602001519260208183039101526020808451928381520193019060005b818110610aef577f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e484860385a1005b8251805167ffffffffffffffff1686526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168187015260409095019490920191600101610ac0565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168187015260409095019490920191600101610a99565b90919295602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0896001950301855289519067ffffffffffffffff8251168152608080610beb8585015160a08786015260a0850190611723565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff60608201511660608501520151910152980192019201909291610a69565b6040833603126102975760206040918251610c41816115a5565b853581528286013583820152815201920191610a2f565b833567ffffffffffffffff81116102975760049083010160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082360301126102975760405191610ca883611589565b610cb460208301611574565b835260408201359267ffffffffffffffff84116102975760a060209493610ce1869586369184010161163f565b85840152610cf160608201611574565b6040840152610d0260808201611574565b6060840152013560808201528152019301926109c1565b6040833603126102975760206040918251610d33816115a5565b610d3c86611574565b8152610d498387016116fa565b83820152815201920191610952565b6040833603126102975760206040918251610d72816115a5565b610d7b8661161e565b8152610d888387016116fa565b838201528152019201916108ed565b346102975760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610dce611546565b610dd661155d565b906044359067ffffffffffffffff821161029757602067ffffffffffffffff9291610e06849336906004016116cc565b9390911660005260028252604060002083604051948593843782019081520301902091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600080f35b346102975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975767ffffffffffffffff610e96611546565b166000526001602052600167ffffffffffffffff604060002054160167ffffffffffffffff8111610ed65760209067ffffffffffffffff60405191168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b346102975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975767ffffffffffffffff610f45611546565b167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355600080f35b346102975760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610fab611546565b60243567ffffffffffffffff8111610297577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc813603016101a08112610297576040519061012082019082821067ffffffffffffffff83111761059b5760a091604052126102975760405161101f81611589565b8260040135815261103260248401611574565b602082015261104360448401611574565b604082015261105460648401611574565b606082015261106560848401611574565b6080820152815261107860a4830161161e565b926020820193845260c483013567ffffffffffffffff8111610297576110a4906004369186010161163f565b6040830190815260e484013567ffffffffffffffff8111610297576110cf906004369187010161163f565b936060840194855261010481013567ffffffffffffffff8111610297576110fc906004369184010161163f565b9460808501958652611111610124830161161e565b9560a0860196875260c0860191610144840135835260e087019361016481013585526101848101359067ffffffffffffffff821161029757019436602387011215610297576004860135611164816116b4565b9661117260405198896115dd565b81885260206004818a019360051b83010101903682116102975760248101925b8284106114115750505050610100880195865287516060015167ffffffffffffffff16996040519860208a5251805160208b0152602081015167ffffffffffffffff1660408b0152604081015167ffffffffffffffff1660608b0152606081015167ffffffffffffffff1660808b01526080015167ffffffffffffffff1660a08a01525173ffffffffffffffffffffffffffffffffffffffff1660c08901525160e088016101a090526101c0880161124991611723565b9051908781037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161010089015261128091611723565b9051908681037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016101208801526112b791611723565b955173ffffffffffffffffffffffffffffffffffffffff16610140860152516101608501525161018084015251928281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016101a0840152835180825260208201918160051b810160200195602001926000915b838310611367578867ffffffffffffffff87167f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32898b038aa3005b9091929396602080611402837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528b519073ffffffffffffffffffffffffffffffffffffffff825116815260806113e76113d58685015160a08886015260a0850190611723565b60408501518482036040860152611723565b92606081015160608401520151906080818403910152611723565b9901930193019193929061132c565b833567ffffffffffffffff81116102975760049083010160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08236030112610297576040519161146183611589565b61146d6020830161161e565b8352604082013567ffffffffffffffff811161029757611493906020369185010161163f565b6020840152606082013567ffffffffffffffff8111610297576114bc906020369185010161163f565b60408401526080820135606084015260a08201359267ffffffffffffffff8411610297576114f3602094938580953692010161163f565b6080820152815201930192611192565b346102975760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975760209067ffffffffffffffff600354168152f35b6004359067ffffffffffffffff8216820361029757565b6024359067ffffffffffffffff8216820361029757565b359067ffffffffffffffff8216820361029757565b60a0810190811067ffffffffffffffff82111761059b57604052565b6040810190811067ffffffffffffffff82111761059b57604052565b6080810190811067ffffffffffffffff82111761059b57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059b57604052565b359073ffffffffffffffffffffffffffffffffffffffff8216820361029757565b81601f820112156102975780359067ffffffffffffffff821161059b576040519261169260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601856115dd565b8284526020838301011161029757816000926020809301838601378301015290565b67ffffffffffffffff811161059b5760051b60200190565b9181601f840112156102975782359167ffffffffffffffff8311610297576020838186019501011161029757565b35907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361029757565b919082519283825260005b84811061176d5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161172e565b90600182811c921680156117cb575b602083101461179c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161179156fea164736f6c634300081a000a",
}
var CCIPReaderTesterABI = CCIPReaderTesterMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/ether_sender_receiver/ether_sender_receiver.go b/core/gethwrappers/ccip/generated/ether_sender_receiver/ether_sender_receiver.go
index 505e42e98ec..f3d6ac3a928 100644
--- a/core/gethwrappers/ccip/generated/ether_sender_receiver/ether_sender_receiver.go
+++ b/core/gethwrappers/ccip/generated/ether_sender_receiver/ether_sender_receiver.go
@@ -50,8 +50,8 @@ type ClientEVMTokenAmount struct {
}
var EtherSenderReceiverMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"gotToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"expectedToken\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gotAmounts\",\"type\":\"uint256\"}],\"name\":\"InvalidTokenAmounts\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gotAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"msgValue\",\"type\":\"uint256\"}],\"name\":\"TokenAmountNotEqualToMsgValue\",\"type\":\"error\"},{\"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\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"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\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"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\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_weth\",\"outputs\":[{\"internalType\":\"contractIWrappedNative\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
- Bin: "0x60c06040523480156200001157600080fd5b5060405162001a9838038062001a98833981016040819052620000349162000169565b806001600160a01b03811662000064576040516335fdcccd60e21b81526000600482015260240160405180910390fd5b806001600160a01b03166080816001600160a01b03168152505050806001600160a01b031663e861e9076040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e4919062000169565b6001600160a01b0390811660a081905260405163095ea7b360e01b8152918316600483015260001960248301529063095ea7b3906044016020604051808303816000875af11580156200013b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016191906200019b565b5050620001bf565b6000602082840312156200017c57600080fd5b81516001600160a01b03811681146200019457600080fd5b9392505050565b600060208284031215620001ae57600080fd5b815180151581146200019457600080fd5b60805160a051611851620002476000396000818161014b015281816104030152818161059401528181610905015281816109cc01528181610a6401528181610b0201528181610bf70152610cbf0152600081816101d6015281816102df01528181610377015281816104ab0152818161060b015281816106ff01526107bf01526118516000f3fe6080604052600436106100745760003560e01c80634dbe7e921161004e5780634dbe7e921461013957806385572ffb1461019257806396f4e9f9146101b4578063b0f479a1146101c757600080fd5b806301ffc9a714610080578063181f5a77146100b557806320487ded1461010b57600080fd5b3661007b57005b600080fd5b34801561008c57600080fd5b506100a061009b3660046110e3565b6101fa565b60405190151581526020015b60405180910390f35b3480156100c157600080fd5b506100fe6040518060400160405280601981526020017f457468657253656e646572526563656976657220312e352e300000000000000081525081565b6040516100ac919061119a565b34801561011757600080fd5b5061012b6101263660046111e2565b610293565b6040519081526020016100ac565b34801561014557600080fd5b5061016d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ac565b34801561019e57600080fd5b506101b26101ad366004611230565b61035f565b005b61012b6101c23660046111e2565b6103e9565b3480156101d357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061016d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb00000000000000000000000000000000000000000000000000000000148061028d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60008061029f83610844565b6040517f20487ded00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906320487ded906103169087908590600401611265565b602060405180830381865afa158015610333573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610357919061137a565b949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103d5576040517fd7f733340000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6103e66103e1826115c5565b610966565b50565b60006103f482610d38565b60006103ff83610844565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040015160008151811061045457610454611672565b6020026020010151602001516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561048b57600080fd5b505af115801561049f573d6000803e3d6000fd5b505050505060006104cd7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff166320487ded86846040518363ffffffff1660e01b8152600401610507929190611265565b602060405180830381865afa158015610524573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610548919061137a565b606083015190915073ffffffffffffffffffffffffffffffffffffffff16156107825760608201516105929073ffffffffffffffffffffffffffffffffffffffff16333084610df0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16826060015173ffffffffffffffffffffffffffffffffffffffff16146106c257606082015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000006040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561069c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c091906116a1565b505b6040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906396f4e9f9906107369088908690600401611265565b6020604051808303816000875af1158015610755573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610779919061137a565b9250505061028d565b6040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906396f4e9f99047906107f89089908790600401611265565b60206040518083038185885af1158015610816573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061083b919061137a565b95945050505050565b61088c6040518060a00160405280606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6000610897836116c3565b90508060400151516001146108e1578060400151516040517f83b9f0ae0000000000000000000000000000000000000000000000000000000081526004016103cc91815260200190565b604080513360208201520160405160208183030381529060405281602001819052507f0000000000000000000000000000000000000000000000000000000000000000816040015160008151811061093b5761093b611672565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff909116905292915050565b60008160600151806020019051810190610980919061177f565b90508160800151516001146109ca578160800151516040517f83b9f0ae0000000000000000000000000000000000000000000000000000000081526004016103cc91815260200190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168260800151600081518110610a1857610a18611672565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614610ad9578160800151600081518110610a5657610a56611672565b6020026020010151600001517f00000000000000000000000000000000000000000000000000000000000000006040517f0fc746a10000000000000000000000000000000000000000000000000000000081526004016103cc92919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b60008260800151600081518110610af257610af2611672565b60200260200101516020015190507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610b5b91815260200190565b600060405180830381600087803b158015610b7557600080fd5b505af1158015610b89573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610be7576040519150601f19603f3d011682016040523d82523d6000602084013e610bec565b606091505b5050905080610d32577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c5d57600080fd5b505af1158015610c71573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3091906116a1565b505b50505050565b6000610d47604083018361179c565b6000818110610d5857610d58611672565b905060400201602001359050600073ffffffffffffffffffffffffffffffffffffffff16826060016020810190610d8f919061180b565b73ffffffffffffffffffffffffffffffffffffffff1614610dec57803414610dec576040517fba2f7467000000000000000000000000000000000000000000000000000000008152600481018290523460248201526044016103cc565b5050565b6040805173ffffffffffffffffffffffffffffffffffffffff8581166024830152848116604483015260648083018590528351808403909101815260849092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610d3292879291600091610ec3918516908490610f72565b805190915015610f6d5780806020019051810190610ee191906116a1565b610f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016103cc565b505050565b60606103578484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051610fa69190611828565b60006040518083038185875af1925050503d8060008114610fe3576040519150601f19603f3d011682016040523d82523d6000602084013e610fe8565b606091505b5091509150610ff987838387611004565b979650505050505050565b6060831561109a5782516000036110935773ffffffffffffffffffffffffffffffffffffffff85163b611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103cc565b5081610357565b61035783838151156110af5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cc919061119a565b6000602082840312156110f557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461112557600080fd5b9392505050565b60005b8381101561114757818101518382015260200161112f565b50506000910152565b6000815180845261116881602086016020860161112c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111256020830184611150565b803567ffffffffffffffff811681146111c557600080fd5b919050565b600060a082840312156111dc57600080fd5b50919050565b600080604083850312156111f557600080fd5b6111fe836111ad565b9150602083013567ffffffffffffffff81111561121a57600080fd5b611226858286016111ca565b9150509250929050565b60006020828403121561124257600080fd5b813567ffffffffffffffff81111561125957600080fd5b610357848285016111ca565b6000604067ffffffffffffffff851683526020604081850152845160a0604086015261129460e0860182611150565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526112cf8383611150565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015611330578451805173ffffffffffffffffffffffffffffffffffffffff168352860151868301529385019360019390930192908601906112f1565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a0152955061136c8187611150565b9a9950505050505050505050565b60006020828403121561138c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156113e5576113e5611393565b60405290565b60405160a0810167ffffffffffffffff811182821017156113e5576113e5611393565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561145557611455611393565b604052919050565b600082601f83011261146e57600080fd5b813567ffffffffffffffff81111561148857611488611393565b6114b960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161140e565b8181528460208386010111156114ce57600080fd5b816020850160208301376000918101602001919091529392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146103e657600080fd5b80356111c5816114eb565b600082601f83011261152957600080fd5b8135602067ffffffffffffffff82111561154557611545611393565b611553818360051b0161140e565b82815260069290921b8401810191818101908684111561157257600080fd5b8286015b848110156115ba576040818903121561158f5760008081fd5b6115976113c2565b81356115a2816114eb565b81528185013585820152835291830191604001611576565b509695505050505050565b600060a082360312156115d757600080fd5b6115df6113eb565b823581526115ef602084016111ad565b6020820152604083013567ffffffffffffffff8082111561160f57600080fd5b61161b3683870161145d565b6040840152606085013591508082111561163457600080fd5b6116403683870161145d565b6060840152608085013591508082111561165957600080fd5b5061166636828601611518565b60808301525092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156116b357600080fd5b8151801515811461112557600080fd5b600060a082360312156116d557600080fd5b6116dd6113eb565b823567ffffffffffffffff808211156116f557600080fd5b6117013683870161145d565b8352602085013591508082111561171757600080fd5b6117233683870161145d565b6020840152604085013591508082111561173c57600080fd5b61174836838701611518565b60408401526117596060860161150d565b6060840152608085013591508082111561177257600080fd5b506116663682860161145d565b60006020828403121561179157600080fd5b8151611125816114eb565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126117d157600080fd5b83018035915067ffffffffffffffff8211156117ec57600080fd5b6020019150600681901b360382131561180457600080fd5b9250929050565b60006020828403121561181d57600080fd5b8135611125816114eb565b6000825161183a81846020870161112c565b919091019291505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipSend\",\"inputs\":[{\"name\":\"destinationChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"destinationChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_weth\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWrappedNative\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidRouter\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"gotToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expectedToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAmounts\",\"inputs\":[{\"name\":\"gotAmounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TokenAmountNotEqualToMsgValue\",\"inputs\":[{\"name\":\"gotAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"msgValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]",
+ Bin: "0x60c080604052346101245761002a9061161380380380916100208285610180565b83398101906101b9565b6001600160a01b03811690811561016a5760805260405163e861e90760e01b815290602082600481845afa908115610131576044602092600094859161013d575b506001600160a01b031660a081905260405163095ea7b360e01b8152600481019390935284196024840152919384928391905af18015610131576100f4575b60405161143a90816101d9823960805181818160bd01528181610185015281816106170152610d44015260a0518181816102cf0152818161058601528181610ccc01526112d40152f35b6020813d602011610129575b8161010d60209383610180565b8101031261012457518015150361012457386100aa565b600080fd5b3d9150610100565b6040513d6000823e3d90fd5b61015d9150843d8611610163575b6101558183610180565b8101906101b9565b3861006b565b503d61014b565b6335fdcccd60e21b600052600060045260246000fd5b601f909101601f19168101906001600160401b038211908210176101a357604052565b634e487b7160e01b600052604160045260246000fd5b9081602091031261012457516001600160a01b0381168103610124579056fe608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c90816301ffc9a71461070b57508063181f5a771461068857806320487ded146105aa5780634dbe7e921461053b57806385572ffb1461010057806396f4e9f9146100e45763b0f479a10361000f57346100e157807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b80fd5b60206100f86100f2366108f2565b90610c23565b604051908152f35b50346100e15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e15760043567ffffffffffffffff81116105375760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126105375773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361050b576040516101b7816107cd565b81600401358152602482013567ffffffffffffffff81168103610468576020820152604482013567ffffffffffffffff8111610468576101fd9060043691850101610ac0565b6040820152606482013567ffffffffffffffff8111610468576102269060043691850101610ac0565b9160608201928352608481013567ffffffffffffffff81116105075760809160046102549236920101610b28565b9101918183525160208180518101031261046857602001519073ffffffffffffffffffffffffffffffffffffffff82168092036104685751600181036104dc575073ffffffffffffffffffffffffffffffffffffffff6102b48351610bcf565b5151169173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680930361048b5761030260209151610bcf565b51015190823b15610468576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152826004820152848160248183885af180156104805761046c575b508380808085855af161035e61132d565b5015610368578380f35b823b1561046857836040517fd0e30db0000000000000000000000000000000000000000000000000000000008152818160048187895af180156104445761044f575b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092166004830152602482019290925291602091839160449183915af1801561044457610415575b80808380f35b6104369060203d60201161043d575b61042e8183610818565b810190610c0b565b503861040f565b503d610424565b6040513d84823e3d90fd5b8161045c91949394610818565b610468579083386103aa565b8380fd5b8461047991959295610818565b923861034d565b6040513d87823e3d90fd5b838373ffffffffffffffffffffffffffffffffffffffff6104ae60449451610bcf565b5151167f0fc746a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b7f83b9f0ae000000000000000000000000000000000000000000000000000000008452600452602483fd5b8480fd5b6024827fd7f7333400000000000000000000000000000000000000000000000000000000815233600452fd5b5080fd5b50346100e157807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346100e1576105fe60206105c96105c1366108f2565b9190916111ae565b9060405193849283927f20487ded0000000000000000000000000000000000000000000000000000000084526004840161097c565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610444578291610652575b602082604051908152f35b90506020813d602011610680575b8161066d60209383610818565b8101031261053757602091505138610647565b3d9150610660565b50346100e157807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e157506107076040516106c9604082610818565b601981527f457468657253656e646572526563656976657220312e352e30000000000000006020820152604051918291602083526020830190610893565b0390f35b9050346105375760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610537576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036107c957602092507f85572ffb00000000000000000000000000000000000000000000000000000000811490811561079f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438610798565b8280fd5b60a0810190811067ffffffffffffffff8211176107e957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176107e957604052565b67ffffffffffffffff81116107e957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b8481106108dd5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161089e565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126109775760043567ffffffffffffffff8116810361097757916024359067ffffffffffffffff8211610977577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8260a0920301126109775760040190565b600080fd5b9067ffffffffffffffff90939293168152604060208201526109e16109ad845160a0604085015260e0840190610893565b60208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0848303016060850152610893565b906040840151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08282030160808301526020808451928381520193019060005b818110610a885750505060808473ffffffffffffffffffffffffffffffffffffffff6060610a85969701511660a084015201519060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610893565b90565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101518187015260409095019490920191600101610a22565b81601f8201121561097757803590610ad782610859565b92610ae56040519485610818565b8284526020838301011161097757816000926020809301838601378301015290565b359073ffffffffffffffffffffffffffffffffffffffff8216820361097757565b81601f820112156109775780359067ffffffffffffffff82116107e95760405192610b5960208460051b0185610818565b82845260208085019360061b8301019181831161097757602001925b828410610b83575050505090565b6040848303126109775760405190604082019082821067ffffffffffffffff8311176107e9576040926020928452610bba87610b07565b81528287013583820152815201930192610b75565b805115610bdc5760200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610977575180151581036109775790565b9060009060408101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156107c9578101803567ffffffffffffffff8111610468578060061b3603602083011361046857156111815760400135606082013573ffffffffffffffffffffffffffffffffffffffff81168091036104685761114b575b50610cb5906111ae565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020610cfb6040840151610bcf565b510151813b156104685783600491604051928380927fd0e30db0000000000000000000000000000000000000000000000000000000008252865af180156111405761112c575b507f00000000000000000000000000000000000000000000000000000000000000009373ffffffffffffffffffffffffffffffffffffffff851691604051907f20487ded00000000000000000000000000000000000000000000000000000000825260208280610db588876004840161097c565b0381875afa9182156111215786926110ed575b50606085019673ffffffffffffffffffffffffffffffffffffffff8851169788610e805750505050610e319394509060209291476040518096819582947f96f4e9f90000000000000000000000000000000000000000000000000000000084526004840161097c565b03925af1918215610e745791610e45575090565b90506020813d602011610e6c575b81610e6060209383610818565b81010312610977575190565b3d9150610e53565b604051903d90823e3d90fd5b610f20604051602081019a7f23b872dd000000000000000000000000000000000000000000000000000000008c5233602483015230604483015286606483015260648252610ecf608483610818565b8a8060409d8e94610ee286519687610818565b602086527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020870152519082855af1610f1a61132d565b9161135d565b80518061104c575b50505173ffffffffffffffffffffffffffffffffffffffff16918203610fa9575b505050916020918493610f8a9587518097819582947f96f4e9f90000000000000000000000000000000000000000000000000000000084526004840161097c565b03925af1928315610f9f575091610e45575090565b51903d90823e3d90fd5b87517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91909116600482015260248101929092526020908290604490829089905af18015611042579160209391610f8a969593611025575b8193959650829450610f49565b61103b90853d871161043d5761042e8183610818565b5038611018565b86513d87823e3d90fd5b9060208061105e938301019101610c0b565b1561106a573880610f28565b608489517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9091506020813d602011611119575b8161110960209383610818565b8101031261097757519038610dc8565b3d91506110fc565b6040513d88823e3d90fd5b8361113991949294610818565b9138610d41565b6040513d86823e3d90fd5b348114610cab577fba2f746700000000000000000000000000000000000000000000000000000000835260045234602452604482fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b606060806040516111be816107cd565b828152826020820152826040820152600083820152015260a08136031261097757604051906111ec826107cd565b803567ffffffffffffffff81116109775761120a9036908301610ac0565b8252602081013567ffffffffffffffff81116109775761122d9036908301610ac0565b60208301908152604082013567ffffffffffffffff8111610977576112559036908401610b28565b916040840192835261126960608201610b07565b606085015260808101359067ffffffffffffffff82116109775761128f91369101610ac0565b608084015281515160018103611300575060405190336020830152602082526112b9604083610818565b526112fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169151610bcf565b515290565b7f83b9f0ae0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3d15611358573d9061133e82610859565b9161134c6040519384610818565b82523d6000602084013e565b606090565b919290156113d85750815115611371575090565b3b1561137a5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156113eb5750805190602001fd5b611429906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190610893565b0390fdfea164736f6c634300081a000a",
}
var EtherSenderReceiverABI = EtherSenderReceiverMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
index 1f64166ac74..550e82ea272 100644
--- a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
+++ b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go
@@ -156,8 +156,8 @@ type KeystoneFeedsPermissionHandlerPermission struct {
}
var FeeQuoterMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minFeeUSDCents\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint256\"}],\"name\":\"InvalidFeeRange\",\"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\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numberOfTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint256\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"name\":\"permission\",\"type\":\"tuple\"}],\"name\":\"ReportPermissionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FEE_BASE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"name\":\"permissions\",\"type\":\"tuple[]\"}],\"name\":\"setReportPermissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"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\":[{\"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\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b5060405162007a6838038062007a6883398101604081905262000034916200189c565b85336000816200005757604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008a576200008a81620001d0565b5050604080518082018252828152815160008152602080820190935291810191909152620000b8906200024a565b5060208701516001600160a01b03161580620000dc575086516001600160601b0316155b80620000f05750604087015163ffffffff16155b156200010f5760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c052805160008152918201905262000155908662000399565b6200016084620004e1565b6200016b81620005d9565b620001768262000a45565b60408051600080825260208201909252620001c391859190620001bc565b6040805180820190915260008082526020820152815260200190600190039081620001945790505b5062000b11565b5050505050505062001b5a565b336001600160a01b03821603620001fa57604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b8151811015620002da576000828281518110620002735762000273620019bb565b602090810291909101015190506200028d60028262000e97565b15620002d0576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b5060010162000252565b50815160005b815181101562000393576000828281518110620003015762000301620019bb565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200033f576040516342bcdf7f60e11b815260040160405180910390fd5b6200034c60028262000eb7565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101620002e0565b50505050565b60005b82518110156200043a57620003d8838281518110620003bf57620003bf620019bb565b6020026020010151600b62000ece60201b90919060201c565b156200043157828181518110620003f357620003f3620019bb565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b6001016200039c565b5060005b8151811015620004dc576200047a828281518110620004615762000461620019bb565b6020026020010151600b62000eb760201b90919060201c565b15620004d357818181518110620004955762000495620019bb565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b6001016200043e565b505050565b60005b8151811015620005d5576000828281518110620005055762000505620019bb565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a0180518589018051949098166001600160a81b03199093168317600160a01b60ff928316021760ff60a81b1916600160a81b9415159490940293909317909355835190815291511697810197909752915115159186019190915292945090929091907fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf9060600160405180910390a2505050806001019050620004e4565b5050565b60005b8151811015620005d5576000828281518110620005fd57620005fd620019bb565b6020026020010151905060008383815181106200061e576200061e620019bb565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000657575061016081015163ffffffff16155b806200067957506102008101516001600160e01b031916630a04b54b60e21b14155b80620006995750806060015163ffffffff1681610160015163ffffffff16115b15620006c85760405163c35aa79d60e01b81526001600160401b03831660048201526024015b60405180910390fd5b6001600160401b038216600090815260096020526040812060010154600160a81b900460e01b6001600160e01b03191690036200074857816001600160401b03167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda46265826040516200073a9190620019d1565b60405180910390a26200078c565b816001600160401b03167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051620007839190620019d1565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050620005dc565b60005b8151811015620005d557600082828151811062000a695762000a69620019bb565b6020026020010151600001519050600083838151811062000a8e5762000a8e620019bb565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a48565b60005b825181101562000dd157600083828151811062000b355762000b35620019bb565b6020026020010151905060008160000151905060005b82602001515181101562000dc25760008360200151828151811062000b745762000b74620019bb565b602002602001015160200151905060008460200151838151811062000b9d5762000b9d620019bb565b6020026020010151600001519050816020015163ffffffff16826000015163ffffffff161062000bf857815160208301516040516305a7b3d160e11b815263ffffffff928316600482015291166024820152604401620006bf565b602063ffffffff16826080015163ffffffff16101562000c495760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff9091166024820152604401620006bf565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000daf908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b4b565b50505080600101905062000b14565b5060005b8151811015620004dc57600082828151811062000df65762000df6620019bb565b6020026020010151600001519050600083838151811062000e1b5762000e1b620019bb565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000dd5565b600062000eae836001600160a01b03841662000ee5565b90505b92915050565b600062000eae836001600160a01b03841662000fe9565b600062000eae836001600160a01b0384166200103b565b6000818152600183016020526040812054801562000fde57600062000f0c60018362001b22565b855490915060009062000f229060019062001b22565b905081811462000f8e57600086600001828154811062000f465762000f46620019bb565b906000526020600020015490508087600001848154811062000f6c5762000f6c620019bb565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000fa25762000fa262001b44565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000eb1565b600091505062000eb1565b6000818152600183016020526040812054620010325750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000eb1565b50600062000eb1565b6000818152600183016020526040812054801562000fde5760006200106260018362001b22565b8554909150600090620010789060019062001b22565b905080821462000f8e57600086600001828154811062000f465762000f46620019bb565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620010d757620010d76200109c565b60405290565b604080519081016001600160401b0381118282101715620010d757620010d76200109c565b60405160c081016001600160401b0381118282101715620010d757620010d76200109c565b60405161022081016001600160401b0381118282101715620010d757620010d76200109c565b604051601f8201601f191681016001600160401b03811182821017156200117857620011786200109c565b604052919050565b80516001600160a01b03811681146200119857600080fd5b919050565b805163ffffffff811681146200119857600080fd5b600060608284031215620011c557600080fd5b620011cf620010b2565b82519091506001600160601b0381168114620011ea57600080fd5b8152620011fa6020830162001180565b60208201526200120d604083016200119d565b604082015292915050565b60006001600160401b038211156200123457620012346200109c565b5060051b60200190565b600082601f8301126200125057600080fd5b8151602062001269620012638362001218565b6200114d565b8083825260208201915060208460051b8701019350868411156200128c57600080fd5b602086015b84811015620012b357620012a58162001180565b835291830191830162001291565b509695505050505050565b805180151581146200119857600080fd5b600082601f830112620012e157600080fd5b81516020620012f4620012638362001218565b82815260079290921b840181019181810190868411156200131457600080fd5b8286015b84811015620012b3578088036080811215620013345760008081fd5b6200133e620010dd565b620013498362001180565b8152606080601f1984011215620013605760008081fd5b6200136a620010b2565b92506200137987850162001180565b835260408085015160ff81168114620013925760008081fd5b84890152620013a3858301620012be565b90840152508086019190915283529183019160800162001318565b80516001600160401b03811681146200119857600080fd5b805161ffff811681146200119857600080fd5b600082601f830112620013fb57600080fd5b815160206200140e620012638362001218565b82815260059290921b840181019181810190868411156200142e57600080fd5b8286015b84811015620012b35780516001600160401b03808211156200145357600080fd5b908801906040601f19838c0381018213156200146e57600080fd5b62001478620010dd565b62001485898601620013be565b815282850151848111156200149957600080fd5b8086019550508c603f860112620014af57600080fd5b888501519350620014c4620012638562001218565b84815260e09094028501830193898101908e861115620014e357600080fd5b958401955b85871015620015bc57868f0360e08112156200150357600080fd5b6200150d620010dd565b620015188962001180565b815260c086830112156200152b57600080fd5b6200153562001102565b9150620015448d8a016200119d565b825262001553878a016200119d565b8d8301526200156560608a01620013d6565b878301526200157760808a016200119d565b60608301526200158a60a08a016200119d565b60808301526200159d60c08a01620012be565b60a0830152808d0191909152825260e09690960195908a0190620014e8565b828b01525087525050509284019250830162001432565b600082601f830112620015e557600080fd5b81516020620015f8620012638362001218565b82815260069290921b840181019181810190868411156200161857600080fd5b8286015b84811015620012b35760408189031215620016375760008081fd5b62001641620010dd565b6200164c8262001180565b81526200165b858301620013be565b818601528352918301916040016200161c565b80516001600160e01b0319811681146200119857600080fd5b600082601f8301126200169957600080fd5b81516020620016ac620012638362001218565b8281526102409283028501820192828201919087851115620016cd57600080fd5b8387015b858110156200188f5780890382811215620016ec5760008081fd5b620016f6620010dd565b6200170183620013be565b815261022080601f1984011215620017195760008081fd5b6200172362001127565b925062001732888501620012be565b8352604062001743818601620013d6565b898501526060620017568187016200119d565b82860152608091506200176b8287016200119d565b9085015260a06200177e8682016200119d565b8286015260c0915062001793828701620013d6565b9085015260e0620017a68682016200119d565b828601526101009150620017bc828701620013d6565b90850152610120620017d0868201620013d6565b828601526101409150620017e6828701620013d6565b90850152610160620017fa8682016200119d565b828601526101809150620018108287016200119d565b908501526101a062001824868201620013be565b828601526101c091506200183a8287016200119d565b908501526101e06200184e8682016200119d565b82860152610200915062001864828701620012be565b90850152620018758583016200166e565b9084015250808701919091528452928401928101620016d1565b5090979650505050505050565b6000806000806000806000610120888a031215620018b957600080fd5b620018c58989620011b2565b60608901519097506001600160401b0380821115620018e357600080fd5b620018f18b838c016200123e565b975060808a01519150808211156200190857600080fd5b620019168b838c016200123e565b965060a08a01519150808211156200192d57600080fd5b6200193b8b838c01620012cf565b955060c08a01519150808211156200195257600080fd5b620019608b838c01620013e9565b945060e08a01519150808211156200197757600080fd5b620019858b838c01620015d3565b93506101008a01519150808211156200199d57600080fd5b50620019ac8a828b0162001687565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b81511515815261022081016020830151620019f2602084018261ffff169052565b50604083015162001a0b604084018263ffffffff169052565b50606083015162001a24606084018263ffffffff169052565b50608083015162001a3d608084018263ffffffff169052565b5060a083015162001a5460a084018261ffff169052565b5060c083015162001a6d60c084018263ffffffff169052565b5060e083015162001a8460e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000eb157634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615ebb62001bad6000396000818161032801526119170152600081816102ec0152818161103401526110940152600081816102b8015281816110bd015261112d0152615ebb6000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c8063770e2dc41161010f578063bf78e03f116100a2578063d8694ccd11610071578063d8694ccd14610b04578063f2fde38b14610b17578063fbe3f77814610b2a578063ffdb4b3714610b3d57600080fd5b8063bf78e03f14610a03578063cdc73d5114610ae1578063d02641a014610ae9578063d63d3af214610afc57600080fd5b806382b49eb0116100de57806382b49eb0146108455780638da5cb5b146109b557806391a2749a146109dd578063a69c64c0146109f057600080fd5b8063770e2dc41461080457806379ba5097146108175780637afac3221461081f578063805f21321461083257600080fd5b80633937306f116101875780634ab35b0b116101565780634ab35b0b14610472578063514e8cff146104b25780636cb5f3dd146105555780636def4ce71461056857600080fd5b80633937306f1461040757806341ed29e71461041c578063430d138c1461042f57806345ac924d1461045257600080fd5b806306285c69116101c357806306285c691461028b578063181f5a77146103a15780632451a627146103ea578063325c868e146103ff57600080fd5b806241e5be146101e957806301ffc9a71461020f578063061877e314610232575b600080fd5b6101fc6101f7366004614568565b610b85565b6040519081526020015b60405180910390f35b61022261021d3660046145d4565b610bf3565b6040519015158152602001610206565b6102726102403660046145ef565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff9091168152602001610206565b610355604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff1690820152606001610206565b6103dd6040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b604051610206919061466e565b6103f2610d24565b6040516102069190614681565b6101fc602481565b61041a6104153660046146db565b610d35565b005b61041a61042a366004614887565b610fea565b61044261043d366004614a72565b61102c565b6040516102069493929190614b66565b610465610460366004614c05565b61123c565b6040516102069190614c47565b6104856104803660046145ef565b611305565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610206565b6105486104c0366004614cc2565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516102069190614cdd565b61041a610563366004614d3e565b611310565b6107f7610576366004614cc2565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c01000000000000000000000000860485166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516102069190614f5e565b61041a61081236600461515c565b611324565b61041a611336565b61041a61082d366004615476565b611404565b61041a6108403660046154da565b611416565b610955610853366004615546565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516102069190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60015460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610206565b61041a6109eb366004615570565b611852565b61041a6109fe366004615601565b611863565b610aa4610a113660046145ef565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff9485168152600783528390208351918201845254938416815260ff74010000000000000000000000000000000000000000850481169282019290925275010000000000000000000000000000000000000000009093041615159082015290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015160ff169082015291810151151590820152606001610206565b6103f2611874565b610548610af73660046145ef565b611880565b6101fc601281565b6101fc610b123660046156c6565b611a35565b61041a610b253660046145ef565b611f6d565b61041a610b3836600461572a565b611f7e565b610b50610b4b36600461584a565b611f8f565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff938416815292909116602083015201610206565b6000610b9082612047565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610bb785612047565b610bdf907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856158a3565b610be991906158ba565b90505b9392505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f805f2132000000000000000000000000000000000000000000000000000000001480610c8657507fffffffff0000000000000000000000000000000000000000000000000000000082167f9b645f4100000000000000000000000000000000000000000000000000000000145b80610cd257507fffffffff0000000000000000000000000000000000000000000000000000000082167f181f5a7700000000000000000000000000000000000000000000000000000000145b80610d1e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6060610d3060026120e1565b905090565b610d3d6120ee565b6000610d4982806158f5565b9050905060005b81811015610e93576000610d6484806158f5565b83818110610d7457610d7461595d565b905060400201803603810190610d8a91906159b8565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610e829290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610d50565b506000610ea360208401846158f5565b9050905060005b81811015610fe4576000610ec160208601866158f5565b83818110610ed157610ed161595d565b905060400201803603810190610ee791906159f5565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610fd39290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610eaa565b50505050565b610ff2612133565b60005b8151811015611028576110208282815181106110135761101361595d565b6020026020010151612184565b600101610ff5565b5050565b6000806060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff160361108d578a93506110bb565b6110b88c8c7f0000000000000000000000000000000000000000000000000000000000000000610b85565b93505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1684111561115f576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b67ffffffffffffffff8d1660009081526009602052604081206001015463ffffffff169061118e8c8c84612356565b9050806020015194506111a48f8b8b8b8b6124ff565b92508585611224836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b95509550955050509950995099509995505050505050565b60608160008167ffffffffffffffff81111561125a5761125a614716565b60405190808252806020026020018201604052801561129f57816020015b60408051808201909152600080825260208201528152602001906001900390816112785790505b50905060005b828110156112fc576112d78686838181106112c2576112c261595d565b9050602002016020810190610af791906145ef565b8282815181106112e9576112e961595d565b60209081029190910101526001016112a5565b50949350505050565b6000610d1e82612047565b611318612133565b61132181612882565b50565b61132c612133565b6110288282612d54565b60005473ffffffffffffffffffffffffffffffffffffffff163314611387576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61140c612133565b61102882826131ca565b600080600061145a87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061331192505050565b92509250925061146c3383858461332c565b600061147a85870187615a18565b905060005b8151811015611847576000600760008484815181106114a0576114a061595d565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604091820160002082516060810184529054938416815260ff740100000000000000000000000000000000000000008504811692820192909252750100000000000000000000000000000000000000000090930416151590820181905290915061159b578282815181106115445761154461595d565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401611156565b60006115e8601283602001518686815181106115b9576115b961595d565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613484565b9050600660008585815181106116005761160061595d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff168484815181106116725761167261595d565b60200260200101516040015163ffffffff16101561169157505061183f565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681526020018585815181106116d2576116d261595d565b60200260200101516040015163ffffffff16815250600660008686815181106116fd576116fd61595d565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905583518490849081106117955761179561595d565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a828686815181106117eb576117eb61595d565b6020026020010151604001516040516118349291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a250505b60010161147f565b505050505050505050565b61185a612133565b61132181613547565b61186b612133565b611321816136d3565b6060610d30600b6120e1565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169183018290527f000000000000000000000000000000000000000000000000000000000000000016906119429042615adf565b101561194e5792915050565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526007602090815260409182902082516060810184529054938416815260ff74010000000000000000000000000000000000000000850481169282019290925275010000000000000000000000000000000000000000009093041615801591830191909152806119ef5750805173ffffffffffffffffffffffffffffffffffffffff16155b156119fb575092915050565b6000611a06826137bd565b9050826020015163ffffffff16816020015163ffffffff161015611a2a5782611a2c565b805b95945050505050565b67ffffffffffffffff8083166000908152600960209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c01000000000000000000000000880485166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611c6f576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401611156565b611c8a611c8260808501606086016145ef565b600b9061394f565b611ce957611c9e60808401606085016145ef565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401611156565b6000611cf860408501856158f5565b9150611d54905082611d0d6020870187615af2565b905083611d1a8880615af2565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061397e92505050565b6000611d6e611d6960808701606088016145ef565b612047565b90506000611d8187856101c00151613a3b565b9050600080808515611dc157611db5878b611da260808d0160608e016145ef565b88611db060408f018f6158f5565b613b3b565b91945092509050611de1565b6101a0870151611dde9063ffffffff16662386f26fc100006158a3565b92505b61010087015160009061ffff1615611e2557611e22886dffffffffffffffffffffffffffff607088901c16611e1960208e018e615af2565b90508a86613e13565b90505b61018088015160009067ffffffffffffffff16611e4e611e4860808e018e615af2565b8c613ec3565b600001518563ffffffff168b60a0015161ffff168e8060200190611e729190615af2565b611e7d9291506158a3565b8c6080015163ffffffff16611e929190615b57565b611e9c9190615b57565b611ea69190615b57565b611ec0906dffffffffffffffffffffffffffff89166158a3565b611eca91906158a3565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f6060016020810190611f0491906145ef565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054611f3f9067ffffffffffffffff16896158a3565b611f499190615b57565b611f539190615b57565b611f5d91906158ba565b9c9b505050505050505050505050565b611f75612133565b61132181613f84565b611f86612133565b61132181614048565b67ffffffffffffffff8116600090815260096020526040812054819060ff16611ff0576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401611156565b611ff984612047565b67ffffffffffffffff841660009081526009602052604090206001015461203b908590700100000000000000000000000000000000900463ffffffff16613a3b565b915091505b9250929050565b60008061205383611880565b9050806020015163ffffffff166000148061208b575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b156120da576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401611156565b5192915050565b60606000610bec8361419a565b6120f960023361394f565b612131576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401611156565b565b60015473ffffffffffffffffffffffffffffffffffffffff163314612131576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061223d82600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a39061234a908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b6040805180820190915260008082526020820152600083900361239757506040805180820190915267ffffffffffffffff8216815260006020820152610bec565b60006123a38486615b6a565b905060006123b48560048189615bb0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f0000000000000000000000000000000000000000000000000000000000161245157808060200190518101906124489190615bda565b92505050610bec565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016124cd576040518060400160405280828060200190518101906124b99190615c06565b815260006020909101529250610bec915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808616600090815260096020526040902060010154606091750100000000000000000000000000000000000000000090910460e01b90859081111561254f5761254f614716565b60405190808252806020026020018201604052801561258257816020015b606081526020019060019003908161256d5790505b50915060005b858110156128775760008585838181106125a4576125a461595d565b6125ba92602060409092020190810191506145ef565b905060008888848181106125d0576125d061595d565b90506020028101906125e29190615c1f565b6125f0906040810190615af2565b91505060208111156126a05767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff168111156126a0576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401611156565b612710848a8a868181106126b6576126b661595d565b90506020028101906126c89190615c1f565b6126d6906020810190615af2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141f692505050565b67ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684528252808320815160c081018352905463ffffffff8082168352640100000000820481169483019490945268010000000000000000810461ffff16928201929092526a01000000000000000000008204831660608201526e010000000000000000000000000000820490921660808301527201000000000000000000000000000000000000900460ff16151560a082018190529091906128225767ffffffffffffffff8c166000908152600960205260409020547b01000000000000000000000000000000000000000000000000000000900463ffffffff16612828565b81606001515b6040805163ffffffff831660208201529192500160405160208183030381529060405287868151811061285d5761285d61595d565b602002602001018190525050505050806001019050612588565b505095945050505050565b60005b81518110156110285760008282815181106128a2576128a261595d565b6020026020010151905060008383815181106128c0576128c061595d565b60200260200101516000015190506000826020015190508167ffffffffffffffff16600014806128f9575061016081015163ffffffff16155b8061294b57506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b8061296a5750806060015163ffffffff1681610160015163ffffffff16115b156129ad576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401611156565b67ffffffffffffffff82166000908152600960205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff00000000000000000000000000000000000000000000000000000000169003612a55578167ffffffffffffffff167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626582604051612a489190614f5e565b60405180910390a2612a98565b8167ffffffffffffffff167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051612a8f9190614f5e565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050612885565b60005b82518110156130e1576000838281518110612d7457612d7461595d565b6020026020010151905060008160000151905060005b8260200151518110156130d357600083602001518281518110612daf57612daf61595d565b6020026020010151602001519050600084602001518381518110612dd557612dd561595d565b6020026020010151600001519050816020015163ffffffff16826000015163ffffffff1610612e4757815160208301516040517f0b4f67a200000000000000000000000000000000000000000000000000000000815263ffffffff928316600482015291166024820152604401611156565b602063ffffffff16826080015163ffffffff161015612ebc5760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401611156565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b5906130c1908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101612d8a565b505050806001019050612d57565b5060005b81518110156131c55760008282815181106131025761310261595d565b602002602001015160000151905060008383815181106131245761312461595d565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a350506001016130e5565b505050565b60005b825181101561326d576132038382815181106131eb576131eb61595d565b6020026020010151600b61424890919063ffffffff16565b156132655782818151811061321a5761321a61595d565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b6001016131cd565b5060005b81518110156131c5576132a782828151811061328f5761328f61595d565b6020026020010151600b61426a90919063ffffffff16565b15613309578181815181106132be576132be61595d565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101613271565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff1661347d576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401611156565b5050505050565b6000806134918486615c5d565b9050600060248260ff1611156134cb576134af602460ff8416615adf565b6134ba90600a615d96565b6134c490856158ba565b90506134f1565b6134d960ff83166024615adf565b6134e490600a615d96565b6134ee90856158a3565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611a2c576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160005b81518110156135e257600082828151811061356c5761356c61595d565b6020026020010151905061358a81600261428c90919063ffffffff16565b156135d95760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b5060010161354f565b50815160005b8151811015610fe45760008282815181106136055761360561595d565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613675576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61368060028261426a565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016135e8565b60005b81518110156110285760008282815181106136f3576136f361595d565b602002602001015160000151905060008383815181106137155761371561595d565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a250506001016136d6565b60408051808201909152600080825260208201526000826000015190506000808273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384c9190615dbc565b50935050925050600082121561388e576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061390d8473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139029190615e0c565b876020015185613484565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff909216602083015250949350505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610bec565b836040015163ffffffff168311156139d75760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401611156565b836020015161ffff16821115613a2c5760208401516040517fd88dddd60000000000000000000000000000000000000000000000000000000081526004810184905261ffff9091166024820152604401611156565b610fe4846102000151826141f6565b67ffffffffffffffff821660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116825263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169282019290925290831615613b33576000816020015163ffffffff1642613ad09190615adf565b90508363ffffffff16811115613b31576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff8516602482015260448101829052606401611156565b505b519392505050565b6000808083815b81811015613e05576000878783818110613b5e57613b5e61595d565b905060400201803603810190613b749190615e29565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613c94576101208d0151613c619061ffff16662386f26fc100006158a3565b613c6b9088615b57565b96508c610140015186613c7e9190615e62565b9550613c8b602086615e62565b94505050613dfd565b604081015160009061ffff1615613d4d5760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613cf0578351613ce990612047565b9050613cf3565b508a5b620186a0836040015161ffff16613d358660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166142ae90919063ffffffff16565b613d3f91906158a3565b613d4991906158ba565b9150505b6060820151613d5c9088615e62565b9650816080015186613d6e9190615e62565b8251909650600090613d8d9063ffffffff16662386f26fc100006158a3565b905080821015613dac57613da1818a615b57565b985050505050613dfd565b6000836020015163ffffffff16662386f26fc10000613dcb91906158a3565b905080831115613deb57613ddf818b615b57565b99505050505050613dfd565b613df5838b615b57565b995050505050505b600101613b42565b505096509650969350505050565b60008063ffffffff8316613e29610120866158a3565b613e35876101e0615b57565b613e3f9190615b57565b613e499190615b57565b905060008760c0015163ffffffff168860e0015161ffff1683613e6c91906158a3565b613e769190615b57565b61010089015190915061ffff16613e9d6dffffffffffffffffffffffffffff8916836158a3565b613ea791906158a3565b613eb790655af3107a40006158a3565b98975050505050505050565b60408051808201909152600080825260208201526000613eef858585610160015163ffffffff16612356565b9050826060015163ffffffff1681600001511115613f39576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015613f4d57508060200151155b15610be9576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613fd3576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b81518110156110285760008282815181106140685761406861595d565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a0180518589018051949098167fffffffffffffffffffffff00000000000000000000000000000000000000000090931683177401000000000000000000000000000000000000000060ff92831602177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000009415159490940293909317909355835190815291511697810197909752915115159186019190915292945090929091907fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf9060600160405180910390a250505080600101905061404b565b6060816000018054806020026020016040519081016040528092919081815260200182805480156141ea57602002820191906000526020600020905b8154815260200190600101908083116141d6575b50505050509050919050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601611028576131c5816142eb565b6000610bec8373ffffffffffffffffffffffffffffffffffffffff841661439e565b6000610bec8373ffffffffffffffffffffffffffffffffffffffff8416614498565b6000610bec8373ffffffffffffffffffffffffffffffffffffffff84166144e7565b6000670de0b6b3a76400006142e1837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166158a3565b610bec91906158ba565b6000815160201461432a57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401611156919061466e565b6000828060200190518101906143409190615c06565b905073ffffffffffffffffffffffffffffffffffffffff811180614365575061040081105b15610d1e57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401611156919061466e565b600081815260018301602052604081205480156144875760006143c2600183615adf565b85549091506000906143d690600190615adf565b905080821461443b5760008660000182815481106143f6576143f661595d565b90600052602060002001549050808760000184815481106144195761441961595d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061444c5761444c615e7f565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610d1e565b6000915050610d1e565b5092915050565b60008181526001830160205260408120546144df57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610d1e565b506000610d1e565b6000818152600183016020526040812054801561448757600061450b600183615adf565b855490915060009061451f90600190615adf565b905081811461443b5760008660000182815481106143f6576143f661595d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461456357600080fd5b919050565b60008060006060848603121561457d57600080fd5b6145868461453f565b92506020840135915061459b6040850161453f565b90509250925092565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461456357600080fd5b6000602082840312156145e657600080fd5b610bec826145a4565b60006020828403121561460157600080fd5b610bec8261453f565b6000815180845260005b8181101561463057602081850181015186830182015201614614565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610bec602083018461460a565b6020808252825182820181905260009190848201906040850190845b818110156146cf57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161469d565b50909695505050505050565b6000602082840312156146ed57600080fd5b813567ffffffffffffffff81111561470457600080fd5b820160408185031215610bec57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561476857614768614716565b60405290565b6040805190810167ffffffffffffffff8111828210171561476857614768614716565b604051610220810167ffffffffffffffff8111828210171561476857614768614716565b60405160c0810167ffffffffffffffff8111828210171561476857614768614716565b6040516060810167ffffffffffffffff8111828210171561476857614768614716565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561484257614842614716565b604052919050565b600067ffffffffffffffff82111561486457614864614716565b5060051b60200190565b801515811461132157600080fd5b80356145638161486e565b6000602080838503121561489a57600080fd5b823567ffffffffffffffff8111156148b157600080fd5b8301601f810185136148c257600080fd5b80356148d56148d08261484a565b6147fb565b81815260a091820283018401918482019190888411156148f457600080fd5b938501935b838510156149c75780858a0312156149115760008081fd5b614919614745565b6149228661453f565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146149575760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146149905760008081fd5b9082015260606149a187820161453f565b908201526080868101356149b48161486e565b90820152835293840193918501916148f9565b50979650505050505050565b803567ffffffffffffffff8116811461456357600080fd5b60008083601f8401126149fd57600080fd5b50813567ffffffffffffffff811115614a1557600080fd5b60208301915083602082850101111561204057600080fd5b60008083601f840112614a3f57600080fd5b50813567ffffffffffffffff811115614a5757600080fd5b6020830191508360208260051b850101111561204057600080fd5b600080600080600080600080600060c08a8c031215614a9057600080fd5b614a998a6149d3565b9850614aa760208b0161453f565b975060408a0135965060608a013567ffffffffffffffff80821115614acb57600080fd5b614ad78d838e016149eb565b909850965060808c0135915080821115614af057600080fd5b614afc8d838e01614a2d565b909650945060a08c0135915080821115614b1557600080fd5b818c0191508c601f830112614b2957600080fd5b813581811115614b3857600080fd5b8d60208260061b8501011115614b4d57600080fd5b6020830194508093505050509295985092959850929598565b848152600060208515158184015260806040840152614b88608084018661460a565b8381036060850152845180825282820190600581901b8301840184880160005b83811015614bf4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552614be283835161460a565b94870194925090860190600101614ba8565b50909b9a5050505050505050505050565b60008060208385031215614c1857600080fd5b823567ffffffffffffffff811115614c2f57600080fd5b614c3b85828601614a2d565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614cb557614ca584835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101614c64565b5091979650505050505050565b600060208284031215614cd457600080fd5b610bec826149d3565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff169082015260408101610d1e565b803561ffff8116811461456357600080fd5b803563ffffffff8116811461456357600080fd5b60006020808385031215614d5157600080fd5b823567ffffffffffffffff811115614d6857600080fd5b8301601f81018513614d7957600080fd5b8035614d876148d08261484a565b8181526102409182028301840191848201919088841115614da757600080fd5b938501935b838510156149c75784890381811215614dc55760008081fd5b614dcd61476e565b614dd6876149d3565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215614e0b5760008081fd5b614e13614791565b9250614e2089890161487c565b83526040614e2f818a01614d18565b8a8501526060614e40818b01614d2a565b8286015260809150614e53828b01614d2a565b9085015260a0614e648a8201614d2a565b8286015260c09150614e77828b01614d18565b9085015260e0614e888a8201614d2a565b828601526101009150614e9c828b01614d18565b90850152610120614eae8a8201614d18565b828601526101409150614ec2828b01614d18565b90850152610160614ed48a8201614d2a565b828601526101809150614ee8828b01614d2a565b908501526101a0614efa8a82016149d3565b828601526101c09150614f0e828b01614d2a565b908501526101e0614f208a8201614d2a565b828601526102009150614f34828b0161487c565b90850152614f438983016145a4565b90840152508088019190915283529384019391850191614dac565b81511515815261022081016020830151614f7e602084018261ffff169052565b506040830151614f96604084018263ffffffff169052565b506060830151614fae606084018263ffffffff169052565b506080830151614fc6608084018263ffffffff169052565b5060a0830151614fdc60a084018261ffff169052565b5060c0830151614ff460c084018263ffffffff169052565b5060e083015161500a60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b600082601f8301126150d557600080fd5b813560206150e56148d08361484a565b82815260069290921b8401810191818101908684111561510457600080fd5b8286015b8481101561515157604081890312156151215760008081fd5b61512961476e565b615132826149d3565b815261513f85830161453f565b81860152835291830191604001615108565b509695505050505050565b6000806040838503121561516f57600080fd5b67ffffffffffffffff8335111561518557600080fd5b83601f84358501011261519757600080fd5b6151a76148d0843585013561484a565b8335840180358083526020808401939260059290921b909101018610156151cd57600080fd5b602085358601015b85358601803560051b016020018110156153da5767ffffffffffffffff813511156151ff57600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a0301121561523857600080fd5b61524061476e565b61524c602083016149d3565b815267ffffffffffffffff6040830135111561526757600080fd5b88603f60408401358401011261527c57600080fd5b6152926148d0602060408501358501013561484a565b6020604084810135850182810135808552928401939260e00201018b10156152b957600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156153bb5760e0818d0312156152ec57600080fd5b6152f461476e565b6152fd8261453f565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f0301121561533157600080fd5b6153396147b5565b61534560208401614d2a565b815261535360408401614d2a565b602082015261536460608401614d18565b604082015261537560808401614d2a565b606082015261538660a08401614d2a565b608082015261539860c084013561486e565b60c083013560a0820152602082810191909152908452929092019160e0016152c3565b50806020840152505080855250506020830192506020810190506151d5565b5092505067ffffffffffffffff602084013511156153f757600080fd5b61540784602085013585016150c4565b90509250929050565b600082601f83011261542157600080fd5b813560206154316148d08361484a565b8083825260208201915060208460051b87010193508684111561545357600080fd5b602086015b84811015615151576154698161453f565b8352918301918301615458565b6000806040838503121561548957600080fd5b823567ffffffffffffffff808211156154a157600080fd5b6154ad86838701615410565b935060208501359150808211156154c357600080fd5b506154d085828601615410565b9150509250929050565b600080600080604085870312156154f057600080fd5b843567ffffffffffffffff8082111561550857600080fd5b615514888389016149eb565b9096509450602087013591508082111561552d57600080fd5b5061553a878288016149eb565b95989497509550505050565b6000806040838503121561555957600080fd5b615562836149d3565b91506154076020840161453f565b60006020828403121561558257600080fd5b813567ffffffffffffffff8082111561559a57600080fd5b90830190604082860312156155ae57600080fd5b6155b661476e565b8235828111156155c557600080fd5b6155d187828601615410565b8252506020830135828111156155e657600080fd5b6155f287828601615410565b60208301525095945050505050565b6000602080838503121561561457600080fd5b823567ffffffffffffffff81111561562b57600080fd5b8301601f8101851361563c57600080fd5b803561564a6148d08261484a565b81815260069190911b8201830190838101908783111561566957600080fd5b928401925b828410156156bb57604084890312156156875760008081fd5b61568f61476e565b6156988561453f565b81526156a58686016149d3565b818701528252604093909301929084019061566e565b979650505050505050565b600080604083850312156156d957600080fd5b6156e2836149d3565b9150602083013567ffffffffffffffff8111156156fe57600080fd5b830160a0818603121561571057600080fd5b809150509250929050565b60ff8116811461132157600080fd5b6000602080838503121561573d57600080fd5b823567ffffffffffffffff81111561575457600080fd5b8301601f8101851361576557600080fd5b80356157736148d08261484a565b81815260079190911b8201830190838101908783111561579257600080fd5b928401925b828410156156bb5783880360808112156157b15760008081fd5b6157b961476e565b6157c28661453f565b81526060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156157f65760008081fd5b6157fe6147d8565b925061580b88880161453f565b835260408088013561581c8161571b565b848a0152908701359061582e8261486e565b8301528087019190915282526080939093019290840190615797565b6000806040838503121561585d57600080fd5b6158668361453f565b9150615407602084016149d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610d1e57610d1e615874565b6000826158f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261592a57600080fd5b83018035915067ffffffffffffffff82111561594557600080fd5b6020019150600681901b360382131561204057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461456357600080fd5b6000604082840312156159ca57600080fd5b6159d261476e565b6159db8361453f565b81526159e96020840161598c565b60208201529392505050565b600060408284031215615a0757600080fd5b615a0f61476e565b6159db836149d3565b60006020808385031215615a2b57600080fd5b823567ffffffffffffffff811115615a4257600080fd5b8301601f81018513615a5357600080fd5b8035615a616148d08261484a565b81815260609182028301840191848201919088841115615a8057600080fd5b938501935b838510156149c75780858a031215615a9d5760008081fd5b615aa56147d8565b615aae8661453f565b8152615abb87870161598c565b878201526040615acc818801614d2a565b9082015283529384019391850191615a85565b81810381811115610d1e57610d1e615874565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615b2757600080fd5b83018035915067ffffffffffffffff821115615b4257600080fd5b60200191503681900382131561204057600080fd5b80820180821115610d1e57610d1e615874565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156150bc5760049490940360031b84901b1690921692915050565b60008085851115615bc057600080fd5b83861115615bcd57600080fd5b5050820193919092039150565b600060408284031215615bec57600080fd5b615bf461476e565b8251815260208301516159e98161486e565b600060208284031215615c1857600080fd5b5051919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112615c5357600080fd5b9190910192915050565b60ff8181168382160190811115610d1e57610d1e615874565b600181815b80851115615ccf57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615cb557615cb5615874565b80851615615cc257918102915b93841c9390800290615c7b565b509250929050565b600082615ce657506001610d1e565b81615cf357506000610d1e565b8160018114615d095760028114615d1357615d2f565b6001915050610d1e565b60ff841115615d2457615d24615874565b50506001821b610d1e565b5060208310610133831016604e8410600b8410161715615d52575081810a610d1e565b615d5c8383615c76565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d8e57615d8e615874565b029392505050565b6000610bec8383615cd7565b805169ffffffffffffffffffff8116811461456357600080fd5b600080600080600060a08688031215615dd457600080fd5b615ddd86615da2565b9450602086015193506040860151925060608601519150615e0060808701615da2565b90509295509295909350565b600060208284031215615e1e57600080fd5b8151610bec8161571b565b600060408284031215615e3b57600080fd5b615e4361476e565b615e4c8361453f565b8152602083013560208201528091505092915050565b63ffffffff81811683821601908082111561449157614491615874565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"priceUpdaters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"FEE_BASE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyFeeTokensUpdates\",\"inputs\":[{\"name\":\"feeTokensToRemove\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokensToAdd\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"inputs\":[{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyTokenTransferFeeConfigUpdates\",\"inputs\":[{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertTokenAmount\",\"inputs\":[{\"name\":\"fromToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fromTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"toToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestinationChainGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeTokens\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPremiumMultiplierWeiPerEth\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenAndGasPrices\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"tokenPrice\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"gasPriceValue\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPriceFeedConfig\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrices\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onReport\",\"inputs\":[{\"name\":\"metadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessageArgs\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"convertedExtraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setReportPermissions\",\"inputs\":[{\"name\":\"permissions\",\"type\":\"tuple[]\",\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updatePrices\",\"inputs\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateTokenPriceFeeds\",\"inputs\":[{\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenAdded\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenRemoved\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PriceFeedPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"priceFeedConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReportPermissionSet\",\"inputs\":[{\"name\":\"reportId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"permission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigDeleted\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerUnitGasUpdated\",\"inputs\":[{\"name\":\"destChain\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DataFeedValueOutOfUint224Range\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DestinationChainNotEnabled\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeTokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidDestBytesOverhead\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidEVMAddress\",\"inputs\":[{\"name\":\"encodedAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsTag\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeRange\",\"inputs\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStaticConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageFeeTooHigh\",\"inputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MessageGasLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageTooLarge\",\"inputs\":[{\"name\":\"maxSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actualSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReportForwarderUnauthorized\",\"inputs\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"}]},{\"type\":\"error\",\"name\":\"SourceTokenDataTooLarge\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StaleGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timePassed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedNumberOfTokens\",\"inputs\":[{\"name\":\"numberOfTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x60e060405234610fed57617375803803806100198161125f565b9283398101908082036101208112610fed57606013610fed5761003a611221565b81516001600160601b0381168103610fed57815261005a60208301611284565b906020810191825261006e60408401611298565b6040820190815260608401516001600160401b038111610fed57856100949186016112c0565b60808501519094906001600160401b038111610fed57866100b69183016112c0565b60a08201519096906001600160401b038111610fed5782019181601f84011215610fed5782516100ed6100e8826112a9565b61125f565b9360208086848152019260071b82010190848211610fed57602001915b8183106111a65750505060c08101516001600160401b038111610fed5781019782601f8a011215610fed578851986101446100e88b6112a9565b996020808c838152019160051b83010191858311610fed5760208101915b838310611044575050505060e08201516001600160401b038111610fed5782019183601f84011215610fed57825161019c6100e8826112a9565b9360208086848152019260061b82010190868211610fed57602001915b81831061100857505050610100810151906001600160401b038211610fed570183601f82011215610fed578051906101f36100e8836112a9565b946020610240818886815201940283010191818311610fed57602001925b828410610e5157505050503315610e4057600180546001600160a01b031916331790556020986102408a61125f565b97600089526000368137610252611240565b998a52888b8b015260005b89518110156102c4576001906001600160a01b0361027b828d61134b565b51168d61028782611537565b610294575b50500161025d565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1388d61028c565b508a985089519660005b885181101561033f576001600160a01b036102e9828b61134b565b511690811561032e577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef8c836103206001956114bf565b50604051908152a1016102ce565b6342bcdf7f60e11b60005260046000fd5b5089959697508860018060a01b03835116158015610e2e575b8015610e1f575b610e0e5791516001600160a01b031660a05290516001600160601b03166080525163ffffffff1660c0526103928461125f565b9360008552600036813760005b855181101561040e576001906103c76001600160a01b036103c0838a61134b565b51166113cc565b6103d2575b0161039f565b818060a01b036103e2828961134b565b51167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26103cc565b508694508560005b84518110156104855760019061043e6001600160a01b03610437838961134b565b51166114fe565b610449575b01610416565b818060a01b03610459828861134b565b51167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2610443565b508593508460005b855181101561054757806104a36001928861134b565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf606087858060a01b03845116930151836000526007895260406000209060ff878060a01b038251169283898060a01b03198254161781558b8301908151604082549501948460a81b8651151560a81b16918560a01b9060a01b169061ffff60a01b19161717905560405193845251168a8301525115156040820152a20161048d565b50828460005b8451811015610ab957610560818661134b565b51836001600160401b03610574848961134b565b5151169101519080158015610aa6575b8015610a86575b8015610a68575b610a54579081600193926000526009865263ffffffff60e01b846040600020015460381b161560001461090957807f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626560405180610702868291909161020061022082019380511515835261ffff602082015116602084015263ffffffff604082015116604084015263ffffffff606082015116606084015263ffffffff608082015116608084015261ffff60a08201511660a084015263ffffffff60c08201511660c084015261ffff60e08201511660e084015261ffff6101008201511661010084015261ffff6101208201511661012084015263ffffffff6101408201511661014084015263ffffffff6101608201511661016084015260018060401b036101808201511661018084015263ffffffff6101a0820151166101a084015263ffffffff6101c0820151166101c08401526101e081015115156101e08401528163ffffffff60e01b91015116910152565b0390a25b600052600985528260406000208251151581549062ffff008986015160081b169166ffffffff000000604087015160181b166affffffff00000000000000606088015160381b16906effffffff0000000000000000000000608089015160581b169361ffff60781b60a08a015160781b169163ffffffff60881b60c08b015160881b169061ffff60a81b60e08c015160a81b169361ffff60b81b6101008d015160b81b16968c61012061ffff60c81b91015160c81b16988d61014063ffffffff60d81b91015160d81b169a63ffffffff60d81b199861ffff60c81b199761ffff60b81b199661ffff60a81b199563ffffffff60881b199461ffff60781b19936effffffff0000000000000000000000199260ff6affffffff000000000000001992169066ffffffffffffff1916171617161716171617161716171617161717178155019063ffffffff80610160830151161663ffffffff198354161782556101808101519082546fffffffff0000000000000000000000006101a083015160601b169063ffffffff60801b6101c084015160801b16916101e0840151151560a01b9363ffffffff60a81b9061020063ffffffff60a81b91015160381c16169463ffffffff60a81b199260ff60a01b19916401000000008b60601b03908d1b16906401000000008b60a01b03191617161716179060ff60a01b16171790550161054d565b807f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83560405180610a4c868291909161020061022082019380511515835261ffff602082015116602084015263ffffffff604082015116604084015263ffffffff606082015116606084015263ffffffff608082015116608084015261ffff60a08201511660a084015263ffffffff60c08201511660c084015261ffff60e08201511660e084015261ffff6101008201511661010084015261ffff6101208201511661012084015263ffffffff6101408201511661014084015263ffffffff6101608201511661016084015260018060401b036101808201511661018084015263ffffffff6101a0820151166101a084015263ffffffff6101c0820151166101c08401526101e081015115156101e08401528163ffffffff60e01b91015116910152565b0390a2610706565b63c35aa79d60e01b60005260045260246000fd5b5063ffffffff6101608301511663ffffffff60608401511610610592565b506102008201516001600160e01b031916630a04b54b60e21b141561058b565b5063ffffffff6101608301511615610584565b508260005b8151811015610b3e576001906001600160a01b03610adc828561134b565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d86848060401b0381610b12868961134b565b510151168360005260088252604060002081878060401b0319825416179055604051908152a201610abe565b50506001610b4b8361125f565b9160008352600091610e09575b81925b8151841015610d4757610b6e848361134b565b5180516001600160401b0316929086019190845b8784518051831015610d365782610b989161134b565b51015184516001600160a01b0390610bb190849061134b565b5151169063ffffffff8151168a82019063ffffffff8251169081811015610d21575050608082019063ffffffff8251168c8110610d0a57507f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b560c08d8098979563ffffffff600198968f8f9761ffff6040838b879552600a89528181208f808f9160a01b0316825289522091838751169784891685198554161784558482519285549560408b019469ffff0000000000000000865160401b169b60608101986dffffffff000000000000000000008a5160501b169060a08d8860701b905160701b1693019e8f60ff60901b9051151560901b169460ff60901b199267ffffffff000000008a60701b19928c1b169060016401000000009060701b0319161716171617171790556040519a8b5251169089015251166040870152511660608501525116608083015251151560a0820152a301909150610b82565b6312766e0160e11b8b52600485905260245260448afd5b6305a7b3d160e11b8b52600452602452604489fd5b505050925093600191500192610b5b565b905083825b8251811015610dca576001906001600160401b03610d6a828661134b565b515116828060a01b0384610d7e848861134b565b5101511690808752600a855260408720848060a01b038316885285528660408120557f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b8780a301610d4c565b604051615da990816115cc82396080518181816104d4015261312d015260a05181818161051701526130c4015260c05181818161053e0152613ddc0152f35b610b58565b63d794ef9560e01b60005260046000fd5b5063ffffffff8251161561035f565b5080516001600160601b031615610358565b639b15e16f60e01b60005260046000fd5b8382036102408112610fed57610220610e68611240565b91610e7287611328565b8352601f190112610fed576040519161022083016001600160401b03811184821017610ff257604052610ea76020870161131b565b8352610eb56040870161133c565b6020840152610ec660608701611298565b6040840152610ed760808701611298565b6060840152610ee860a08701611298565b6080840152610ef960c0870161133c565b60a0840152610f0a60e08701611298565b60c0840152610f1c610100870161133c565b60e0840152610f2e610120870161133c565b610100840152610f41610140870161133c565b610120840152610f546101608701611298565b610140840152610f676101808701611298565b610160840152610f7a6101a08701611328565b610180840152610f8d6101c08701611298565b6101a0840152610fa06101e08701611298565b6101c0840152610fb3610200870161131b565b6101e0840152610220860151916001600160e01b031983168303610fed578360209361020061024096015283820152815201930192610211565b600080fd5b634e487b7160e01b600052604160045260246000fd5b604083880312610fed57602060409161101f611240565b61102886611284565b8152611035838701611328565b838201528152019201916101b9565b82516001600160401b038111610fed5782016040818903601f190112610fed5761106c611240565b9061107960208201611328565b825260408101516001600160401b038111610fed57602091010188601f82011215610fed5780516110ac6100e8826112a9565b91602060e08185858152019302820101908b8211610fed57602001915b8183106110e85750505091816020938480940152815201920191610162565b828c0360e08112610fed5760c06110fd611240565b9161110786611284565b8352601f190112610fed576040519160c08301916001600160401b03831184841017610ff25760e093602093604052611141848801611298565b815261114f60408801611298565b8482015261115f6060880161133c565b604082015261117060808801611298565b606082015261118160a08801611298565b608082015261119260c0880161131b565b60a0820152838201528152019201916110c9565b82850360808112610fed5760606111bb611240565b916111c586611284565b8352601f190112610fed576111d8611221565b916111e560208601611284565b835260408501519160ff83168303610fed578360209384608096015261120d6060880161131b565b60408201528382015281520192019161010a565b60405190606082016001600160401b03811183821017610ff257604052565b60408051919082016001600160401b03811183821017610ff257604052565b6040519190601f01601f191682016001600160401b03811183821017610ff257604052565b51906001600160a01b0382168203610fed57565b519063ffffffff82168203610fed57565b6001600160401b038111610ff25760051b60200190565b9080601f83011215610fed5781516112da6100e8826112a9565b9260208085848152019260051b820101928311610fed57602001905b8282106113035750505090565b6020809161131084611284565b8152019101906112f6565b51908115158203610fed57565b51906001600160401b0382168203610fed57565b519061ffff82168203610fed57565b805182101561135f5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561135f5760005260206000200190600090565b805480156113b65760001901906113a48282611375565b8154906000199060031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b6000818152600c6020526040902054801561148d57600019810181811161147757600b5460001981019190821161147757818103611426575b505050611412600b61138d565b600052600c60205260006040812055600190565b61145f61143761144893600b611375565b90549060031b1c928392600b611375565b819391549060031b91821b91600019901b19161790565b9055600052600c602052604060002055388080611405565b634e487b7160e01b600052601160045260246000fd5b5050600090565b80549068010000000000000000821015610ff257816114489160016114bb94018155611375565b9055565b806000526003602052604060002054156000146114f8576114e1816002611494565b600254906000526003602052604060002055600190565b50600090565b80600052600c602052604060002054156000146114f85761152081600b611494565b600b5490600052600c602052604060002055600190565b600081815260036020526040902054801561148d5760001981018181116114775760025460001981019190821161147757808203611591575b50505061157d600261138d565b600052600360205260006040812055600190565b6115b36115a2611448936002611375565b90549060031b1c9283926002611375565b9055600052600360205260406000205538808061157056fe6080604052600436101561001257600080fd5b60003560e01c806241e5be1461020657806301ffc9a714610201578063061877e3146101fc57806306285c69146101f7578063181f5a77146101f25780632451a627146101ed578063325c868e146101e85780633937306f146101e357806341ed29e7146101de578063430d138c146101d957806345ac924d146101d45780634ab35b0b146101cf578063514e8cff146101ca5780636cb5f3dd146101c55780636def4ce7146101c0578063770e2dc4146101bb57806379ba5097146101b65780637afac322146101b1578063805f2132146101ac57806382b49eb0146101a75780638da5cb5b146101a257806391a2749a1461019d578063a69c64c014610198578063bf78e03f14610193578063cdc73d511461018e578063d02641a014610189578063d63d3af214610184578063d8694ccd1461017f578063f2fde38b1461017a578063fbe3f778146101755763ffdb4b371461017057600080fd5b612bf2565b612ab9565b6129ba565b61258d565b612553565b6124d7565b612442565b612357565b612280565b6121b0565b61215e565b611fcc565b611c8b565b611b1a565b6119ca565b61176f565b611600565b61129a565b6111ab565b611140565b61103b565b610edb565b610c44565b610885565b61084b565b6107aa565b6106d9565b61047a565b610407565b6102c5565b61023b565b73ffffffffffffffffffffffffffffffffffffffff81160361022957565b600080fd5b35906102398261020b565b565b346102295760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261022957602061029060043561027b8161020b565b6024356044359161028b8361020b565b612da7565b604051908152f35b35907fffffffff000000000000000000000000000000000000000000000000000000008216820361022957565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610229576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610229577fffffffff00000000000000000000000000000000000000000000000000000000602091167f805f21320000000000000000000000000000000000000000000000000000000081149081156103dd575b81156103b3575b8115610389575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150143861037e565b7f181f5a770000000000000000000000000000000000000000000000000000000081149150610377565b7f9b645f410000000000000000000000000000000000000000000000000000000081149150610370565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295773ffffffffffffffffffffffffffffffffffffffff6004356104578161020b565b166000526008602052602067ffffffffffffffff60406000205416604051908152f35b346102295760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610229576104b1612df0565b5060606040516104c0816105a5565b63ffffffff6bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169182815273ffffffffffffffffffffffffffffffffffffffff60406020830192827f00000000000000000000000000000000000000000000000000000000000000001684520191837f00000000000000000000000000000000000000000000000000000000000000001683526040519485525116602084015251166040820152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176105c157604052565b610576565b60a0810190811067ffffffffffffffff8211176105c157604052565b6040810190811067ffffffffffffffff8211176105c157604052565b60c0810190811067ffffffffffffffff8211176105c157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105c157604052565b6040519061023960408361061a565b604051906102396102208361061a565b919082519283825260005b8481106106c45750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610685565b346102295760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261022957610756604080519061071a818361061a565b601382527f46656551756f74657220312e362e302d6465760000000000000000000000000060208301525191829160208352602083019061067a565b0390f35b602060408183019282815284518094520192019060005b81811061077e5750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101610771565b346102295760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b81811061083557610756856108298187038261061a565b6040519182918261075a565b8254845260209093019260019283019201610812565b346102295760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261022957602060405160248152f35b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff811161022957806004019060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610229576108ff614180565b6109098280612e0f565b4263ffffffff1692915060005b818110610ae35750506024019061092d8284612e0f565b92905060005b83811061093c57005b8061095b610956600193610950868a612e0f565b90612e92565b612f07565b7fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e67ffffffffffffffff610aaa610a876020850194610a796109b987517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b6109e86109c461065b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092168252565b63ffffffff8c166020820152610a23610a09845167ffffffffffffffff1690565b67ffffffffffffffff166000526005602052604060002090565b815160209092015160e01b7fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5167ffffffffffffffff1690565b93517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290921682524260208301529190931692a201610933565b80610afc610af76001936109508980612e0f565b612ed0565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a73ffffffffffffffffffffffffffffffffffffffff610bde610a876020850194610bc4610b6687517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b610b716109c461065b565b63ffffffff8d166020820152610a23610b9e845173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166000526006602052604060002090565b5173ffffffffffffffffffffffffffffffffffffffff1690565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290921682524260208301529190931692a201610916565b67ffffffffffffffff81116105c15760051b60200190565b8015150361022957565b359061023982610c2f565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff8111610229573660238201121561022957806004013590610c9f82610c17565b90610cad604051928361061a565b828252602460a06020840194028201019036821161022957602401925b818410610cdc57610cda83612f2c565b005b60a0843603126102295760405190610cf3826105c6565b8435610cfe8161020b565b825260208501357fffffffffffffffffffff00000000000000000000000000000000000000000000811681036102295760208301526040850135907fffff000000000000000000000000000000000000000000000000000000000000821682036102295782602092604060a0950152610d796060880161022e565b6060820152610d8a60808801610c39565b6080820152815201930192610cca565b6004359067ffffffffffffffff8216820361022957565b6024359067ffffffffffffffff8216820361022957565b359067ffffffffffffffff8216820361022957565b9181601f840112156102295782359167ffffffffffffffff8311610229576020838186019501011161022957565b9181601f840112156102295782359167ffffffffffffffff8311610229576020808501948460051b01011161022957565b929091610e5d9284521515602084015260806040840152608083019061067a565b906060818303910152815180825260208201916020808360051b8301019401926000915b838310610e9057505050505090565b9091929394602080610ecc837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08660019603018752895161067a565b97019301930191939290610e81565b346102295760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261022957610f12610d9a565b60243590610f1f8261020b565b60443560643567ffffffffffffffff811161022957610f42903690600401610ddd565b60849391933567ffffffffffffffff811161022957610f65903690600401610e0b565b9160a4359567ffffffffffffffff871161022957366023880112156102295786600401359567ffffffffffffffff8711610229573660248860061b8a01011161022957610756986024610fb99901966130b8565b9060409492945194859485610e3c565b602060408183019282815284518094520192019060005b818110610fed5750505090565b9091926020604082611030600194885163ffffffff602080927bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8151168552015116910152565b019401929101610fe0565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff81116102295761108a903690600401610e0b565b61109381610c17565b916110a1604051938461061a565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06110ce83610c17565b0160005b81811061112957505060005b8281101561111b576001906110ff6110fa8260051b8501613208565b613d7b565b61110982876130a4565b5261111481866130a4565b50016110de565b604051806107568682610fc9565b6020906111346131ef565b828288010152016110d2565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760206111856004356111808161020b565b6140d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff60405191168152f35b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295767ffffffffffffffff6111eb610d9a565b6111f36131ef565b5016600052600560205260406000206040519061120f826105e2565b547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116825260e01c6020820152604051809161075682604081019263ffffffff602080927bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8151168552015116910152565b359061ffff8216820361022957565b359063ffffffff8216820361022957565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff81116102295736602382011215610229578060040135906112f582610c17565b90611303604051928361061a565b82825260246102406020840194028201019036821161022957602401925b81841061133157610cda8361324c565b8336036102408112610229576102207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06040519261136e846105e2565b61137788610dc8565b84520112610229576102409160209161138e61066a565b611399848901610c39565b81526113a76040890161127a565b848201526113b760608901611289565b60408201526113c860808901611289565b60608201526113d960a08901611289565b60808201526113ea60c0890161127a565b60a08201526113fb60e08901611289565b60c082015261140d610100890161127a565b60e082015261141f610120890161127a565b610100820152611432610140890161127a565b6101208201526114456101608901611289565b6101408201526114586101808901611289565b61016082015261146b6101a08901610dc8565b61018082015261147e6101c08901611289565b6101a08201526114916101e08901611289565b6101c08201526114a46102008901610c39565b6101e08201526114b76102208901610298565b61020082015283820152815201930192611321565b61023990929192610200806102208301956114e984825115159052565b60208181015161ffff169085015260408181015163ffffffff169085015260608181015163ffffffff169085015260808181015163ffffffff169085015260a08181015161ffff169085015260c08181015163ffffffff169085015260e08181015161ffff16908501526101008181015161ffff16908501526101208181015161ffff16908501526101408181015163ffffffff16908501526101608181015163ffffffff16908501526101808181015167ffffffffffffffff16908501526101a08181015163ffffffff16908501526101c08181015163ffffffff16908501526101e08181015115159085015201517fffffffff0000000000000000000000000000000000000000000000000000000016910152565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610229576107566116d36116ce611640610d9a565b600061020061164d61066a565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e0820152015267ffffffffffffffff166000526009602052604060002090565b6134bc565b604051918291826114cc565b81601f82011215610229578035906116f682610c17565b92611704604051948561061a565b82845260208085019360061b8301019181831161022957602001925b82841061172e575050505090565b6040848303126102295760206040918251611748816105e2565b61175187610dc8565b8152828701356117608161020b565b83820152815201930192611720565b346102295760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff811161022957366023820112156102295780600401356117c981610c17565b916117d7604051938461061a565b8183526024602084019260051b820101903682116102295760248101925b828410611826576024358567ffffffffffffffff821161022957611820610cda9236906004016116df565b90613638565b833567ffffffffffffffff811161022957820160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82360301126102295760405190611872826105e2565b61187e60248201610dc8565b8252604481013567ffffffffffffffff811161022957602491010136601f820112156102295780356118af81610c17565b916118bd604051938461061a565b818352602060e081850193028201019036821161022957602001915b8183106118f857505050918160209384809401528152019301926117f5565b82360360e081126102295760c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060405192611933846105e2565b863561193e8161020b565b845201126102295760e091602091604051611958816105fe565b611963848801611289565b815261197160408801611289565b848201526119816060880161127a565b604082015261199260808801611289565b60608201526119a360a08801611289565b608082015260c08701356119b681610c2f565b60a0820152838201528152019201916118d9565b346102295760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760005473ffffffffffffffffffffffffffffffffffffffff81163303611a89577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b9080601f83011215610229578135611aca81610c17565b92611ad8604051948561061a565b81845260208085019260051b82010192831161022957602001905b828210611b005750505090565b602080918335611b0f8161020b565b815201910190611af3565b346102295760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff811161022957611b69903690600401611ab3565b60243567ffffffffffffffff811161022957611b89903690600401611ab3565b90611b926141c4565b60005b8151811015611c0e5780611bb6611bb1610bc4600194866130a4565b61599e565b611bc1575b01611b95565b73ffffffffffffffffffffffffffffffffffffffff611be3610bc483866130a4565b167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a2611bbb565b8260005b8151811015610cda5780611c33611c2e610bc4600194866130a4565b6159bf565b611c3e575b01611c12565b73ffffffffffffffffffffffffffffffffffffffff611c60610bc483866130a4565b167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2611c38565b346102295760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff811161022957611cda903690600401610ddd565b6024359167ffffffffffffffff831161022957611d33611d2b611d11611d07611d3b963690600401610ddd565b9490953691613931565b90604082015190605e604a84015160601c93015191929190565b919033614e61565b810190613996565b60005b8151811015610cda57611da0611d9b611d75611d5a84866130a4565b515173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166000526007602052604060002090565b613a55565b611db4611db06040830151151590565b1590565b611f765790611e29611dcc6020600194015160ff1690565b611e23611e026020611dde86896130a4565b5101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b90614f40565b611e446040611e3884876130a4565b51015163ffffffff1690565b63ffffffff611e6f611e66611e5f610b9e611d5a888b6130a4565b5460e01c90565b63ffffffff1690565b911610611f7057611ed2611e886040611e3885886130a4565b611ec2611e9361065b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff851681529163ffffffff166020830152565b610a23610b9e611d5a86896130a4565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a73ffffffffffffffffffffffffffffffffffffffff611f15611d5a85886130a4565b611f66611f276040611e38888b6130a4565b60405193849316958390929163ffffffff6020917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b0390a25b01611d3e565b50611f6a565b611fc8611f86611d5a84866130a4565b7f06439c6b0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff16600452602490565b6000fd5b346102295760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295761075661207f612009610d9a565b67ffffffffffffffff6024359161201f8361020b565b600060a060405161202f816105fe565b828152826020820152826040820152826060820152826080820152015216600052600a60205260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6120fb6120f260405192612092846105fe565b5463ffffffff8116845263ffffffff8160201c16602085015261ffff8160401c1660408501526120d96120cc8263ffffffff9060501c1690565b63ffffffff166060860152565b63ffffffff607082901c16608085015260901c60ff1690565b151560a0830152565b6040519182918291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b346102295760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261022957602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff81116102295760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261022957604051612229816105e2565b816004013567ffffffffffffffff81116102295761224d9060043691850101611ab3565b8152602482013567ffffffffffffffff811161022957610cda9260046122769236920101611ab3565b6020820152613af2565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff81116102295736602382011215610229578060040135906122db82610c17565b906122e9604051928361061a565b8282526024602083019360061b8201019036821161022957602401925b81841061231657610cda83613c92565b6040843603126102295760206040918251612330816105e2565b863561233b8161020b565b8152612348838801610dc8565b83820152815201930192612306565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295773ffffffffffffffffffffffffffffffffffffffff6004356123a78161020b565b6123af612df0565b50166000526007602052610756604060002060ff604051916123d0836105a5565b5473ffffffffffffffffffffffffffffffffffffffff81168352818160a01c16602084015260a81c161515604082015260405191829182919091604080606083019473ffffffffffffffffffffffffffffffffffffffff815116845260ff602082015116602085015201511515910152565b346102295760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261022957604051806020600b54918281520190600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99060005b8181106124c157610756856108298187038261061a565b82548452602090930192600192830192016124aa565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760406125176004356110fa8161020b565b6125518251809263ffffffff602080927bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8151168552015116910152565bf35b346102295760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261022957602060405160128152f35b346102295760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610229576125c4610d9a565b6024359067ffffffffffffffff821161022957816004019060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8436030112610229576126296116ce8267ffffffffffffffff166000526009602052604060002090565b91612637611db08451151590565b61298257606484019061267b611db061264f84613208565b73ffffffffffffffffffffffffffffffffffffffff166000526001600b01602052604060002054151590565b61293457604485019361268e8583612e0f565b94905060248701966126c16126a38986613ecb565b9050876126ba6126b38880613ecb565b3691613931565b918661526a565b6126cd61118086613208565b966126e96126e36101c086015163ffffffff1690565b8461532a565b92600080891561290c57505090612717918961270e6127078a613208565b9389612e0f565b93909288615477565b9591955b60009861ffff61273161010089015161ffff1690565b166128a5575b5088612888896128888a8f8f9861287a61285461284e8f6107569f6128959f6101807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f61288d9f936dffffffffffffffffffffffffffff61282a61284195612823896128009f6128419f60846128156128319a63ffffffff6128009f85826128068a6128006127f960a06127ef61280d9861281d9f6127e589916127df60808a015163ffffffff1690565b9b613ecb565b9290501690613f1c565b93015161ffff1690565b61ffff1690565b90612d5b565b9116613f1c565b911690613f1c565b950190613ecb565b90615795565b5190613f1c565b9116612d5b565b93015167ffffffffffffffff1690565b67ffffffffffffffff1690565b96613208565b73ffffffffffffffffffffffffffffffffffffffff166000526008602052604060002090565b5467ffffffffffffffff1690565b613f1c565b911690612d6e565b6040519081529081906020820190565b8597929a9950928181999594889d9897936128d289956dffffffffffffffffffffffffffff9060701c1690565b6dffffffffffffffffffffffffffff16916128ed8b86613ecb565b90506128f993876156f4565b9a9b9398965091509293979a959a612737565b915095915061292e612929611e666101a088015163ffffffff1690565b612d14565b9561271b565b611fc861294083613208565b7f2502348c0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff16600452602490565b7f99ac52f20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff821660045260246000fd5b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295773ffffffffffffffffffffffffffffffffffffffff600435612a0a8161020b565b612a126141c4565b16338114612a8457807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b60ff81160361022957565b346102295760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102295760043567ffffffffffffffff8111610229573660238201121561022957806004013590612b1482610c17565b90612b22604051928361061a565b8282526024602083019360071b8201019036821161022957602401925b818410612b4f57610cda83613f29565b833603608081126102295760607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060405192612b8a846105e2565b8735612b958161020b565b8452011261022957608091602091604051612baf816105a5565b83880135612bbc8161020b565b81526040880135612bcc81612aae565b848201526060880135612bde81610c2f565b604082015283820152815201930192612b3f565b346102295760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261022957600435612c2d8161020b565b612c35610db1565b9067ffffffffffffffff82169182600052600960205260ff6040600020541615612cb757612c65612c86926140d1565b92600052600960205263ffffffff60016040600020015460801c169061532a565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152f35b827f99ac52f20000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90662386f26fc10000820291808304662386f26fc100001490151715612d3657565b612ce5565b90655af3107a4000820291808304655af3107a40001490151715612d3657565b81810292918115918404141715612d3657565b8115612d78570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b612de6612de0612ded94937bffffffffffffffffffffffffffffffffffffffffffffffffffffffff612dd981956140d1565b1690612d5b565b926140d1565b1690612d6e565b90565b60405190612dfd826105a5565b60006040838281528260208201520152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610229570180359067ffffffffffffffff821161022957602001918160061b3603831361022957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015612ea25760061b0190565b612e63565b35907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361022957565b60408136031261022957612eff602060405192612eec846105e2565b8035612ef78161020b565b845201612ea7565b602082015290565b60408136031261022957612eff602060405192612f23846105e2565b612ef781610dc8565b90612f356141c4565b60005b825181101561309f5780612f4e600192856130a4565b517f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a360a073ffffffffffffffffffffffffffffffffffffffff83511692606081019373ffffffffffffffffffffffffffffffffffffffff80865116957fffff00000000000000000000000000000000000000000000000000000000000061300660208601947fffffffffffffffffffff00000000000000000000000000000000000000000000865116604088019a848c51169261583d565b977fffffffffffffffffffff000000000000000000000000000000000000000000006080870195613072875115158c600052600460205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b8560405198511688525116602087015251166040850152511660608301525115156080820152a201612f38565b509050565b8051821015612ea25760209160051b010190565b989592919097949693977f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8216146000146131df575050965b6bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168089116131ae5750916131936131a194926131a7969463ffffffff8060016131898f67ffffffffffffffff166000526009602052604060002090565b01541616916142e8565b9660208801511515996144b0565b926146c4565b9293929190565b887f6a92a4830000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b916131e992612da7565b9661311e565b604051906131fc826105e2565b60006020838281520152565b35612ded8161020b565b9060405161321f816105e2565b91547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835260e01c6020830152565b906132556141c4565b60005b825181101561309f5761326b81846130a4565b51602061328a61327b84876130a4565b515167ffffffffffffffff1690565b9101519067ffffffffffffffff81168015801561349d575b8015613424575b80156133f6575b6133be5791613384826001959461333461330f886132e56133899867ffffffffffffffff166000526009602052604060002090565b015460381b7fffffffff000000000000000000000000000000000000000000000000000000001690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61338f577f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda462656040518061336787826114cc565b0390a267ffffffffffffffff166000526009602052604060002090565b614712565b01613258565b7f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a8356040518061336787826114cc565b7fc35aa79d0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff821660045260246000fd5b5061016083015163ffffffff1663ffffffff61341c611e66606087015163ffffffff1690565b9116116132b0565b507f2812d52c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000006134956102008601517fffffffff000000000000000000000000000000000000000000000000000000001690565b1614156132a9565b5063ffffffff6134b561016085015163ffffffff1690565b16156132a2565b9061023961360e60016134cd61066a565b9461358b61357d82546134e96134e38260ff1690565b15158a52565b61ffff600882901c1660208a015263ffffffff601882901c1660408a015263ffffffff603882901c1660608a015263ffffffff605882901c1660808a015261ffff607882901c1660a08a015263ffffffff608882901c1660c08a015261ffff60a882901c1660e08a015261ffff60b882901c166101008a015261ffff60c882901c166101208a015260d81c63ffffffff1690565b63ffffffff16610140880152565b015463ffffffff811661016086015267ffffffffffffffff602082901c1661018086015263ffffffff606082901c166101a086015263ffffffff608082901c166101c08601526135e660a082901c60ff1615156101e0870152565b60381b7fffffffff000000000000000000000000000000000000000000000000000000001690565b7fffffffff0000000000000000000000000000000000000000000000000000000016610200840152565b906136416141c4565b6000915b80518310156138725761365883826130a4565b519061366c825167ffffffffffffffff1690565b946020600093019367ffffffffffffffff8716935b8551805182101561385d57613698826020926130a4565b5101516136a9611d5a8389516130a4565b8151602083015163ffffffff908116911681811015613824575050608082015163ffffffff16602081106137d6575090867f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b573ffffffffffffffffffffffffffffffffffffffff84613765858f6001999861373b6137609267ffffffffffffffff16600052600a602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b614cd7565b6137cd60405192839216958291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b0390a301613681565b7f24ecdc020000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff90911660045263ffffffff1660245260446000fd5b7f0b4f67a20000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b50509550925092600191500191929092613645565b50905060005b815181101561392d578061389161327b600193856130a4565b67ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff6138da60206138be86896130a4565b51015173ffffffffffffffffffffffffffffffffffffffff1690565b60006138fe8261373b8767ffffffffffffffff16600052600a602052604060002090565b551691167f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b600080a301613878565b5050565b92919267ffffffffffffffff82116105c15760405191613979601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018461061a565b829481845281830111610229578281602093846000960137010152565b6020818303126102295780359067ffffffffffffffff8211610229570181601f82011215610229578035906139ca82610c17565b926139d8604051948561061a565b8284526020606081860194028301019181831161022957602001925b828410613a02575050505090565b606084830312610229576020606091604051613a1d816105a5565b8635613a288161020b565b8152613a35838801612ea7565b83820152613a4560408801611289565b60408201528152019301926139f4565b90604051613a62816105a5565b604060ff82945473ffffffffffffffffffffffffffffffffffffffff81168452818160a01c16602085015260a81c161515910152565b90610239604051613aa8816105fe565b925463ffffffff8082168552602082811c821690860152604082811c61ffff1690860152605082901c81166060860152607082901c16608085015260901c60ff16151560a0840152565b613afa6141c4565b60208101519160005b8351811015613bae5780613b1c610bc4600193876130a4565b613b58613b5373ffffffffffffffffffffffffffffffffffffffff83165b73ffffffffffffffffffffffffffffffffffffffff1690565b615cd5565b613b64575b5001613b03565b60405173ffffffffffffffffffffffffffffffffffffffff9190911681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758090602090a138613b5d565b5091505160005b815181101561392d57613bcb610bc482846130a4565b9073ffffffffffffffffffffffffffffffffffffffff821615613c68577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef613c5f83613c37613c32613b3a60019773ffffffffffffffffffffffffffffffffffffffff1690565b615c5c565b5060405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390a101613bb5565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b613c9a6141c4565b60005b815181101561392d578073ffffffffffffffffffffffffffffffffffffffff613cc8600193856130a4565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d613d6567ffffffffffffffff6020613d0486896130a4565b51015116836000526008602052604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790556040519182918291909167ffffffffffffffff6020820193169052565b0390a201613c9d565b91908203918211612d3657565b613d836131ef565b50613db6613db18273ffffffffffffffffffffffffffffffffffffffff166000526006602052604060002090565b613212565b6020810191613dd5613dcf611e66855163ffffffff1690565b42613d6e565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001611613e8a57611d9b613e2e9173ffffffffffffffffffffffffffffffffffffffff166000526007602052604060002090565b613e3e611db06040830151151590565b8015613e90575b613e8a57613e52906150e1565b9163ffffffff613e7a611e66613e6f602087015163ffffffff1690565b935163ffffffff1690565b911610613e85575090565b905090565b50905090565b5073ffffffffffffffffffffffffffffffffffffffff613ec4825173ffffffffffffffffffffffffffffffffffffffff1690565b1615613e45565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610229570180359067ffffffffffffffff82116102295760200191813603831361022957565b91908201809211612d3657565b90613f326141c4565b60005b825181101561309f5780613f4b600192856130a4565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf6140c8602073ffffffffffffffffffffffffffffffffffffffff8451169301518360005260076020526040600020613ff773ffffffffffffffffffffffffffffffffffffffff835116829073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b602082015181547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1660a09190911b74ff000000000000000000000000000000000000000016177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff75ff0000000000000000000000000000000000000000006040850151151560a81b16911617905560405191829182919091604080606083019473ffffffffffffffffffffffffffffffffffffffff815116845260ff602082015116602085015201511515910152565b0390a201613f35565b6140da81613d7b565b9063ffffffff602083015116158015614159575b6141155750517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff907f06439c6b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff825116156140ee565b3360005260036020526040600020541561419657565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff6001541633036141e557565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b919091357fffffffff0000000000000000000000000000000000000000000000000000000081169260048110614243575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b909291928360041161022957831161022957600401917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0190565b90816020910312610229575190565b90816040910312610229576020604051916142d9836105e2565b805183520151612eff81610c2f565b916142f16131ef565b5081156143e757506143326126b3828061432c7fffffffff00000000000000000000000000000000000000000000000000000000958761420f565b95614275565b91167f181dcf1000000000000000000000000000000000000000000000000000000000810361436f575080602080612ded935183010191016142bf565b7f97a657c900000000000000000000000000000000000000000000000000000000146143bf577f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b806020806143d2935183010191016142b0565b6143da61065b565b9081526000602082015290565b91505067ffffffffffffffff6143fb61065b565b911681526000602082015290565b9061441382610c17565b614420604051918261061a565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061444e8294610c17565b019060005b82811061445f57505050565b806060602080938501015201614453565b9190811015612ea25760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6181360301821215610229570190565b9092916144d660016132e58467ffffffffffffffff166000526009602052604060002090565b906144e081614409565b9560005b8281106144f5575050505050505090565b614508614503828489612e92565b613208565b8388614522614518858484614470565b6040810190613ecb565b90506020811161463c575b50839261455c6145566126b361454c60019861457f9761457a97614470565b6020810190613ecb565b896158ce565b61373b8967ffffffffffffffff16600052600a602052604060002090565b613a98565b60a081015115614602576145e66145a060606145ba93015163ffffffff1690565b6040805163ffffffff909216602083015290928391820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261061a565b6145f0828b6130a4565b526145fb818a6130a4565b50016144e4565b506145ba6145e661463761462a8967ffffffffffffffff166000526009602052604060002090565b5460d81c63ffffffff1690565b6145a0565b915050614674611e666146678461373b8b67ffffffffffffffff16600052600a602052604060002090565b5460701c63ffffffff1690565b106146815783883861452d565b7f36f536ca0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff1660045260246000fd5b6020604051917f181dcf1000000000000000000000000000000000000000000000000000000000828401528051602484015201511515604482015260448152612ded60648261061a565b9055565b90614c8d61020060016102399461475d61472c8651151590565b829060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6147a361476f602087015161ffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff1660089190911b62ffff0016178255565b6147ef6147b7604087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff1660189190911b66ffffffff00000016178255565b61483f614803606087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff1660389190911b6affffffff0000000000000016178255565b614893614853608087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff1660589190911b6effffffff000000000000000000000016178255565b6148e76148a560a087015161ffff1690565b82547fffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff1660789190911b70ffff00000000000000000000000000000016178255565b6149416148fb60c087015163ffffffff1690565b82547fffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffff1660889190911b74ffffffff000000000000000000000000000000000016178255565b61499b61495360e087015161ffff1690565b82547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff1660a89190911b76ffff00000000000000000000000000000000000000000016178255565b6149f86149ae61010087015161ffff1690565b82547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff1660b89190911b78ffff000000000000000000000000000000000000000000000016178255565b614a57614a0b61012087015161ffff1690565b82547fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff1660c89190911b7affff0000000000000000000000000000000000000000000000000016178255565b614abc614a6c61014087015163ffffffff1690565b82547fff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff1660d89190911b7effffffff00000000000000000000000000000000000000000000000000000016178255565b0192614b04614ad361016083015163ffffffff1690565b859063ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055565b614b5a614b1d61018083015167ffffffffffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff1660209190911b6bffffffffffffffff0000000016178555565b614bb0614b6f6101a083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff1660609190911b6fffffffff00000000000000000000000016178555565b614c0a614bc56101c083015163ffffffff1690565b85547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff1660809190911b73ffffffff0000000000000000000000000000000016178555565b614c66614c1b6101e0830151151590565b85805490917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90911690151560a01b74ff000000000000000000000000000000000000000016179055565b01517fffffffff000000000000000000000000000000000000000000000000000000001690565b81547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1660389190911c78ffffffff00000000000000000000000000000000000000000016179055565b614e1d60a061023993614d1c63ffffffff825116859063ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055565b60208181015185546040808501517fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff9092169290931b67ffffffff000000001691909117911b69ffff0000000000000000161784556060810151614dbf9063ffffffff1685547fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff1660509190911b6dffffffff0000000000000000000016178555565b614e16614dd3608083015163ffffffff1690565b85547fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff1660709190911b71ffffffff000000000000000000000000000016178555565b0151151590565b81547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1690151560901b72ff00000000000000000000000000000000000016179055565b91929092614e718282868661583d565b600052600460205260ff6040600020541615614e8d5750505050565b6040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201529390921660248401527fffffffffffffffffffff0000000000000000000000000000000000000000000090911660448301527fffff000000000000000000000000000000000000000000000000000000000000166064820152608490fd5b0390fd5b604d8111612d3657600a0a90565b60ff1660120160ff8111612d365760ff16906024821115615005577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8201918211612d3657614f91614f9792614f32565b90612d6e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614fdb577bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b7f10cb51d10000000000000000000000000000000000000000000000000000000060005260046000fd5b906024039060248211612d365761280061501e92614f32565b614f97565b9060ff80911691160160ff8111612d365760ff16906024821115615005577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8201918211612d3657614f91614f9792614f32565b519069ffffffffffffffffffff8216820361022957565b908160a0910312610229576150a281615077565b91602082015191604081015191612ded608060608401519301615077565b6040513d6000823e3d90fd5b908160209103126102295751612ded81612aae565b6150e96131ef565b5061510e613b3a613b3a835173ffffffffffffffffffffffffffffffffffffffff1690565b90604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a082600481865afa92831561522b57600092600094615230575b5060008312614fdb576020600491604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa92831561522b57612ded9363ffffffff936151b7936000926151f5575b506020015160ff165b90615023565b926151e76151c361065b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9095168552565b1663ffffffff166020830152565b6151b191925061521c602091823d8411615224575b615214818361061a565b8101906150cc565b9291506151a8565b503d61520a565b6150c0565b90935061525691925060a03d60a011615263575b61524e818361061a565b81019061508e565b5093925050919238615151565b503d615244565b919063ffffffff6040840151168082116152fa57505061ffff602083015116908181116152c4575050907fffffffff00000000000000000000000000000000000000000000000000000000610200610239930151166158ce565b61ffff92507fd88dddd6000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b7f869337890000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b67ffffffffffffffff8116600052600560205260406000209160405192615350846105e2565b547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116845260e01c9182602085015263ffffffff821692836153b4575b50505050612ded90517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff164290810393908411612d365783116153d2578061538a565b7ff08bcb3e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045263ffffffff1660245260445260646000fd5b6040813603126102295760206040519161542e836105e2565b80356154398161020b565b83520135602082015290565b63ffffffff60209116019063ffffffff8211612d3657565b9063ffffffff8091169116019063ffffffff8211612d3657565b929593909491956000936000976000976000955b80871061549e5750505050505050929190565b9091929394959698996154ba6154b589848a612e92565b615415565b9961552261457a8c6154fe6154e38867ffffffffffffffff16600052600a602052604060002090565b915173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b91615533611db060a0850151151590565b6156a25760009b604084019061554e6127f9835161ffff1690565b615603575b5050606083015163ffffffff166155699161545d565b9b608083015161557c9063ffffffff1690565b6155859161545d565b9a82516155959063ffffffff1690565b63ffffffff166155a490612d14565b600193908083106155f75750612929611e6660206155c793015163ffffffff1690565b8082116155e657506155d891613f1c565b975b0195949392919061548b565b90506155f191613f1c565b976155da565b9150506155f191613f1c565b906128006127f9615693949f61568a9460208e61568193508d73ffffffffffffffffffffffffffffffffffffffff61564f855173ffffffffffffffffffffffffffffffffffffffff1690565b911673ffffffffffffffffffffffffffffffffffffffff82161461569b5761567791506140d1565b915b0151906159e0565b925161ffff1690565b620186a0900490565b9a3880615553565b5091615679565b989a50600191506156e86156cf6156ee926156c96129296127f96101208c015161ffff1690565b90613f1c565b996156e261014089015163ffffffff1690565b9061545d565b9b615445565b996155da565b91939093806101e00193846101e011612d36576101208102908082046101201490151715612d36576101e0910101809311612d36576127f96101006127ef612ded966dffffffffffffffffffffffffffff6157886157746157626157909a63ffffffff6128009a1690613f1c565b6128006127f960e08c015161ffff1690565b6156c9611e6660c08b015163ffffffff1690565b911690612d5b565b612d3b565b6157b4916157a16131ef565b5063ffffffff61016085015116916142e8565b90815163ffffffff806060840151161610615813576101e00151151580615807575b6157dd5790565b7fee433e990000000000000000000000000000000000000000000000000000000060005260046000fd5b506020810151156157d6565b7f4c4fc93a0000000000000000000000000000000000000000000000000000000060005260046000fd5b6040805173ffffffffffffffffffffffffffffffffffffffff9283166020820190815292909316908301527fffffffffffffffffffff0000000000000000000000000000000000000000000090921660608201527fffff0000000000000000000000000000000000000000000000000000000000009092166080830152906158c88160a081016145ba565b51902090565b7fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c00000000000000000000000000000000000000000000000000000000146159195750565b602081510361595c5761593560208251830101602083016142b0565b73ffffffffffffffffffffffffffffffffffffffff8111908115615992575b5061595c5750565b614f2e906040519182917f8d666f6000000000000000000000000000000000000000000000000000000000835260048301615a15565b61040091501038615954565b73ffffffffffffffffffffffffffffffffffffffff612ded9116600b615b09565b73ffffffffffffffffffffffffffffffffffffffff612ded9116600b615c97565b670de0b6b3a7640000917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff615a119216612d5b565b0490565b906020612ded92818152019061067a565b8054821015612ea25760005260206000200190600090565b9161470e918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b80548015615ada577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190615aab8282615a26565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001810191806000528260205260406000205492831515600014615bf7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401848111612d36578354937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501948511612d36576000958583615ba897615b999503615bae575b505050615a76565b90600052602052604060002090565b55600190565b615bde615bd891615bcf615bc5615bee9588615a26565b90549060031b1c90565b92839187615a26565b90615a3e565b8590600052602052604060002090565b55388080615b91565b50505050600090565b805490680100000000000000008210156105c15781615c2791600161470e94018155615a26565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b600081815260036020526040902054615c9157615c7a816002615c00565b600254906000526003602052604060002055600190565b50600090565b6000828152600182016020526040902054615cce5780615cb983600193615c00565b80549260005201602052604060002055600190565b5050600090565b600081815260036020526040902054908115615cce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211612d3657600254927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401938411612d36578383615ba89460009603615d71575b505050615d606002615a76565b600390600052602052604060002090565b615d60615bd891615d89615bc5615d93956002615a26565b9283916002615a26565b55388080615d5356fea164736f6c634300081a000a",
}
var FeeQuoterABI = FeeQuoterMetaData.ABI
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 fa5a6a4cdac..3e2ba32b69a 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
@@ -81,8 +81,8 @@ type TokenPoolChainUpdate struct {
}
var LockReleaseTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"localTokenDecimals\",\"type\":\"uint8\"},{\"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\":[],\"name\":\"CannotTransferToSelf\",\"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\":[{\"internalType\":\"uint8\",\"name\":\"expected\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"actual\",\"type\":\"uint8\"}],\"name\":\"InvalidDecimalArgs\",\"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\":\"sourcePoolData\",\"type\":\"bytes\"}],\"name\":\"InvalidRemoteChainDecimals\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidRemotePoolForChain\",\"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\":[],\"name\":\"MismatchedArrayLengths\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"remoteDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"localDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"remoteAmount\",\"type\":\"uint256\"}],\"name\":\"OverflowDetected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"PoolAlreadyAdded\",\"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\":false,\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"RateLimitAdminSet\",\"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\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolRemoved\",\"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\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"addRemotePool\",\"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\":[{\"internalType\":\"uint64[]\",\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes[]\",\"name\":\"remotePoolAddresses\",\"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\":\"chainsToAdd\",\"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\":\"getRemotePools\",\"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\":\"getTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"isRemotePool\",\"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\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"removeRemotePool\",\"outputs\":[],\"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\":\"remoteChainSelectors\",\"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\":\"outboundConfigs\",\"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\":\"inboundConfigs\",\"type\":\"tuple[]\"}],\"name\":\"setChainRateLimiterConfigs\",\"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\":\"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: "0x6101206040523480156200001257600080fd5b50604051620053a2380380620053a28339810160408190526200003591620005bb565b8585858584336000816200005c57604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008f576200008f81620001f3565b50506001600160a01b0385161580620000af57506001600160a01b038116155b80620000c257506001600160a01b038216155b15620000e1576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03808616608081905290831660c0526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa92505050801562000151575060408051601f3d908101601f191682019092526200014e91810190620006ee565b60015b1562000191578060ff168560ff16146200018f576040516332ad3e0760e11b815260ff80871660048301528216602482015260440160405180910390fd5b505b60ff841660a052600480546001600160a01b0319166001600160a01b038316179055825115801560e052620001db57604080516000815260208101909152620001db90846200026d565b5050505091151561010052506200075a945050505050565b336001600160a01b038216036200021d57604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e0516200028e576040516335f4a7b360e01b815260040160405180910390fd5b60005b825181101562000319576000838281518110620002b257620002b26200070c565b60209081029190910101519050620002cc600282620003ca565b156200030f576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010162000291565b5060005b8151811015620003c55760008282815181106200033e576200033e6200070c565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200036a5750620003bc565b62000377600282620003ea565b15620003ba576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b6001016200031d565b505050565b6000620003e1836001600160a01b03841662000401565b90505b92915050565b6000620003e1836001600160a01b03841662000505565b60008181526001830160205260408120548015620004fa5760006200042860018362000722565b85549091506000906200043e9060019062000722565b9050808214620004aa5760008660000182815481106200046257620004626200070c565b90600052602060002001549050808760000184815481106200048857620004886200070c565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620004be57620004be62000744565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620003e4565b6000915050620003e4565b60008181526001830160205260408120546200054e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003e4565b506000620003e4565b6001600160a01b03811681146200056d57600080fd5b50565b805160ff811681146200058257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b8051620005828162000557565b805180151581146200058257600080fd5b60008060008060008060c08789031215620005d557600080fd5b8651620005e28162000557565b95506020620005f388820162000570565b60408901519096506001600160401b03808211156200061157600080fd5b818a0191508a601f8301126200062657600080fd5b8151818111156200063b576200063b62000587565b8060051b604051601f19603f8301168101818110858211171562000663576200066362000587565b60405291825284820192508381018501918d8311156200068257600080fd5b938501935b82851015620006ab576200069b856200059d565b8452938501939285019262000687565b809950505050505050620006c2606088016200059d565b9250620006d260808801620005aa565b9150620006e260a088016200059d565b90509295509295509295565b6000602082840312156200070157600080fd5b620003e18262000570565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003e457634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e05161010051614b776200082b600039600081816105d20152611c4e01526000818161066c015281816124a0015261315b01526000818161064601528181611fbd015261287601526000818161038201528181610ff301528181612166015281816122200152818161225401528181612287015281816122ec0152818161234501526123e70152600081816102e90152818161033e015281816107ad0152818161087f0152818161097301528181611d1001528181612f4f01526133460152614b776000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063962d402011610145578063c0d78655116100bd578063dc0bd9711161008c578063e8a1da1711610071578063e8a1da1714610690578063eb521a4c146106a3578063f2fde38b146106b657600080fd5b8063dc0bd97114610644578063e0351e131461066a57600080fd5b8063c0d78655146105f6578063c4bffe2b14610609578063c75eea9c1461061e578063cf7401f31461063157600080fd5b8063acfecf9111610114578063b0f479a1116100f9578063b0f479a11461059f578063b7946580146105bd578063bb98546b146105d057600080fd5b8063acfecf911461051d578063af58d59f1461053057600080fd5b8063962d4020146104b55780639a4575b9146104c8578063a42a7b8b146104e8578063a7cd63b71461050857600080fd5b806354c8a4f3116101d85780636d3d1a58116101a75780637d54534e1161018c5780637d54534e146104715780638926f54f146104845780638da5cb5b1461049757600080fd5b80636d3d1a581461044b57806379ba50971461046957600080fd5b806354c8a4f3146103ff57806362ddd3c41461041257806366320087146104255780636cfd15531461043857600080fd5b8063240028e81161022f578063390775371161021457806339077537146103ac578063432a6ba3146103ce5780634c5ef0ed146103ec57600080fd5b8063240028e81461032e57806324f65ee71461037b57600080fd5b806301ffc9a7146102615780630a861f2a14610289578063181f5a771461029e57806321df0da7146102e7575b600080fd5b61027461026f366004613b6b565b6106c9565b60405190151581526020015b60405180910390f35b61029c610297366004613bad565b610725565b005b6102da6040518060400160405280601a81526020017f4c6f636b52656c65617365546f6b656e506f6f6c20312e352e3100000000000081525081565b6040516102809190613c34565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610280565b61027461033c366004613c69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610280565b6103bf6103ba366004613c86565b6108d6565b60405190518152602001610280565b600a5473ffffffffffffffffffffffffffffffffffffffff16610309565b6102746103fa366004613cdf565b610a24565b61029c61040d366004613dae565b610a6e565b61029c610420366004613cdf565b610ae9565b61029c610433366004613e1a565b610b81565b61029c610446366004613c69565b610c5d565b60095473ffffffffffffffffffffffffffffffffffffffff16610309565b61029c610cac565b61029c61047f366004613c69565b610d7a565b610274610492366004613e46565b610dfb565b60015473ffffffffffffffffffffffffffffffffffffffff16610309565b61029c6104c3366004613ea6565b610e12565b6104db6104d6366004613f40565b610f6c565b6040516102809190613f7b565b6104fb6104f6366004613e46565b611038565b6040516102809190613fd2565b6105106111a3565b6040516102809190614054565b61029c61052b366004613cdf565b6111b4565b61054361053e366004613e46565b6112cc565b604051610280919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610309565b6102da6105cb366004613e46565b6113a1565b7f0000000000000000000000000000000000000000000000000000000000000000610274565b61029c610604366004613c69565b611451565b61061161152c565b60405161028091906140ae565b61054361062c366004613e46565b6115e4565b61029c61063f366004614236565b6116b6565b7f0000000000000000000000000000000000000000000000000000000000000000610309565b7f0000000000000000000000000000000000000000000000000000000000000000610274565b61029c61069e366004613dae565b61173a565b61029c6106b1366004613bad565b611c4c565b61029c6106c4366004613c69565b611d68565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fe1d4056600000000000000000000000000000000000000000000000000000000148061071f575061071f82611d7c565b92915050565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461077d576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082d919061427b565b1015610865576040517fbb55fd2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163383611e60565b604051819033907fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf984017171990600090a350565b6040805160208101909152600081526108ee82611f34565b6000610947606084013561094261090860c0870187614294565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061215892505050565b61221c565b905061099a61095c6060850160408601613c69565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169083611e60565b6109aa6060840160408501613c69565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f5283604051610a0891815260200190565b60405180910390a3604080516020810190915290815292915050565b6000610a668383604051610a399291906142f9565b604080519182900390912067ffffffffffffffff8716600090815260076020529190912060050190612430565b949350505050565b610a7661244b565b610ae38484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061249e92505050565b50505050565b610af161244b565b610afa83610dfb565b610b3c576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610774565b610b7c8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061265492505050565b505050565b610b8961244b565b6040517f0a861f2a0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff831690630a861f2a90602401600060405180830381600087803b158015610bf157600080fd5b505af1158015610c05573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff167f6fa7abcf1345d1d478e5ea0da6b5f26a90eadb0546ef15ed3833944fbfd1db6282604051610c5191815260200190565b60405180910390a25050565b610c6561244b565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cfd576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d8261244b565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d091749060200160405180910390a150565b600061071f600567ffffffffffffffff8416612430565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590610e52575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15610e8b576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610774565b8483141580610e9a5750848114155b15610ed1576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b85811015610f6357610f5b878783818110610ef157610ef1614309565b9050602002016020810190610f069190613e46565b868684818110610f1857610f18614309565b905060600201803603810190610f2e9190614338565b858585818110610f4057610f40614309565b905060600201803603810190610f569190614338565b61274e565b600101610ed4565b50505050505050565b6040805180820190915260608082526020820152610f8982612838565b6040516060830135815233907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060200160405180910390a26040518060400160405280610fe38460200160208101906105cb9190613e46565b81526020016110306040805160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260609101604051602081830303815290604052905090565b905292915050565b67ffffffffffffffff8116600090815260076020526040812060609190611061906005016129c4565b90506000815167ffffffffffffffff81111561107f5761107f6140f0565b6040519080825280602002602001820160405280156110b257816020015b606081526020019060019003908161109d5790505b50905060005b825181101561119b57600860008483815181106110d7576110d7614309565b6020026020010151815260200190815260200160002080546110f890614354565b80601f016020809104026020016040519081016040528092919081815260200182805461112490614354565b80156111715780601f1061114657610100808354040283529160200191611171565b820191906000526020600020905b81548152906001019060200180831161115457829003601f168201915b505050505082828151811061118857611188614309565b60209081029190910101526001016110b8565b509392505050565b60606111af60026129c4565b905090565b6111bc61244b565b6111c583610dfb565b611207576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610774565b611247828260405161121a9291906142f9565b604080519182900390912067ffffffffffffffff86166000908152600760205291909120600501906129d1565b611283578282826040517f74f23c7c000000000000000000000000000000000000000000000000000000008152600401610774939291906143f0565b8267ffffffffffffffff167f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7683836040516112bf929190614414565b60405180910390a2505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261071f906129dd565b67ffffffffffffffff811660009081526007602052604090206004018054606091906113cc90614354565b80601f01602080910402602001604051908101604052809291908181526020018280546113f890614354565b80156114455780601f1061141a57610100808354040283529160200191611445565b820191906000526020600020905b81548152906001019060200180831161142857829003601f168201915b50505050509050919050565b61145961244b565b73ffffffffffffffffffffffffffffffffffffffff81166114a6576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b6060600061153a60056129c4565b90506000815167ffffffffffffffff811115611558576115586140f0565b604051908082528060200260200182016040528015611581578160200160208202803683370190505b50905060005b82518110156115dd578281815181106115a2576115a2614309565b60200260200101518282815181106115bc576115bc614309565b67ffffffffffffffff90921660209283029190910190910152600101611587565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261071f906129dd565b60095473ffffffffffffffffffffffffffffffffffffffff1633148015906116f6575060015473ffffffffffffffffffffffffffffffffffffffff163314155b1561172f576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610774565b610b7c83838361274e565b61174261244b565b60005b8381101561192f57600085858381811061176157611761614309565b90506020020160208101906117769190613e46565b905061178d600567ffffffffffffffff83166129d1565b6117cf576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610774565b67ffffffffffffffff811660009081526007602052604081206117f4906005016129c4565b905060005b81518110156118605761185782828151811061181757611817614309565b6020026020010151600760008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206005016129d190919063ffffffff16565b506001016117f9565b5067ffffffffffffffff8216600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906118c96004830182613afe565b60058201600081816118db8282613b38565b505060405167ffffffffffffffff871681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169450602001925061191d915050565b60405180910390a15050600101611745565b5060005b81811015611c4557600083838381811061194f5761194f614309565b90506020028101906119619190614428565b61196a906144f4565b905061197b81606001516000612a8f565b61198a81608001516000612a8f565b8060400151516000036119c9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516119e19060059067ffffffffffffffff16612bcc565b611a265780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610774565b805167ffffffffffffffff16600090815260076020908152604091829020825160a08082018552606080870180518601516fffffffffffffffffffffffffffffffff90811680865263ffffffff42168689018190528351511515878b0181905284518a0151841686890181905294518b0151841660809889018190528954740100000000000000000000000000000000000000009283027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff7001000000000000000000000000000000008087027fffffffffffffffffffffffff000000000000000000000000000000000000000094851690981788178216929092178d5592810290971760018c01558c519889018d52898e0180518d01518716808b528a8e019590955280515115158a8f018190528151909d01518716988a01899052518d0151909516979098018790526002890180549a909102999093161717909416959095179092559092029091176003820155908201516004820190611ba9908261466b565b5060005b826020015151811015611bed57611be5836000015184602001518381518110611bd857611bd8614309565b6020026020010151612654565b600101611bad565b507f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c28260000151836040015184606001518560800151604051611c339493929190614785565b60405180910390a15050600101611933565b5050505050565b7f0000000000000000000000000000000000000000000000000000000000000000611ca3576040517fe93f8fa400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff163314611cf6576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610774565b611d3873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612bd8565b604051819033907fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb31208890600090a350565b611d7061244b565b611d7981612c36565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf000000000000000000000000000000000000000000000000000000001480611e0f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061071f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610b7c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612cfa565b611f4761033c60a0830160808401613c69565b611fa657611f5b60a0820160808301613c69565b6040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610774565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb611ff26040840160208501613e46565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015612063573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612087919061481e565b156120be576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d66120d16040830160208401613e46565b612e06565b6120f66120e96040830160208401613e46565b6103fa60a0840184614294565b61213b5761210760a0820182614294565b6040517f24eb47e5000000000000000000000000000000000000000000000000000000008152600401610774929190614414565b611d7961214e6040830160208401613e46565b8260600135612f2c565b6000815160000361218a57507f0000000000000000000000000000000000000000000000000000000000000000919050565b81516020146121c757816040517f953576f70000000000000000000000000000000000000000000000000000000081526004016107749190613c34565b6000828060200190518101906121dd919061427b565b905060ff81111561071f57826040517f953576f70000000000000000000000000000000000000000000000000000000081526004016107749190613c34565b60007f000000000000000000000000000000000000000000000000000000000000000060ff168260ff160361225257508161071f565b7f000000000000000000000000000000000000000000000000000000000000000060ff168260ff16111561233d5760006122ac7f00000000000000000000000000000000000000000000000000000000000000008461486a565b9050604d8160ff161115612320576040517fa9cb113d00000000000000000000000000000000000000000000000000000000815260ff80851660048301527f000000000000000000000000000000000000000000000000000000000000000016602482015260448101859052606401610774565b61232b81600a6149a3565b61233590856149b2565b91505061071f565b6000612369837f000000000000000000000000000000000000000000000000000000000000000061486a565b9050604d8160ff1611806123b0575061238381600a6149a3565b6123ad907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6149b2565b84115b1561241b576040517fa9cb113d00000000000000000000000000000000000000000000000000000000815260ff80851660048301527f000000000000000000000000000000000000000000000000000000000000000016602482015260448101859052606401610774565b61242681600a6149a3565b610a6690856149ed565b600081815260018301602052604081205415155b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461249c576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f00000000000000000000000000000000000000000000000000000000000000006124f5576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561258b57600083828151811061251557612515614309565b60200260200101519050612533816002612f7390919063ffffffff16565b156125825760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016124f8565b5060005b8151811015610b7c5760008282815181106125ac576125ac614309565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125f0575061264c565b6125fb600282612f95565b1561264a5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010161258f565b805160000361268f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208083019190912067ffffffffffffffff84166000908152600790925260409091206126c19060050182612bcc565b6126fb5782826040517f393b8ad2000000000000000000000000000000000000000000000000000000008152600401610774929190614a04565b6000818152600860205260409020612713838261466b565b508267ffffffffffffffff167f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea836040516112bf9190613c34565b61275783610dfb565b612799576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610774565b6127a4826000612a8f565b67ffffffffffffffff831660009081526007602052604090206127c79083612fb7565b6127d2816000612a8f565b67ffffffffffffffff831660009081526007602052604090206127f89060020182612fb7565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b83838360405161282b93929190614a27565b60405180910390a1505050565b61284b61033c60a0830160808401613c69565b61285f57611f5b60a0820160808301613c69565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb6128ab6040840160208501613e46565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa15801561291c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612940919061481e565b15612977576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61298f61298a6060830160408401613c69565b613159565b6129a76129a26040830160208401613e46565b6131d8565b611d796129ba6040830160208401613e46565b8260600135613326565b606060006124448361336a565b600061244483836133c5565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152612a6b82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642612a4f9190614aaa565b85608001516fffffffffffffffffffffffffffffffff166134b8565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b815115612b5a5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580612ae5575060408201516fffffffffffffffffffffffffffffffff16155b15612b1e57816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016107749190614abd565b8015612b56576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60408201516fffffffffffffffffffffffffffffffff16151580612b93575060208201516fffffffffffffffffffffffffffffffff1615155b15612b5657816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016107749190614abd565b600061244483836134e0565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610ae39085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611eb2565b3373ffffffffffffffffffffffffffffffffffffffff821603612c85576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612d5c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661352f9092919063ffffffff16565b805190915015610b7c5780806020019051810190612d7a919061481e565b610b7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610774565b612e0f81610dfb565b612e51576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610774565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef4919061481e565b611d79576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610774565b67ffffffffffffffff82166000908152600760205260409020612b5690600201827f000000000000000000000000000000000000000000000000000000000000000061353e565b60006124448373ffffffffffffffffffffffffffffffffffffffff84166133c5565b60006124448373ffffffffffffffffffffffffffffffffffffffff84166134e0565b8154600090612fe090700100000000000000000000000000000000900463ffffffff1642614aaa565b905080156130825760018301548354613028916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166134b8565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546130a8916fffffffffffffffffffffffffffffffff90811691166138c1565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061282b908490614abd565b7f000000000000000000000000000000000000000000000000000000000000000015611d795761318a6002826138d7565b611d79576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610774565b6131e181610dfb565b613223576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610774565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa15801561329c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c09190614af9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d79576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610774565b67ffffffffffffffff82166000908152600760205260409020612b5690827f000000000000000000000000000000000000000000000000000000000000000061353e565b60608160000180548060200260200160405190810160405280929190818152602001828054801561144557602002820191906000526020600020905b8154815260200190600101908083116133a65750505050509050919050565b600081815260018301602052604081205480156134ae5760006133e9600183614aaa565b85549091506000906133fd90600190614aaa565b905080821461346257600086600001828154811061341d5761341d614309565b906000526020600020015490508087600001848154811061344057613440614309565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061347357613473614b16565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061071f565b600091505061071f565b60006134d7856134c884866149ed565b6134d29087614b45565b6138c1565b95945050505050565b60008181526001830160205260408120546135275750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561071f565b50600061071f565b6060610a668484600085613906565b825474010000000000000000000000000000000000000000900460ff161580613565575081155b1561356f57505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906135b590700100000000000000000000000000000000900463ffffffff1642614aaa565b9050801561367557818311156135f7576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546136319083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166134b8565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b8482101561372c5773ffffffffffffffffffffffffffffffffffffffff84166136d4576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610774565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610774565b8483101561383f5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906137709082614aaa565b61377a878a614aaa565b6137849190614b45565b61378e91906149b2565b905073ffffffffffffffffffffffffffffffffffffffff86166137e7576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610774565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610774565b6138498584614aaa565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008183106138d05781612444565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515612444565b606082471015613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610774565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139c19190614b58565b60006040518083038185875af1925050503d80600081146139fe576040519150601f19603f3d011682016040523d82523d6000602084013e613a03565b606091505b5091509150613a1487838387613a1f565b979650505050505050565b60608315613ab5578251600003613aae5773ffffffffffffffffffffffffffffffffffffffff85163b613aae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610774565b5081610a66565b610a668383815115613aca5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107749190613c34565b508054613b0a90614354565b6000825580601f10613b1a575050565b601f016020900490600052602060002090810190611d799190613b52565b5080546000825590600052602060002090810190611d7991905b5b80821115613b675760008155600101613b53565b5090565b600060208284031215613b7d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461244457600080fd5b600060208284031215613bbf57600080fd5b5035919050565b60005b83811015613be1578181015183820152602001613bc9565b50506000910152565b60008151808452613c02816020860160208601613bc6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006124446020830184613bea565b73ffffffffffffffffffffffffffffffffffffffff81168114611d7957600080fd5b600060208284031215613c7b57600080fd5b813561244481613c47565b600060208284031215613c9857600080fd5b813567ffffffffffffffff811115613caf57600080fd5b8201610100818503121561244457600080fd5b803567ffffffffffffffff81168114613cda57600080fd5b919050565b600080600060408486031215613cf457600080fd5b613cfd84613cc2565b9250602084013567ffffffffffffffff80821115613d1a57600080fd5b818601915086601f830112613d2e57600080fd5b813581811115613d3d57600080fd5b876020828501011115613d4f57600080fd5b6020830194508093505050509250925092565b60008083601f840112613d7457600080fd5b50813567ffffffffffffffff811115613d8c57600080fd5b6020830191508360208260051b8501011115613da757600080fd5b9250929050565b60008060008060408587031215613dc457600080fd5b843567ffffffffffffffff80821115613ddc57600080fd5b613de888838901613d62565b90965094506020870135915080821115613e0157600080fd5b50613e0e87828801613d62565b95989497509550505050565b60008060408385031215613e2d57600080fd5b8235613e3881613c47565b946020939093013593505050565b600060208284031215613e5857600080fd5b61244482613cc2565b60008083601f840112613e7357600080fd5b50813567ffffffffffffffff811115613e8b57600080fd5b602083019150836020606083028501011115613da757600080fd5b60008060008060008060608789031215613ebf57600080fd5b863567ffffffffffffffff80821115613ed757600080fd5b613ee38a838b01613d62565b90985096506020890135915080821115613efc57600080fd5b613f088a838b01613e61565b90965094506040890135915080821115613f2157600080fd5b50613f2e89828a01613e61565b979a9699509497509295939492505050565b600060208284031215613f5257600080fd5b813567ffffffffffffffff811115613f6957600080fd5b820160a0818503121561244457600080fd5b602081526000825160406020840152613f976060840182613bea565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526134d78282613bea565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015614047577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614035858351613bea565b94509285019290850190600101613ffb565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156140a257835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614070565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156140a257835167ffffffffffffffff16835292840192918401916001016140ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715614142576141426140f0565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561418f5761418f6140f0565b604052919050565b8015158114611d7957600080fd5b80356fffffffffffffffffffffffffffffffff81168114613cda57600080fd5b6000606082840312156141d757600080fd5b6040516060810181811067ffffffffffffffff821117156141fa576141fa6140f0565b604052905080823561420b81614197565b8152614219602084016141a5565b602082015261422a604084016141a5565b60408201525092915050565b600080600060e0848603121561424b57600080fd5b61425484613cc2565b925061426385602086016141c5565b915061427285608086016141c5565b90509250925092565b60006020828403121561428d57600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126142c957600080fd5b83018035915067ffffffffffffffff8211156142e457600080fd5b602001915036819003821315613da757600080fd5b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006060828403121561434a57600080fd5b61244483836141c5565b600181811c9082168061436857607f821691505b6020821081036143a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b67ffffffffffffffff841681526040602082015260006134d76040830184866143a7565b602081526000610a666020830184866143a7565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261445c57600080fd5b9190910192915050565b600082601f83011261447757600080fd5b813567ffffffffffffffff811115614491576144916140f0565b6144c260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614148565b8181528460208386010111156144d757600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561450757600080fd5b61450f61411f565b61451883613cc2565b815260208084013567ffffffffffffffff8082111561453657600080fd5b9085019036601f83011261454957600080fd5b81358181111561455b5761455b6140f0565b8060051b61456a858201614148565b918252838101850191858101903684111561458457600080fd5b86860192505b838310156145c0578235858111156145a25760008081fd5b6145b03689838a0101614466565b835250918601919086019061458a565b80878901525050505060408601359250808311156145dd57600080fd5b50506145eb36828601614466565b6040830152506145fe36606085016141c5565b60608201526146103660c085016141c5565b608082015292915050565b601f821115610b7c576000816000526020600020601f850160051c810160208610156146445750805b601f850160051c820191505b8181101561466357828155600101614650565b505050505050565b815167ffffffffffffffff811115614685576146856140f0565b614699816146938454614354565b8461461b565b602080601f8311600181146146ec57600084156146b65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614663565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156147395788860151825594840194600190910190840161471a565b508582101561477557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff871683528060208401526147a981840187613bea565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506147e79050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e08301526134d7565b60006020828403121561483057600080fd5b815161244481614197565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff828116828216039081111561071f5761071f61483b565b600181815b808511156148dc57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156148c2576148c261483b565b808516156148cf57918102915b93841c9390800290614888565b509250929050565b6000826148f35750600161071f565b816149005750600061071f565b816001811461491657600281146149205761493c565b600191505061071f565b60ff8411156149315761493161483b565b50506001821b61071f565b5060208310610133831016604e8410600b841016171561495f575081810a61071f565b6149698383614883565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561499b5761499b61483b565b029392505050565b600061244460ff8416836148e4565b6000826149e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761071f5761071f61483b565b67ffffffffffffffff83168152604060208201526000610a666040830184613bea565b67ffffffffffffffff8416815260e08101614a7360208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152610a66565b8181038181111561071f5761071f61483b565b6060810161071f82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b600060208284031215614b0b57600080fd5b815161244481613c47565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8082018082111561071f5761071f61483b565b6000825161445c818460208701613bc656fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"acceptLiquidity\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canAcceptLiquidity\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRebalancer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provideLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRebalancer\",\"inputs\":[{\"name\":\"rebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferLiquidity\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityAdded\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityRemoved\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InsufficientLiquidity\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"LiquidityNotAccepted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x61012080604052346103945761504f803803809161001d8285610413565b8339810160c0828203126103945781516001600160a01b038116908181036103945761004b60208501610436565b60408501519091906001600160401b0381116103945785019380601f86011215610394578451946001600160401b0386116103fd578560051b9060208201966100976040519889610413565b875260208088019282010192831161039457602001905b8282106103e5575050506100c460608601610444565b9060808601519586151587036103945760a06100e09101610444565b9333156103d457600180546001600160a01b03191633179055801580156103c3575b80156103b2575b6103a15760049260209260805260c0526040519283809263313ce56760e01b82525afa60009181610360575b50610335575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e0819052610218575b5061010052604051614a5690816105f9823960805181818161036301528181611800015281816119f70152818161258301528181612766015281816129e801528181612a600152612b57015260a051818181611a580152818161296f0152818161364f01526136d2015260c051818181610d7e0152818161189c015261261e015260e051818181610d0e015281816118df01526123270152610100518181816102d101526112ae0152f35b60206040516102278282610413565b60008152600036813760e051156103245760005b81518110156102a2576001906001600160a01b036102598285610458565b5116846102658261049a565b610272575b50500161023b565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388461026a565b505060005b825181101561031b576001906001600160a01b036102c58286610458565b5116801561031557836102d782610598565b6102e5575b50505b016102a7565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102dc565b506102df565b5050503861016d565b6335f4a7b360e01b60005260046000fd5b60ff1660ff8216818103610349575061013b565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d602011610399575b8161037c60209383610413565b810103126103945761038d90610436565b9038610135565b600080fd5b3d915061036f565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b03831615610109565b506001600160a01b03851615610102565b639b15e16f60e01b60005260046000fd5b602080916103f284610444565b8152019101906100ae565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103fd57604052565b519060ff8216820361039457565b51906001600160a01b038216820361039457565b805182101561046c5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561046c5760005260206000200190600090565b600081815260036020526040902054801561059157600019810181811161057b5760025460001981019190821161057b5781810361052a575b505050600254801561051457600019016104ee816002610482565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61056361053b61054c936002610482565b90549060031b1c9283926002610482565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104d3565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105f257600254680100000000000000008110156103fd576105d961054c8260018594016002556002610482565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612c67575080630a861f2a14612b03578063181f5a7714612a8457806321df0da714612a15578063240028e81461299357806324f65ee71461293757806339077537146124dc578063432a6ba31461248a5780634c5ef0ed1461247057806354c8a4f3146122f357806362ddd3c41461226f57806366320087146121675780636cfd1553146120e55780636d3d1a581461209357806379ba509714611fae5780637d54534e14611f015780638926f54f14611e9d5780638da5cb5b14611e4b578063962d402014611ca75780639a4575b914611758578063a42a7b8b146115d3578063a7cd63b714611507578063acfecf91146113e3578063af58d59f1461137c578063b0f479a11461132a578063b7946580146112d3578063bb98546b14611278578063c0d7865514611180578063c4bffe2b14611037578063c75eea9c14610f71578063cf7401f314610da2578063dc0bd97114610d33578063e0351e1314610cd8578063e8a1da1714610403578063eb521a4c1461029c5763f2fde38b146101ad57600080fd5b346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995773ffffffffffffffffffffffffffffffffffffffff6101f9612f02565b6102016137dc565b1633811461027157807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610299576004357f0000000000000000000000000000000000000000000000000000000000000000156103db5773ffffffffffffffffffffffffffffffffffffffff600a541633036103af576103876040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015233602482015230604482015282606482015260648152610361608482612e28565b7f0000000000000000000000000000000000000000000000000000000000000000613dae565b337fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb3120888380a380f35b6024827f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b6004827fe93f8fa4000000000000000000000000000000000000000000000000000000008152fd5b50346102995761041236612ff0565b9391909261041e6137dc565b82915b808310610b43575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b85821015610b3f578160051b85013581811215610b3b5785019061012082360312610b3b576040519561048c87612df0565b823567ffffffffffffffff81168103610b36578752602083013567ffffffffffffffff8111610b325783019536601f88011215610b32578635966104cf886131ee565b976104dd604051998a612e28565b8089526020808a019160051b83010190368211610b2e5760208301905b828210610afb575050505060208801968752604084013567ffffffffffffffff8111610af75761052d9036908601613546565b9860408901998a5261055761054536606088016130ae565b9560608b0196875260c03691016130ae565b9660808a019788526105698651613c53565b6105738851613c53565b8a515115610acf5761058f67ffffffffffffffff8b51166145e6565b15610a985767ffffffffffffffff8a511681526007602052604081206106cf87516fffffffffffffffffffffffffffffffff6040820151169061068a6fffffffffffffffffffffffffffffffff602083015116915115158360806040516105f581612df0565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b6107f589516fffffffffffffffffffffffffffffffff604082015116906107b06fffffffffffffffffffffffffffffffff6020830151169151151583608060405161071981612df0565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff8211610a6b5761081883546132e6565b601f8111610a30575b50602090601f83116001146109915761086f9291859183610986575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b895180518210156108aa57906108a460019261089d838f67ffffffffffffffff905116926132d2565b5190613827565b01610874565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c29295939661097867ffffffffffffffff600197949c511692519351915161094461090f60405196879687526101006020880152610100870190612ea3565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101909394929161045a565b01519050388061083d565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b818110610a1857509084600195949392106109e1575b505050811b019055610872565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806109d4565b929360206001819287860151815501950193016109be565b610a5b9084865260208620601f850160051c81019160208610610a61575b601f0160051c01906134ed565b38610821565b9091508190610a4e565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff8111610b2a57602091610b1f8392833691890101613546565b8152019101906104fa565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff610b63610b5e87858861326e565b6132ad565b1695610b6e8761431a565b15610cac578684526007602052610b8a60056040862001614121565b94845b8651811015610bc3576001908987526007602052610bbc60056040892001610bb5838b6132d2565b5190614445565b5001610b8d565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610bfc81546132e6565b80610c6b575b5050500180549086815581610c4d575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a1019190949394610421565b865260208620908101905b81811015610c1257868155600101610c58565b601f8111600114610c815750555b863880610c02565b81835260208320610c9c91601f01861c8101906001016134ed565b8082528160208120915555610c79565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102995760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957610dda612f25565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261029957604051610e1181612e0c565b6024358015158103610f6d5781526044356fffffffffffffffffffffffffffffffff81168103610f6d5760208201526064356fffffffffffffffffffffffffffffffff81168103610f6d57604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610f695760405190610e9882612e0c565b6084358015158103610b3b57825260a4356fffffffffffffffffffffffffffffffff81168103610b3b57602083015260c4356fffffffffffffffffffffffffffffffff81168103610b3b57604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610f47575b610f1b57610f189293613a91565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610f0a565b5080fd5b8280fd5b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957610fda610fd560406110339367ffffffffffffffff610fbe612f25565b610fc661343a565b50168152600760205220613465565b613bce565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957604051906005548083528260208101600584526020842092845b81811061116757505061109592500383612e28565b81516110b96110a3826131ee565b916110b16040519384612e28565b8083526131ee565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015611118578067ffffffffffffffff611105600193886132d2565b511661111182866132d2565b52016110e6565b50925090604051928392602084019060208552518091526040840192915b818110611144575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101611136565b8454835260019485019487945060209093019201611080565b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995773ffffffffffffffffffffffffffffffffffffffff6111cd612f02565b6111d56137dc565b1680156112505760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957611033611316611311612f25565b6134cb565b604051918291602083526020830190612ea3565b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957610fda610fd5600260406110339467ffffffffffffffff6113cb612f25565b6113d361343a565b5016815260076020522001613465565b50346102995767ffffffffffffffff6113fb36612f3c565b9290916114066137dc565b169161141f836000526006602052604060002054151590565b156114db57828452600760205261144e6005604086200161144136848661314b565b6020815191012090614445565b1561149357907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d769161148d6040519283926020845260208401916133fb565b0390a280f35b826114d7836040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501526040602485015260448401916133fb565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957604051600254808252602082018091600285526020852090855b8181106115bd5750505082611566910383612e28565b604051928392602084019060208552518091526040840192915b81811061158e575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611580565b8254845260209093019260019283019201611550565b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995767ffffffffffffffff611614612f25565b168152600760205261162b60056040832001614121565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061167061165a836131ee565b926116686040519485612e28565b8084526131ee565b01835b818110611747575050825b82518110156116c45780611694600192856132d2565b51855260086020526116a860408620613339565b6116b282856132d2565b526116bd81846132d2565b500161167e565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b8282106116fc57505050500390f35b91936020611737827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186528851612ea3565b96019201920185949391926116ed565b806060602080938601015201611673565b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760043567ffffffffffffffff8111610f695760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610f6957606060206040516117d681612dd4565b8281520152608481016117e881613182565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611c5d5750602481019077ffffffffffffffff0000000000000000000000000000000061184f836132ad565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611b7e578491611c2e575b50611c06576118dd60448201613182565b7f0000000000000000000000000000000000000000000000000000000000000000611bb4575b5067ffffffffffffffff611916836132ad565b1661192e816000526006602052604060002054151590565b15611b8957602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa8015611b7e578490611b1b575b73ffffffffffffffffffffffffffffffffffffffff9150163303611aef578161131191611a1d6040611abe9667ffffffffffffffff60646119d2611a4e996132ad565b950135941681526007602052208273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614695565b6040519081527f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860203392a26132ad565b61103360405160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260208152611a8c604082612e28565b60405192611a9984612dd4565b8352602083019081526040519384936020855251604060208601526060850190612ea3565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612ea3565b6024837f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b506020813d602011611b76575b81611b3560209383612e28565b81010312610b3b575173ffffffffffffffffffffffffffffffffffffffff81168103610b3b5773ffffffffffffffffffffffffffffffffffffffff9061198f565b3d9150611b28565b6040513d86823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008452600452602483fd5b73ffffffffffffffffffffffffffffffffffffffff1680845260036020526040842054611903577fd0d25976000000000000000000000000000000000000000000000000000000008452600452602483fd5b6004837f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b611c50915060203d602011611c56575b611c488183612e28565b8101906135c3565b386118cc565b503d611c3e565b8273ffffffffffffffffffffffffffffffffffffffff611c7e602493613182565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b50346102995760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760043567ffffffffffffffff8111610f6957611cf7903690600401612fbf565b60243567ffffffffffffffff8111610b3b57611d17903690600401613060565b60449291923567ffffffffffffffff8111610b3257611d3a903690600401613060565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611e29575b611dfd57818114801590611df3575b611dcb57865b818110611d7f578780f35b80611dc5611d93610b5e600194868c61326e565b611d9e83878b6132c2565b611dbf611db7611daf868b8d6132c2565b9236906130ae565b9136906130ae565b91613a91565b01611d74565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611d6e565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611d5f565b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610299576020611ef767ffffffffffffffff611ee3612f25565b166000526006602052604060002054151590565b6040519015158152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610299577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611f71612f02565b611f796137dc565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957805473ffffffffffffffffffffffffffffffffffffffff8116330361206b577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995773ffffffffffffffffffffffffffffffffffffffff612132612f02565b61213a6137dc565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a5580f35b50346102995760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995761219f612f02565b73ffffffffffffffffffffffffffffffffffffffff602435916121c06137dc565b1690813b15610f6d576040517f0a861f2a000000000000000000000000000000000000000000000000000000008152816004820152838160248183875af18015611b7e57612238575b5060207f6fa7abcf1345d1d478e5ea0da6b5f26a90eadb0546ef15ed3833944fbfd1db6291604051908152a280f35b836122677f6fa7abcf1345d1d478e5ea0da6b5f26a90eadb0546ef15ed3833944fbfd1db629395602093612e28565b939150612209565b50346102995761227e36612f3c565b61228a939291936137dc565b67ffffffffffffffff82166122ac816000526006602052604060002054151590565b156122c85750610f1892936122c291369161314b565b90613827565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b50346102995761231d9061232561230936612ff0565b95916123169391936137dc565b3691613206565b933691613206565b7f00000000000000000000000000000000000000000000000000000000000000001561244857815b83518110156123c0578073ffffffffffffffffffffffffffffffffffffffff612378600193876132d2565b511661238381614184565b61238f575b500161234d565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a138612388565b5090805b8251811015612444578073ffffffffffffffffffffffffffffffffffffffff6123ef600193866132d2565b5116801561243e5761240081614586565b61240d575b505b016123c4565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a184612405565b50612407565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b5034610299576020611ef761248436612f3c565b916131a3565b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760043567ffffffffffffffff8111610f695780600401916101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610299578060405161255d81612d89565b526084820161256b81613182565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361291657506024820177ffffffffffffffff000000000000000000000000000000006125d1826132ad565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156128995783916128f7575b506128cf5767ffffffffffffffff612665826132ad565b1661267d816000526006602052604060002054151590565b156128a457602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa90811561289957839161287a575b501561284e576126f4816132ad565b61270660a485019161248483886130fa565b1561280757506020936127c06044946127ac73ffffffffffffffffffffffffffffffffffffffff956127a66127a161279a600260406127476127c59b6132ad565b9567ffffffffffffffff60648a01359716815260078f522001976127907f000000000000000000000000000000000000000000000000000000000000000099868d8c1691614695565b60c48701906130fa565b369161314b565b6135db565b906136cf565b95869101926127ba84613182565b90613561565b613182565b166040518281527f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52843392a3806040516127fe81612d89565b52604051908152f35b61281190856130fa565b6114d76040519283927f24eb47e50000000000000000000000000000000000000000000000000000000084526020600485015260248401916133fb565b6024827f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b612893915060203d602011611c5657611c488183612e28565b386126e5565b6040513d85823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008352600452602482fd5b6004827f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b612910915060203d602011611c5657611c488183612e28565b3861264e565b9073ffffffffffffffffffffffffffffffffffffffff611c7e602493613182565b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610299576020906129ce612f02565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995750611033604051612ac5604082612e28565b601a81527f4c6f636b52656c65617365546f6b656e506f6f6c20312e352e310000000000006020820152604051918291602083526020830190612ea3565b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760043573ffffffffffffffffffffffffffffffffffffffff600a541633036103af577f00000000000000000000000000000000000000000000000000000000000000006040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260208160248173ffffffffffffffffffffffffffffffffffffffff86165afa8015611b7e5783918591612c32575b5010612c0a5781612be2913390613561565b337fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf98401717198380a380f35b6004837fbb55fd27000000000000000000000000000000000000000000000000000000008152fd5b9150506020813d602011612c5f575b81612c4e60209383612e28565b81010312610b3b5782905138612bd0565b3d9150612c41565b905034610f695760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f69576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610f6d57602092507fe1d40566000000000000000000000000000000000000000000000000000000008114908115612cfb575b5015158152f35b7faff2afbf00000000000000000000000000000000000000000000000000000000811491508115612d5f575b8115612d35575b5038612cf4565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612d2e565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150612d27565b6020810190811067ffffffffffffffff821117612da557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117612da557604052565b60a0810190811067ffffffffffffffff821117612da557604052565b6060810190811067ffffffffffffffff821117612da557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612da557604052565b67ffffffffffffffff8111612da557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b848110612eed5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612eae565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610b3657565b6004359067ffffffffffffffff82168203610b3657565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610b365760043567ffffffffffffffff81168103610b36579160243567ffffffffffffffff8111610b365782602382011215610b365780600401359267ffffffffffffffff8411610b365760248483010111610b36576024019190565b9181601f84011215610b365782359167ffffffffffffffff8311610b36576020808501948460051b010111610b3657565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610b365760043567ffffffffffffffff8111610b36578161303991600401612fbf565b929092916024359067ffffffffffffffff8211610b365761305c91600401612fbf565b9091565b9181601f84011215610b365782359167ffffffffffffffff8311610b365760208085019460608502010111610b3657565b35906fffffffffffffffffffffffffffffffff82168203610b3657565b9190826060910312610b36576040516130c681612e0c565b80928035908115158203610b365760406130f591819385526130ea60208201613091565b602086015201613091565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610b36570180359067ffffffffffffffff8211610b3657602001918136038313610b3657565b92919261315782612e69565b916131656040519384612e28565b829481845281830111610b36578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff81168103610b365790565b6131eb929167ffffffffffffffff6131ce92166000526007602052600560406000200192369161314b565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff8111612da55760051b60200190565b9291613211826131ee565b9361321f6040519586612e28565b602085848152019260051b8101918211610b3657915b81831061324157505050565b823573ffffffffffffffffffffffffffffffffffffffff81168103610b3657815260209283019201613235565b919081101561327e5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff81168103610b365790565b919081101561327e576060020190565b805182101561327e5760209160051b010190565b90600182811c9216801561332f575b602083101461330057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916132f5565b906040519182600082549261334d846132e6565b80845293600181169081156133bb5750600114613374575b5061337292500383612e28565b565b90506000929192526020600020906000915b81831061339f5750509060206133729282010138613365565b6020919350806001915483858901015201910190918492613386565b602093506133729592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613365565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b6040519061344782612df0565b60006080838281528260208201528260408201528260608201520152565b9060405161347281612df0565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff1660005260076020526131eb6004604060002001613339565b8181106134f8575050565b600081556001016134ed565b8181029291811591840414171561351757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f83011215610b36578160206131eb9335910161314b565b6133729273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb0000000000000000000000000000000000000000000000000000000060208601521660248401526044830152604482526135be606483612e28565b613dae565b90816020910312610b3657518015158103610b365790565b8051801561364b5760200361360d578051602082810191830183900312610b3657519060ff821161360d575060ff1690565b6114d7906040519182917f953576f7000000000000000000000000000000000000000000000000000000008352602060048401526024830190612ea3565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161351757565b60ff16604d811161351757600a0a90565b81156136a0570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146137d5578284116137ab579061371491613671565b91604d60ff8416118015613772575b61373c575050906137366131eb92613685565b90613504565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b5061377c83613685565b80156136a0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613723565b6137b491613671565b91604d60ff84161161373c575050906137cf6131eb92613685565b90613696565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff6001541633036137fd57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b90805115613a675767ffffffffffffffff8151602083012092169182600052600760205261385c816005604060002001614640565b15613a235760005260086020526040600020815167ffffffffffffffff8111612da55761388982546132e6565b601f81116139f1575b506020601f821160011461392b5791613905827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea959361391b95600091613920575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9055604051918291602083526020830190612ea3565b0390a2565b9050840151386138d4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106139d957509261391b9492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9896106139a2575b5050811b019055611316565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880613996565b9192602060018192868a01518155019401920161395b565b613a1d90836000526020600020601f840160051c81019160208510610a6157601f0160051c01906134ed565b38613892565b50906114d76040519283927f393b8ad20000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190612ea3565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff166000818152600660205260409020549092919015613b935791613b9060e092613b5c85613ae87f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b97613c53565b846000526007602052613aff816040600020613eee565b613b0883613c53565b846000526007602052613b22836002604060002001613eee565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161351757565b613bd661343a565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff8083511691613c336020850193613c2d613c2063ffffffff87511642613bc1565b8560808901511690613504565b90614579565b80821015613c4c57505b16825263ffffffff4216905290565b9050613c3d565b805115613d07576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116811090811591613cfe575b50613c9b5750565b606490613cfc604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b90501538613c93565b6fffffffffffffffffffffffffffffffff60408201511615801590613d8f575b613d2e5750565b606490613cfc604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613d27565b73ffffffffffffffffffffffffffffffffffffffff613e3d911691604092600080855193613ddc8786612e28565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d15613ee6573d91613e2183612e69565b92613e2e87519485612e28565b83523d6000602085013e61497d565b80519081613e4a57505050565b602080613e5b9383010191016135c3565b15613e635750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b60609161497d565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19916140276060928054613f2b63ffffffff8260801c1642613bc1565b9081614066575b50506fffffffffffffffffffffffffffffffff600181602086015116928281541680851060001461405e57508280855b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416178155613fdb8651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b613b9060405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b838091613f62565b6fffffffffffffffffffffffffffffffff9161409b8392836140946001880154948286169560801c90613504565b9116614579565b8082101561411a57505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff00000000000000000000000000000000161781553880613f32565b90506140a5565b906040519182815491828252602082019060005260206000209260005b81811061415357505061337292500383612e28565b845483526001948501948794506020909301920161413e565b805482101561327e5760005260206000200190600090565b6000818152600360205260409020548015614313577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161351757600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613517578181036142a4575b5050506002548015614275577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161423281600261416c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6142fb6142b56142c693600261416c565b90549060031b1c928392600261416c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806141f9565b5050600090565b6000818152600660205260409020548015614313577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161351757600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116135175781810361440b575b5050506005548015614275577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016143c881600561416c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b61442d61441c6142c693600561416c565b90549060031b1c928392600561416c565b9055600052600660205260406000205538808061438f565b9060018201918160005282602052604060002054801515600014614570577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613517578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161351757818103614539575b50505080548015614275577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906144fa828261416c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b6145596145496142c6938661416c565b90549060031b1c9283928661416c565b9055600052836020526040600020553880806144c2565b50505050600090565b9190820180921161351757565b806000526003602052604060002054156000146145e05760025468010000000000000000811015612da5576145c76142c6826001859401600255600261416c565b9055600254906000526003602052604060002055600190565b50600090565b806000526006602052604060002054156000146145e05760055468010000000000000000811015612da5576146276142c6826001859401600555600561416c565b9055600554906000526006602052604060002055600190565b60008281526001820160205260409020546143135780549068010000000000000000821015612da5578261467e6142c684600180960185558461416c565b905580549260005201602052604060002055600190565b929192805460ff8160a01c16158015614975575b61496e576fffffffffffffffffffffffffffffffff811690600183019081546146ee63ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642613bc1565b90816148d0575b505084811061484e575083821061477d57507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff8061474b8560209695613bc1565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061478f92505460801c92613bc1565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613517576147dd6147e29273ffffffffffffffffffffffffffffffffffffffff94614579565b613696565b921691821561481e577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff88169182156148a0577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b828592939511614944576148eb92613c2d9160801c90613504565b8083101561493f5750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806146f5565b6148f6565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b5082156146a9565b919290156149f85750815115614991575090565b3b1561499a5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015614a0b5750805190602001fd5b6114d7906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612ea356fea164736f6c634300081a000a",
}
var LockReleaseTokenPoolABI = LockReleaseTokenPoolMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/maybe_revert_message_receiver/maybe_revert_message_receiver.go b/core/gethwrappers/ccip/generated/maybe_revert_message_receiver/maybe_revert_message_receiver.go
index 3b52e8c871b..8d3c36757aa 100644
--- a/core/gethwrappers/ccip/generated/maybe_revert_message_receiver/maybe_revert_message_receiver.go
+++ b/core/gethwrappers/ccip/generated/maybe_revert_message_receiver/maybe_revert_message_receiver.go
@@ -44,8 +44,8 @@ type ClientEVMTokenAmount struct {
}
var MaybeRevertMessageReceiverMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"toRevert\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"CustomError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReceiveRevert\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"MessageReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ValueReceived\",\"type\":\"event\"},{\"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\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_toRevert\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"setErr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"toRevert\",\"type\":\"bool\"}],\"name\":\"setRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
- Bin: "0x608060405234801561001057600080fd5b506040516107e73803806107e783398101604081905261002f9161005d565b600080546001600160a81b0319163360ff60a01b191617600160a01b92151592909202919091179055610086565b60006020828403121561006f57600080fd5b8151801515811461007f57600080fd5b9392505050565b610752806100956000396000f3fe60806040526004361061005e5760003560e01c806377f5b0e61161004357806377f5b0e61461015857806385572ffb1461017a5780638fb5f1711461019a57600080fd5b806301ffc9a7146100f25780635100fc211461012657600080fd5b366100ed5760005474010000000000000000000000000000000000000000900460ff16156100b8576040517f3085b8db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040513481527fe12e3b7047ff60a2dd763cf536a43597e5ce7fe7aa7476345bd4cd079912bcef9060200160405180910390a1005b600080fd5b3480156100fe57600080fd5b5061011261010d366004610335565b6101ff565b604051901515815260200160405180910390f35b34801561013257600080fd5b506000546101129074010000000000000000000000000000000000000000900460ff1681565b34801561016457600080fd5b506101786101733660046103ad565b610298565b005b34801561018657600080fd5b5061017861019536600461047c565b6102a8565b3480156101a657600080fd5b506101786101b53660046104b7565b6000805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb00000000000000000000000000000000000000000000000000000000148061029257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60016102a4828261057d565b5050565b60005474010000000000000000000000000000000000000000900460ff16156103095760016040517f5a4ff6710000000000000000000000000000000000000000000000000000000081526004016103009190610697565b60405180910390fd5b6040517fd82ce31e3523f6eeb2d24317b2b4133001e8472729657f663b68624c45f8f3e890600090a150565b60006020828403121561034757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461037757600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156103bf57600080fd5b813567ffffffffffffffff808211156103d757600080fd5b818401915084601f8301126103eb57600080fd5b8135818111156103fd576103fd61037e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104435761044361037e565b8160405282815287602084870101111561045c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561048e57600080fd5b813567ffffffffffffffff8111156104a557600080fd5b820160a0818503121561037757600080fd5b6000602082840312156104c957600080fd5b8135801515811461037757600080fd5b600181811c908216806104ed57607f821691505b602082108103610526577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115610578576000816000526020600020601f850160051c810160208610156105555750805b601f850160051c820191505b8181101561057457828155600101610561565b5050505b505050565b815167ffffffffffffffff8111156105975761059761037e565b6105ab816105a584546104d9565b8461052c565b602080601f8311600181146105fe57600084156105c85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610574565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561064b5788860151825594840194600190910190840161062c565b508582101561068757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808352600084546106ab816104d9565b80602087015260406001808416600081146106cd576001811461070757610737565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00851660408a0152604084151560051b8a01019550610737565b89600052602060002060005b8581101561072e5781548b8201860152908301908801610713565b8a016040019650505b50939897505050505050505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"toRevert\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"s_toRevert\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setErr\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRevert\",\"inputs\":[{\"name\":\"toRevert\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"MessageReceived\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValueReceived\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CustomError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReceiveRevert\",\"inputs\":[]}]",
+ Bin: "0x608034607d57601f6107a838819003918201601f19168301916001600160401b03831184841017608257808492602094604052833981010312607d5751801515809103607d57600080546001600160a81b0319163360ff60a01b19161760a09290921b60ff60a01b1691909117905560405161070f90816100998239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561007e575b50361561001b57600080fd5b60ff60005460a01c16610054577fe12e3b7047ff60a2dd763cf536a43597e5ce7fe7aa7476345bd4cd079912bcef6020604051348152a1005b7f3085b8db0000000000000000000000000000000000000000000000000000000060005260046000fd5b60003560e01c90816301ffc9a7146105f3575080635100fc21146105af57806377f5b0e6146102da57806385572ffb1461014d57638fb5f171146100c2573861000f565b346101485760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014857600435801515809103610148577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006000549260a01b16911617600055600080f35b600080fd5b346101485760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101485760043567ffffffffffffffff8111610148577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a091360301126101485760ff60005460a01c166101ee577fd82ce31e3523f6eeb2d24317b2b4133001e8472729657f663b68624c45f8f3e8600080a1005b6040517f5a4ff6710000000000000000000000000000000000000000000000000000000081526020600482015280600060015461022a816106af565b908160248501526001811690816000146102a2575060011461024b57500390fd5b6001600090815291507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061028857505081010360440190fd5b805460448487010152849350602090920191600101610276565b604493507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201010390fd5b346101485760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101485760043567ffffffffffffffff8111610148573660238201121561014857806004013567ffffffffffffffff811161058057604051917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8501160116830183811067ffffffffffffffff82111761058057604052818352366024838301011161014857816000926024602093018386013783010152805167ffffffffffffffff8111610580576103be6001546106af565b601f81116104dd575b50602091601f821160011461042357918192600092610418575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600155600080f35b0151905082806103e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169260016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69160005b8581106104c55750836001951061048e575b505050811b01600155005b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055828080610483565b91926020600181928685015181550194019201610471565b6001600052601f820160051c7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6019060208310610558575b601f0160051c7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601905b81811061054c57506103c7565b6000815560010161053f565b7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69150610515565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101485760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014857602060ff60005460a01c166040519015158152f35b346101485760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014857600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361014857817f85572ffb0000000000000000000000000000000000000000000000000000000060209314908115610685575b5015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148361067e565b90600182811c921680156106f8575b60208310146106c957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916106be56fea164736f6c634300081a000a",
}
var MaybeRevertMessageReceiverABI = MaybeRevertMessageReceiverMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go b/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go
index 5b482517191..3625e6c1aed 100644
--- a/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go
+++ b/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go
@@ -71,8 +71,8 @@ type InternalRampMessageHeader struct {
}
var MessageHasherMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"decodeEVMExtraArgsV1\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMExtraArgsV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"name\":\"decodeEVMExtraArgsV2\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"internalType\":\"structClient.EVMExtraArgsV2\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"encodeAny2EVMTokenAmountsHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"tokenAmount\",\"type\":\"tuple[]\"}],\"name\":\"encodeEVM2AnyTokenAmountsHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMExtraArgsV1\",\"name\":\"extraArgs\",\"type\":\"tuple\"}],\"name\":\"encodeEVMExtraArgsV1\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\"}],\"internalType\":\"structClient.EVMExtraArgsV2\",\"name\":\"extraArgs\",\"type\":\"tuple\"}],\"name\":\"encodeEVMExtraArgsV2\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafDomainSeparator\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"metaDataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"fixedSizeFieldsHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"senderHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"tokenAmountsHash\",\"type\":\"bytes32\"}],\"name\":\"encodeFinalHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"encodeFixedSizeFieldsHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"any2EVMMessageHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"onRampHash\",\"type\":\"bytes32\"}],\"name\":\"encodeMetadataHashPreimage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"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\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"name\":\"hash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b50611053806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063bf0619ad11610076578063c7ca9a181161005b578063c7ca9a1814610273578063e04767b814610286578063e733d2091461029957600080fd5b8063bf0619ad146101c9578063c63641bd1461021c57600080fd5b806394b6624b116100a757806394b6624b14610168578063ae5663d71461017b578063b17df7141461018e57600080fd5b80633ec7c377146100c35780638503839d14610147575b600080fd5b6101316100d136600461065b565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff949094168585015267ffffffffffffffff928316606086015260808501919091521660a0808401919091528151808403909101815260c0909201905290565b60405161013e9190610716565b60405180910390f35b61015a610155366004610a5b565b6102ac565b60405190815260200161013e565b610131610176366004610b65565b610343565b610131610189366004610cd5565b61036c565b6101ba61019c366004610d12565b60408051602080820183526000909152815190810190915290815290565b6040519051815260200161013e565b6101316101d7366004610d2b565b604080516020810197909752868101959095526060860193909352608085019190915260a084015260c0808401919091528151808403909101815260e0909201905290565b61025661022a366004610d7e565b604080518082019091526000808252602082015250604080518082019091529182521515602082015290565b60408051825181526020928301511515928101929092520161013e565b610131610281366004610daa565b61037f565b610131610294366004610dfe565b610390565b6101316102a7366004610e42565b6103e3565b600061033c837f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f8560000151602001518660000151604001518680519060200120604051602001610321949392919093845267ffffffffffffffff928316602085015291166040830152606082015260800190565b604051602081830303815290604052805190602001206103ee565b9392505050565b6060816040516020016103569190610e84565b6040516020818303038152906040529050919050565b6060816040516020016103569190610f71565b606061038a82610521565b92915050565b6060848484846040516020016103ca949392919093845267ffffffffffffffff928316602085015291166040830152606082015260800190565b6040516020818303038152906040529050949350505050565b606061038a826105e3565b815180516060808501519083015160808087015194015160405160009586958895610460959194909391929160200194855273ffffffffffffffffffffffffffffffffffffffff93909316602085015267ffffffffffffffff9182166040850152606084015216608082015260a00190565b604051602081830303815290604052805190602001208560200151805190602001208660400151805190602001208760a001516040516020016104a39190610f71565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b604051815160248201526020820151151560448201526060907f181dcf1000000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915292915050565b604051815160248201526060907f97a657c90000000000000000000000000000000000000000000000000000000090604401610560565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063e57600080fd5b919050565b803567ffffffffffffffff8116811461063e57600080fd5b600080600080600060a0868803121561067357600080fd5b853594506106836020870161061a565b935061069160408701610643565b9250606086013591506106a660808701610643565b90509295509295909350565b6000815180845260005b818110156106d8576020818501810151868301820152016106bc565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061033c60208301846106b2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561077b5761077b610729565b60405290565b60405160c0810167ffffffffffffffff8111828210171561077b5761077b610729565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156107eb576107eb610729565b604052919050565b600060a0828403121561080557600080fd5b61080d610758565b90508135815261081f60208301610643565b602082015261083060408301610643565b604082015261084160608301610643565b606082015261085260808301610643565b608082015292915050565b600082601f83011261086e57600080fd5b813567ffffffffffffffff81111561088857610888610729565b6108b960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016107a4565b8181528460208386010111156108ce57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff82111561090557610905610729565b5060051b60200190565b600082601f83011261092057600080fd5b81356020610935610930836108eb565b6107a4565b82815260059290921b8401810191818101908684111561095457600080fd5b8286015b84811015610a5057803567ffffffffffffffff808211156109795760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d030112156109b25760008081fd5b6109ba610758565b87840135838111156109cc5760008081fd5b6109da8d8a8388010161085d565b82525060406109ea81860161061a565b8983015260608086013563ffffffff81168114610a075760008081fd5b808385015250608091508186013585811115610a235760008081fd5b610a318f8c838a010161085d565b9184019190915250919093013590830152508352918301918301610958565b509695505050505050565b60008060408385031215610a6e57600080fd5b823567ffffffffffffffff80821115610a8657600080fd5b908401906101408287031215610a9b57600080fd5b610aa3610781565b610aad87846107f3565b815260a083013582811115610ac157600080fd5b610acd8882860161085d565b60208301525060c083013582811115610ae557600080fd5b610af18882860161085d565b604083015250610b0360e0840161061a565b6060820152610100830135608082015261012083013582811115610b2657600080fd5b610b328882860161090f565b60a08301525093506020850135915080821115610b4e57600080fd5b50610b5b8582860161085d565b9150509250929050565b60006020808385031215610b7857600080fd5b823567ffffffffffffffff80821115610b9057600080fd5b818501915085601f830112610ba457600080fd5b8135610bb2610930826108eb565b81815260059190911b83018401908481019088831115610bd157600080fd5b8585015b83811015610cc857803585811115610bec57600080fd5b860160a0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215610c215760008081fd5b610c29610758565b610c3489830161061a565b815260408083013588811115610c4a5760008081fd5b610c588e8c8387010161085d565b8b8401525060608084013589811115610c715760008081fd5b610c7f8f8d8388010161085d565b83850152506080915081840135818401525060a083013588811115610ca45760008081fd5b610cb28e8c8387010161085d565b9183019190915250845250918601918601610bd5565b5098975050505050505050565b600060208284031215610ce757600080fd5b813567ffffffffffffffff811115610cfe57600080fd5b610d0a8482850161090f565b949350505050565b600060208284031215610d2457600080fd5b5035919050565b60008060008060008060c08789031215610d4457600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b8035801515811461063e57600080fd5b60008060408385031215610d9157600080fd5b82359150610da160208401610d6e565b90509250929050565b600060408284031215610dbc57600080fd5b6040516040810181811067ffffffffffffffff82111715610ddf57610ddf610729565b60405282358152610df260208401610d6e565b60208201529392505050565b60008060008060808587031215610e1457600080fd5b84359350610e2460208601610643565b9250610e3260408601610643565b9396929550929360600135925050565b600060208284031215610e5457600080fd5b6040516020810181811067ffffffffffffffff82111715610e7757610e77610729565b6040529135825250919050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015610f63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160a073ffffffffffffffffffffffffffffffffffffffff825116855288820151818a870152610f0f828701826106b2565b9150508782015185820389870152610f2782826106b2565b915050606080830151818701525060808083015192508582038187015250610f4f81836106b2565b968901969450505090860190600101610ead565b509098975050505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015610f63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160a08151818652610fde828701826106b2565b91505073ffffffffffffffffffffffffffffffffffffffff89830151168986015263ffffffff8883015116888601526060808301518683038288015261102483826106b2565b6080948501519790940196909652505094870194925090860190600101610f9a56fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"function\",\"name\":\"decodeEVMExtraArgsV1\",\"inputs\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.EVMExtraArgsV1\",\"components\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"decodeEVMExtraArgsV2\",\"inputs\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.EVMExtraArgsV2\",\"components\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeAny2EVMTokenAmountsHashPreimage\",\"inputs\":[{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeEVM2AnyTokenAmountsHashPreimage\",\"inputs\":[{\"name\":\"tokenAmount\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeEVMExtraArgsV1\",\"inputs\":[{\"name\":\"extraArgs\",\"type\":\"tuple\",\"internalType\":\"structClient.EVMExtraArgsV1\",\"components\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeEVMExtraArgsV2\",\"inputs\":[{\"name\":\"extraArgs\",\"type\":\"tuple\",\"internalType\":\"structClient.EVMExtraArgsV2\",\"components\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeFinalHashPreimage\",\"inputs\":[{\"name\":\"leafDomainSeparator\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"metaDataHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"fixedSizeFieldsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"senderHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"dataHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenAmountsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeFixedSizeFieldsHashPreimage\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeMetadataHashPreimage\",\"inputs\":[{\"name\":\"any2EVMMessageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hash\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"}]",
+ Bin: "0x60808060405234601557610e90908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081633ec7c377146109e3575080638503839d146106c457806394b6624b14610438578063ae5663d7146103d1578063b17df71414610378578063bf0619ad14610304578063c63641bd1461027d578063c7ca9a18146101b3578063e04767b81461012c5763e733d2091461008d57600080fd5b346101275760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610127576101236040516100cb81610b6e565b6004358152604051907f97a657c90000000000000000000000000000000000000000000000000000000060208301525160248201526024815261010f604482610ba6565b604051918291602083526020830190610af3565b0390f35b600080fd5b346101275760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101275760243567ffffffffffffffff8116809103610127576101239067ffffffffffffffff610185610ac7565b604051926004356020850152604084015216606082015260643560808201526080815261010f60a082610ba6565b346101275760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101275761012361025161010f6040516101f781610b8a565b6004358152610204610d9e565b60208201526040519283917f181dcf100000000000000000000000000000000000000000000000000000000060208401526024830191909160208060408301948051845201511515910152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610ba6565b346101275760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610127576101236102b7610d9e565b600060206040516102c781610b8a565b8281520152604051906102d982610b8a565b6004358252151560208201526040519182918291909160208060408301948051845201511515910152565b346101275760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757610123604051600435602082015260243560408201526044356060820152606435608082015260843560a082015260a43560c082015260c0815261010f60e082610ba6565b346101275760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757602060043560006040516103ba81610b6e565b52806040516103c881610b6e565b52604051908152f35b346101275760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101275760043567ffffffffffffffff81116101275761025161010f610429610123933690600401610c74565b60405192839160208301610dad565b346101275760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101275760043567ffffffffffffffff811161012757366023820112156101275780600401359061049382610c5c565b906104a16040519283610ba6565b82825260208201906024829460051b820101903682116101275760248101925b8284106105d557858560405190604082019060208084015251809152606082019060608160051b84010193916000905b82821061052d576101238561010f8189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610ba6565b909192946020806105c7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0896001960301865289519073ffffffffffffffffffffffffffffffffffffffff825116815260806105ac61059a8685015160a08886015260a0850190610af3565b60408501518482036040860152610af3565b92606081015160608401520151906080818403910152610af3565b9701920192019092916104f1565b833567ffffffffffffffff811161012757820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8236030112610127576040519161062183610b52565b61062d60248301610aa6565b8352604482013567ffffffffffffffff8111610127576106539060243691850101610be7565b6020840152606482013567ffffffffffffffff81116101275761067c9060243691850101610be7565b60408401526084820135606084015260a48201359267ffffffffffffffff8411610127576106b4602094936024869536920101610be7565b60808201528152019301926104c1565b346101275760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101275760043567ffffffffffffffff8111610127577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc813603016101408112610127576040519060c082019082821067ffffffffffffffff8311176109b45760a091604052126101275760405161076681610b52565b8260040135815261077960248401610ade565b602082015261078a60448401610ade565b604082015261079b60648401610ade565b60608201526107ac60848401610ade565b6080820152815260a482013567ffffffffffffffff8111610127576107d79060043691850101610be7565b6020820190815260c483013567ffffffffffffffff8111610127576108029060043691860101610be7565b6040830190815261081560e48501610aa6565b60608401908152608084019461010481013586526101248101359067ffffffffffffffff821161012757600461084e9236920101610c74565b9060a085019182526024359567ffffffffffffffff87116101275761094861087c6020983690600401610be7565b87519067ffffffffffffffff6040818c8501511693015116908a8151910120604051918b8301937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f8552604084015260608301526080820152608081526108e460a082610ba6565b5190209651805193516060808301519451608093840151604080518e8101998a5273ffffffffffffffffffffffffffffffffffffffff9590951660208a015267ffffffffffffffff9788169089015291870152909316908401528160a08401610251565b519020925185815191012091518581519101209051604051610971816102518982019485610dad565b5190209160405193868501956000875260408601526060850152608084015260a083015260c082015260c081526109a960e082610ba6565b519020604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101275760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610127576024359073ffffffffffffffffffffffffffffffffffffffff8216820361012757610a3b610ac7565b916084359067ffffffffffffffff8216820361012757600435602084015273ffffffffffffffffffffffffffffffffffffffff16604083015267ffffffffffffffff9283166060830152606435608083015290911660a08201526101239061010f8160c08101610251565b359073ffffffffffffffffffffffffffffffffffffffff8216820361012757565b6044359067ffffffffffffffff8216820361012757565b359067ffffffffffffffff8216820361012757565b919082519283825260005b848110610b3d5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610afe565b60a0810190811067ffffffffffffffff8211176109b457604052565b6020810190811067ffffffffffffffff8211176109b457604052565b6040810190811067ffffffffffffffff8211176109b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176109b457604052565b81601f820112156101275780359067ffffffffffffffff82116109b45760405192610c3a60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185610ba6565b8284526020838301011161012757816000926020809301838601378301015290565b67ffffffffffffffff81116109b45760051b60200190565b81601f8201121561012757803590610c8b82610c5c565b92610c996040519485610ba6565b82845260208085019360051b830101918183116101275760208101935b838510610cc557505050505090565b843567ffffffffffffffff811161012757820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082860301126101275760405191610d1183610b52565b602082013567ffffffffffffffff811161012757856020610d3492850101610be7565b8352610d4260408301610aa6565b6020840152606082013563ffffffff8116810361012757604084015260808201359267ffffffffffffffff84116101275760a083610d87886020809881980101610be7565b606084015201356080820152815201940193610cb6565b60243590811515820361012757565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610de057505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08560019503018652885190608080610e6e610e2e855160a0865260a0860190610af3565b73ffffffffffffffffffffffffffffffffffffffff87870151168786015263ffffffff604087015116604086015260608601518582036060870152610af3565b93015191015297019301930191939290610dd156fea164736f6c634300081a000a",
}
var MessageHasherABI = MessageHasherMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/mock_usdc_token_messenger/mock_usdc_token_messenger.go b/core/gethwrappers/ccip/generated/mock_usdc_token_messenger/mock_usdc_token_messenger.go
index 4d095a97da2..981b0b731fd 100644
--- a/core/gethwrappers/ccip/generated/mock_usdc_token_messenger/mock_usdc_token_messenger.go
+++ b/core/gethwrappers/ccip/generated/mock_usdc_token_messenger/mock_usdc_token_messenger.go
@@ -31,8 +31,8 @@ var (
)
var MockE2EUSDCTokenMessengerMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burnToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"mintRecipient\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"destinationDomain\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"destinationTokenMessenger\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"destinationCaller\",\"type\":\"bytes32\"}],\"name\":\"DepositForBurn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DESTINATION_TOKEN_MESSENGER\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"destinationDomain\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"mintRecipient\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"burnToken\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"destinationCaller\",\"type\":\"bytes32\"}],\"name\":\"depositForBurnWithCaller\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"localMessageTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"localMessageTransmitterWithRelay\",\"outputs\":[{\"internalType\":\"contractIMessageTransmitterWithRelay\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageBodyVersion\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_nonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e060405234801561001057600080fd5b5060405161082d38038061082d83398101604081905261002f91610063565b63ffffffff909116608052600080546001600160401b03191660011790556001600160a01b031660a081905260c0526100b2565b6000806040838503121561007657600080fd5b825163ffffffff8116811461008a57600080fd5b60208401519092506001600160a01b03811681146100a757600080fd5b809150509250929050565b60805160a05160c0516107396100f4600039600081816101290152818161049b015261055b01526000607901526000818160fa01526102b801526107396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063a250c66a11610050578063a250c66a14610124578063f856ddb61461014b578063fb8406a91461015e57600080fd5b80632c121921146100775780637eccf63e146100c35780639cdbb181146100f0575b600080fd5b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6000546100d79067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016100ba565b60405163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100ba565b6100997f000000000000000000000000000000000000000000000000000000000000000081565b6100d761015936600461059e565b610193565b6101857f17c71eed51b181d8ae1908b4743526c6dbf099c201f158a1acd5f6718e82e8f681565b6040519081526020016100ba565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905260009073ffffffffffffffffffffffffffffffffffffffff8416906323b872dd906064016020604051808303816000875af115801561020f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102339190610612565b506040517f42966c680000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff8416906342966c6890602401600060405180830381600087803b15801561029c57600080fd5b505af11580156102b0573d6000803e3d6000fd5b5050604080517f000000000000000000000000000000000000000000000000000000000000000060e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff8716602482015260448101889052606481018a9052336084808301919091528251808303909101815260a490910190915291506103779050867f17c71eed51b181d8ae1908b4743526c6dbf099c201f158a1acd5f6718e82e8f68584610457565b600080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169182179055604080518981526020810188905263ffffffff8916918101919091527f17c71eed51b181d8ae1908b4743526c6dbf099c201f158a1acd5f6718e82e8f6606082015260808101859052339173ffffffffffffffffffffffffffffffffffffffff8716917f2fa9ca894982930190727e75500a97d8dc500233a5065e0f3126c48fbe0343c09060a00160405180910390a4505060005467ffffffffffffffff1695945050505050565b60008261051e576040517f0ba469bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690630ba469bc906104d49088908890879060040161069f565b6020604051808303816000875af11580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051791906106cd565b9050610596565b6040517ff7259a7500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f7259a75906104d49088908890889088906004016106f7565b949350505050565b600080600080600060a086880312156105b657600080fd5b85359450602086013563ffffffff811681146105d157600080fd5b935060408601359250606086013573ffffffffffffffffffffffffffffffffffffffff8116811461060157600080fd5b949793965091946080013592915050565b60006020828403121561062457600080fd5b8151801515811461063457600080fd5b9392505050565b6000815180845260005b8181101561066157602081850181015186830182015201610645565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b63ffffffff841681528260208201526060604082015260006106c4606083018461063b565b95945050505050565b6000602082840312156106df57600080fd5b815167ffffffffffffffff8116811461063457600080fd5b63ffffffff85168152836020820152826040820152608060608201526000610722608083018461063b565b969550505050505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"transmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DESTINATION_TOKEN_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositForBurnWithCaller\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destinationDomain\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"mintRecipient\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"burnToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"localMessageTransmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"localMessageTransmitterWithRelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIMessageTransmitterWithRelay\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageBodyVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"s_nonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DepositForBurn\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"burnToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"depositor\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"mintRecipient\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"destinationDomain\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"destinationTokenMessenger\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"destinationCaller\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false}]",
+ Bin: "0x60e0346100b757601f61082538819003918201601f19168301916001600160401b038311848410176100bc5780849260409485528339810103126100b75780519063ffffffff821682036100b757602001516001600160a01b038116918282036100b757608052600080546001600160401b031916600117905560a05260c05260405161075290816100d382396080518181816101fc01526103fb015260a051816104ae015260c05181818161039c015261065f0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c9081632c12192114610464575080637eccf63e1461041f5780639cdbb181146103c0578063a250c66a14610351578063f856ddb6146100be5763fb8406a91461006357600080fd5b346100bb57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb5760206040517f17c71eed51b181d8ae1908b4743526c6dbf099c201f158a1acd5f6718e82e8f68152f35b80fd5b50346100bb5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb576024359060043563ffffffff831680840361034d576044356064359173ffffffffffffffffffffffffffffffffffffffff831680930361034957608435916040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201528560448201526020816064818a895af1801561030257610311575b50833b1561030d57604051967f42966c68000000000000000000000000000000000000000000000000000000008852856004890152868860248183895af1978815610302576020986102e2575b5061024f67ffffffffffffffff9185604051917fffffffff000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060e01b168c8401528860248401528560448401528960648401523360848401526084835261024a60a4846104d6565b6105ca565b1695867fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790556040519485528685015260408401527f17c71eed51b181d8ae1908b4743526c6dbf099c201f158a1acd5f6718e82e8f660608401526080830152827f2fa9ca894982930190727e75500a97d8dc500233a5065e0f3126c48fbe0343c060a03394a4604051908152f35b876102fa67ffffffffffffffff939961024f936104d6565b9791506101c6565b6040513d89823e3d90fd5b8580fd5b6020813d602011610341575b8161032a602093836104d6565b8101031261033d57518015158114610179575b8680fd5b3d915061031d565b8480fd5b8280fd5b50346100bb57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346100bb57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb57602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346100bb57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb5767ffffffffffffffff6020915416604051908152f35b9050346104d257817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104d25760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5080fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761051757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610566575167ffffffffffffffff811681036105665790565b600080fd5b919082519283825260005b8481106105b55750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610576565b90806106cb575063ffffffff60209161064460405194859384937f0ba469bc0000000000000000000000000000000000000000000000000000000085521660048401527f17c71eed51b181d8ae1908b4743526c6dbf099c201f158a1acd5f6718e82e8f6602484015260606044840152606483019061056b565b0381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af19081156106bf57600091610693575090565b6106b5915060203d6020116106b8575b6106ad81836104d6565b810190610546565b90565b503d6106a3565b6040513d6000823e3d90fd5b9160209161064463ffffffff9260405195869485947ff7259a750000000000000000000000000000000000000000000000000000000086521660048501527f17c71eed51b181d8ae1908b4743526c6dbf099c201f158a1acd5f6718e82e8f66024850152604484015260806064840152608483019061056b56fea164736f6c634300081a000a",
}
var MockE2EUSDCTokenMessengerABI = MockE2EUSDCTokenMessengerMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go b/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go
index c3f12bab371..3a1620df2e8 100644
--- a/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go
+++ b/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go
@@ -31,8 +31,8 @@ var (
)
var MockE2EUSDCTransmitterMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_version\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_localDomain\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"localDomain\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextAvailableNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"receiveMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_shouldSucceed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationDomain\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"messageBody\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationDomain\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"destinationCaller\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"messageBody\",\"type\":\"bytes\"}],\"name\":\"sendMessageWithCaller\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"shouldSucceed\",\"type\":\"bool\"}],\"name\":\"setShouldSucceed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e060405234801561001057600080fd5b5060405161097338038061097383398101604081905261002f91610076565b63ffffffff928316608052911660a0526000805460ff191660011790556001600160a01b031660c0526100ca565b805163ffffffff8116811461007157600080fd5b919050565b60008060006060848603121561008b57600080fd5b6100948461005d565b92506100a26020850161005d565b60408501519092506001600160a01b03811681146100bf57600080fd5b809150509250925092565b60805160a05160c05161086d610106600039600061024e015260008181610140015261045801526000818160c00152610437015261086d6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638371744e1161005b5780638371744e146101255780638d3638f41461013e5780639e31ddb614610164578063f7259a75146101a557600080fd5b80630ba469bc1461008d57806354fd4d50146100be57806357ecfd28146100f55780637a64293514610118575b600080fd5b6100a061009b36600461054a565b6101b8565b60405167ffffffffffffffff90911681526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405163ffffffff90911681526020016100b5565b6101086101033660046105a4565b6101e1565b60405190151581526020016100b5565b6000546101089060ff1681565b6000546100a090610100900467ffffffffffffffff1681565b7f00000000000000000000000000000000000000000000000000000000000000006100e0565b6101a3610172366004610604565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b005b6100a06101b336600461062d565b6102ba565b600080806101c461036a565b9050336101d688888584868b8b6103cc565b509695505050505050565b6000806101f260b860a48789610695565b6101fb916106bf565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815260609190911c6004820181905260016024830152915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b15801561029257600080fd5b505af11580156102a6573d6000803e3d6000fd5b505060005460ff1698975050505050505050565b60008361034e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f44657374696e6174696f6e2063616c6c6572206d757374206265206e6f6e7a6560448201527f726f00000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600061035861036a565b9050336101d688888884868a8a6103cc565b60008054610100900467ffffffffffffffff16610388816001610707565b6000805467ffffffffffffffff92909216610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff909216919091179055919050565b85610433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f526563697069656e74206d757374206265206e6f6e7a65726f000000000000006044820152606401610345565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008986888b8b898960405160200161049699989796959493929190610756565b60405160208183030381529060405290507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036816040516104d691906107f3565b60405180910390a15050505050505050565b803563ffffffff811681146104fc57600080fd5b919050565b60008083601f84011261051357600080fd5b50813567ffffffffffffffff81111561052b57600080fd5b60208301915083602082850101111561054357600080fd5b9250929050565b6000806000806060858703121561056057600080fd5b610569856104e8565b935060208501359250604085013567ffffffffffffffff81111561058c57600080fd5b61059887828801610501565b95989497509550505050565b600080600080604085870312156105ba57600080fd5b843567ffffffffffffffff808211156105d257600080fd5b6105de88838901610501565b909650945060208701359150808211156105f757600080fd5b5061059887828801610501565b60006020828403121561061657600080fd5b8135801515811461062657600080fd5b9392505050565b60008060008060006080868803121561064557600080fd5b61064e866104e8565b94506020860135935060408601359250606086013567ffffffffffffffff81111561067857600080fd5b61068488828901610501565b969995985093965092949392505050565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156106ff5780818660140360031b1b83161692505b505092915050565b67ffffffffffffffff81811683821601908082111561074f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b60007fffffffff00000000000000000000000000000000000000000000000000000000808c60e01b168352808b60e01b166004840152808a60e01b166008840152507fffffffffffffffff0000000000000000000000000000000000000000000000008860c01b16600c83015286601483015285603483015284605483015282846074840137506000910160740190815298975050505050505050565b60006020808352835180602085015260005b8181101561082157858101830151858201604001528201610805565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509291505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_localDomain\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"localDomain\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextAvailableNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"receiveMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"s_shouldSucceed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"destinationDomain\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"recipient\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageBody\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessageWithCaller\",\"inputs\":[{\"name\":\"destinationDomain\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"recipient\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageBody\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setShouldSucceed\",\"inputs\":[{\"name\":\"shouldSucceed\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false}]",
+ Bin: "0x60e0346100c857601f610ab038819003918201601f19168301916001600160401b038311848410176100cd578084926060946040528339810103126100c857610047816100e3565b906040610056602083016100e3565b9101516001600160a01b03811692908390036100c85760805260a052600160ff19600054161760005560c0526040516109bb90816100f5823960805181818161011f0152818161063c0152610704015260a05181818161014901528181610418015261072e015260c051816105550152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b519063ffffffff821682036100c85756fe6080604052600436101561001257600080fd5b6000803560e01c80630ba469bc1461066057806354fd4d501461060157806357ecfd28146104c45780637a642935146104845780638371744e1461043c5780638d3638f4146103dd5780639e31ddb61461036e5763f7259a751461007557600080fd5b3461036b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036b576100ac61086b565b6044359160243560643567ffffffffffffffff8111610367576100d3903690600401610883565b9480156102e3576100e2610921565b94831561028557866020976101ed946094947fffffffff0000000000000000000000000000000000000000000000000000000097604051988996817f000000000000000000000000000000000000000000000000000000000000000060e01b168e890152817f000000000000000000000000000000000000000000000000000000000000000060e01b16602489015260e01b1660288701527fffffffffffffffff0000000000000000000000000000000000000000000000008b60c01b16602c87015233603487015260548601526074850152848401378101858382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826108b1565b604051918483528151918286850152815b838110610271575050827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f846040948585977f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b0369901015201168101030190a167ffffffffffffffff60405191168152f35b8181018701518582016040015286016101fe565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f526563697069656e74206d757374206265206e6f6e7a65726f000000000000006044820152fd5b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f44657374696e6174696f6e2063616c6c6572206d757374206265206e6f6e7a6560448201527f726f0000000000000000000000000000000000000000000000000000000000006064820152fd5b8280fd5b80fd5b503461036b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036b576004358015158091036103d95760ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00835416911617815580f35b5080fd5b503461036b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036b57602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461036b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036b5767ffffffffffffffff6020915460081c16604051908152f35b503461036b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036b5760ff60209154166040519015158152f35b503461036b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036b5760043567ffffffffffffffff81116103d957610514903690600401610883565b60243567ffffffffffffffff81116105fd57610534903690600401610883565b505060b8116103d9578173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823b156103d957604460a4918360405195869485937f40c10f19000000000000000000000000000000000000000000000000000000008552013560601c6004840152600160248401525af180156105f2579160ff91816020946105e2575b505054166040519015158152f35b6105eb916108b1565b38816105d4565b6040513d84823e3d90fd5b8380fd5b503461036b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036b57602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461036b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261036b5761069861086b565b906024359060443567ffffffffffffffff81116103d9576106bd903690600401610883565b90926106c7610921565b93811561028557602095837fffffffff00000000000000000000000000000000000000000000000000000000946094936107d395604051978895817f000000000000000000000000000000000000000000000000000000000000000060e01b168d880152817f000000000000000000000000000000000000000000000000000000000000000060e01b16602488015260e01b1660288601527fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b16602c8601523360348601526054850152876074850152848401378101858382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826108b1565b604051918483528151918286850152815b838110610857575050827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f846040948585977f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b0369901015201168101030190a167ffffffffffffffff60405191168152f35b8181018701518582016040015286016107e4565b6004359063ffffffff8216820361087e57565b600080fd5b9181601f8401121561087e5782359167ffffffffffffffff831161087e576020838186019501011161087e57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108f257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005467ffffffffffffffff8160081c16906001820167ffffffffffffffff811161097f5768ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b1691161760005590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea164736f6c634300081a000a",
}
var MockE2EUSDCTransmitterABI = MockE2EUSDCTransmitterMetaData.ABI
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 7c2e2319b95..c4e5d8e11e0 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\":\"feeQuoter\",\"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\":[],\"name\":\"CannotTransferToSelf\",\"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\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"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\":false,\"internalType\":\"address\",\"name\":\"newFeeQuoter\",\"type\":\"address\"}],\"name\":\"FeeQuoterSet\",\"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\"},{\"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\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"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\":\"bytes[]\",\"name\":\"remoteTokens\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeQuoter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"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\":\"newFeeQuoter\",\"type\":\"address\"}],\"name\":\"setFeeQuoter\",\"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\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"}],\"internalType\":\"structMultiAggregateRateLimiter.RateLimitTokenArgs[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60806040523480156200001157600080fd5b50604051620032f2380380620032f28339810160408190526200003491620004d1565b80336000816200005757604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008a576200008a81620000cc565b5050604080518082018252828152815160008152602080820190935291810191909152620000b89062000146565b50620000c48262000295565b505062000608565b336001600160a01b03821603620000f657604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b8151811015620001d65760008282815181106200016f576200016f620005ba565b602090810291909101015190506200018960028262000311565b15620001cc576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b506001016200014e565b50815160005b81518110156200028f576000828281518110620001fd57620001fd620005ba565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200023b576040516342bcdf7f60e11b815260040160405180910390fd5b6200024860028262000331565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101620001dc565b50505050565b6001600160a01b038116620002bd576040516342bcdf7f60e11b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac9060200160405180910390a150565b600062000328836001600160a01b03841662000348565b90505b92915050565b600062000328836001600160a01b0384166200044c565b60008181526001830160205260408120548015620004415760006200036f600183620005d0565b85549091506000906200038590600190620005d0565b9050818114620003f1576000866000018281548110620003a957620003a9620005ba565b9060005260206000200154905080876000018481548110620003cf57620003cf620005ba565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620004055762000405620005f2565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200032b565b60009150506200032b565b600081815260018301602052604081205462000495575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200032b565b5060006200032b565b80516001600160a01b0381168114620004b657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620004e557600080fd5b620004f0836200049e565b602084810151919350906001600160401b03808211156200051057600080fd5b818601915086601f8301126200052557600080fd5b8151818111156200053a576200053a620004bb565b8060051b604051601f19603f83011681018181108582111715620005625762000562620004bb565b6040529182528482019250838101850191898311156200058157600080fd5b938501935b82851015620005aa576200059a856200049e565b8452938501939285019262000586565b8096505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b818103818111156200032b57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b612cda80620006186000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638da5cb5b1161008c578063e145291611610066578063e145291614610247578063e835232b14610265578063f2fde38b14610278578063fe843cd01461028b57600080fd5b80638da5cb5b146101e257806391a2749a14610221578063e0a0e5061461023457600080fd5b80631af18b7b116100c85780631af18b7b146101915780632451a627146101a4578063537e304e146101b957806379ba5097146101da57600080fd5b806308d450a1146100ef5780630a35bcc414610104578063181f5a771461017c575b600080fd5b6101026100fd3660046120e9565b61029e565b005b6101176101123660046121c9565b6102bd565b604051610173919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60405180910390f35b610184610382565b6040516101739190612260565b61010261019f36600461239a565b61039e565b6101ac6105fc565b60405161017391906124b7565b6101cc6101c73660046124ca565b61060d565b6040516101739291906124e5565b61010261077a565b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610173565b61010261022f3660046125db565b610848565b61010261024236600461266c565b610859565b60055473ffffffffffffffffffffffffffffffffffffffff166101fc565b6101026102733660046126c1565b6108ce565b6101026102863660046126c1565b6108df565b6101026102993660046126fc565b6108f0565b6102a6610c3a565b6102ba816020015182608001516000610c84565b50565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526103796102f58484610d5b565b6040805160a08101825282546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff16151593830193909352600190930154808316606083015292909204166080820152610d8b565b90505b92915050565b604051806060016040528060238152602001612cab6023913981565b6103a6610e3d565b60005b82518110156104845760008382815181106103c6576103c6612830565b602002602001015160200151905060008483815181106103e8576103e8612830565b6020908102919091018101515167ffffffffffffffff811660009081526004909252604090912090915061041c9083610e8e565b1561047a576040805167ffffffffffffffff8316815273ffffffffffffffffffffffffffffffffffffffff841660208201527f530cabd30786b7235e124a6c0db77e0b685ef22813b1fe87554247f404eb8ed6910160405180910390a15b50506001016103a9565b5060005b81518110156105f75760008282815181106104a5576104a5612830565b602002602001015160000151905060008383815181106104c7576104c7612830565b6020026020010151602001519050600082602001519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061051857508151155b8061054a5750604080516000602082015201604051602081830303815290604052805190602001208280519060200120145b15610581576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825167ffffffffffffffff811660009081526004602052604090206105a7908385610eb0565b156105e8577fad72a792d2a307f400c278be7deaeec6964276783304580cdc4e905436b8d5c58184846040516105df9392919061285f565b60405180910390a15b50505050806001019050610488565b505050565b60606106086002610edd565b905090565b67ffffffffffffffff81166000908152600460205260408120606091829161063490610eea565b90508067ffffffffffffffff81111561064f5761064f611e5a565b604051908082528060200260200182016040528015610678578160200160208202803683370190505b5092508067ffffffffffffffff81111561069457610694611e5a565b6040519080825280602002602001820160405280156106c757816020015b60608152602001906001900390816106b25790505b50915060005b818110156107735767ffffffffffffffff8516600090815260046020526040812081906106fa9084610ef5565b915091508186848151811061071157610711612830565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508085848151811061075e5761075e612830565b602090810291909101015250506001016106cd565b5050915091565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107cb576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610850610e3d565b6102ba81610f14565b610861610c3a565b6108ca8261087260408401846128a8565b808060200260200160405190810160405280939291908181526020016000905b828210156108be576108af60408302860136819003810190612910565b81526020019060010190610892565b50505050506001610c84565b5050565b6108d6610e3d565b6102ba816110a0565b6108e7610e3d565b6102ba81611166565b6108f8610e3d565b60005b81518110156108ca57600082828151811061091857610918612830565b6020908102919091010151604081015181519192509067ffffffffffffffff8116600003610972576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083015160006109838383610d5b565b8054909150700100000000000000000000000000000000900463ffffffff16600003610bdc576109b484600061122a565b6040805160a081018252602080870180516fffffffffffffffffffffffffffffffff908116845263ffffffff421692840192909252875115158385015251811660608301529186015190911660808201528215610af55767ffffffffffffffff8416600090815260066020908152604091829020835160028201805493860151948601516fffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff00000000000000000000000000000000000000009095169490941770010000000000000000000000000000000063ffffffff9096168602177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000941515949094029390931790925560608401516080850151908316921690920217600390910155610bd6565b67ffffffffffffffff84166000908152600660209081526040918290208351815492850151938501516fffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff00000000000000000000000000000000000000009094169390931770010000000000000000000000000000000063ffffffff9095168502177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000093151593909302929092178155606084015160808501519083169216909202176001909101555b50610be6565b610be68185611363565b8267ffffffffffffffff167ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b978386604051610c2292919061292c565b60405180910390a250505050508060010190506108fb565b610c45600233611512565b610c82576040517fd86ad9cf0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b565b6000610c908483610d5b565b805490915074010000000000000000000000000000000000000000900460ff1615610d55576000805b8451811015610d4057610d04858281518110610cd757610cd7612830565b6020908102919091018101515167ffffffffffffffff891660009081526004909252604090912090611541565b15610d3857610d2b858281518110610d1e57610d1e612830565b6020026020010151611563565b610d35908361299f565b91505b600101610cb9565b508015610d5357610d538282600061169f565b505b50505050565b67ffffffffffffffff821660009081526006602052604081208215610d8457600201905061037c565b905061037c565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152610e1982606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642610dfd91906129b2565b85608001516fffffffffffffffffffffffffffffffff16611a22565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c82576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103798373ffffffffffffffffffffffffffffffffffffffff8416611a4a565b6000610ed38473ffffffffffffffffffffffffffffffffffffffff851684611a6e565b90505b9392505050565b60606000610ed683611a93565b600061037c82611aef565b600060608180610f058686611afa565b909450925050505b9250929050565b602081015160005b8151811015610faf576000828281518110610f3957610f39612830565b60200260200101519050610f57816002611bb790919063ffffffff16565b15610fa65760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101610f1c565b50815160005b8151811015610d55576000828281518110610fd257610fd2612830565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611042576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61104d600282611bd9565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101610fb5565b73ffffffffffffffffffffffffffffffffffffffff81166110ed576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac9060200160405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff8216036111b5576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8151156112f15781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611280575060408201516fffffffffffffffffffffffffffffffff16155b156112b957816040517f8020d124000000000000000000000000000000000000000000000000000000008152600401610c7991906129c5565b80156108ca576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff1615158061132a575060208201516fffffffffffffffffffffffffffffffff1615155b156108ca57816040517fd68af9cc000000000000000000000000000000000000000000000000000000008152600401610c7991906129c5565b815460009061138c90700100000000000000000000000000000000900463ffffffff16426129b2565b9050801561142e57600183015483546113d4916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416611a22565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354611454916fffffffffffffffffffffffffffffffff9081169116611bfb565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906115059084906129c5565b60405180910390a1505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610379565b60006103798373ffffffffffffffffffffffffffffffffffffffff8416611c11565b60055481516040517fd02641a000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526000928392169063d02641a0906024016040805180830381865afa1580156115d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fb9190612a01565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036116715782516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610c79565b6020830151610ed6907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690611c1d565b825474010000000000000000000000000000000000000000900460ff1615806116c6575081155b156116d057505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061171690700100000000000000000000000000000000900463ffffffff16426129b2565b905080156117d65781831115611758576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546117929083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16611a22565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b8482101561188d5773ffffffffffffffffffffffffffffffffffffffff8416611835576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610c79565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610c79565b848310156119a05760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906118d190826129b2565b6118db878a6129b2565b6118e5919061299f565b6118ef9190612a6c565b905073ffffffffffffffffffffffffffffffffffffffff8616611948576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610c79565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610c79565b6119aa85846129b2565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000611a4185611a328486612aa7565b611a3c908761299f565b611bfb565b95945050505050565b60008181526002830160205260408120611a649082611e0c565b6103798383611c5a565b60008281526002840160205260408120611a888382612b61565b50610ed38484611c66565b606081600001805480602002602001604051908101604052809291908181526020018280548015611ae357602002820191906000526020600020905b815481526020019060010190808311611acf575b50505050509050919050565b600061037c82611c72565b6000606081611b098585611c7c565b60008181526002870160205260409020805491925082918190611b2b90612abe565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5790612abe565b8015611ba45780601f10611b7957610100808354040283529160200191611ba4565b820191906000526020600020905b815481529060010190602001808311611b8757829003601f168201915b5050505050905092509250509250929050565b60006103798373ffffffffffffffffffffffffffffffffffffffff8416611c88565b60006103798373ffffffffffffffffffffffffffffffffffffffff8416611d7b565b6000818310611c0a5781610379565b5090919050565b60006103798383611dca565b6000670de0b6b3a7640000611c50837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616612aa7565b6103799190612a6c565b60006103798383611c88565b60006103798383611d7b565b600061037c825490565b60006103798383611de2565b60008181526001830160205260408120548015611d71576000611cac6001836129b2565b8554909150600090611cc0906001906129b2565b9050818114611d25576000866000018281548110611ce057611ce0612830565b9060005260206000200154905080876000018481548110611d0357611d03612830565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611d3657611d36612c7b565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061037c565b600091505061037c565b6000818152600183016020526040812054611dc25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561037c565b50600061037c565b60008181526001830160205260408120541515610379565b6000826000018281548110611df957611df9612830565b9060005260206000200154905092915050565b508054611e1890612abe565b6000825580601f10611e28575050565b601f0160209004906000526020600020908101906102ba91905b80821115611e565760008155600101611e42565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611eac57611eac611e5a565b60405290565b60405160a0810167ffffffffffffffff81118282101715611eac57611eac611e5a565b6040516060810167ffffffffffffffff81118282101715611eac57611eac611e5a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611f3f57611f3f611e5a565b604052919050565b803567ffffffffffffffff81168114611f5f57600080fd5b919050565b600082601f830112611f7557600080fd5b813567ffffffffffffffff811115611f8f57611f8f611e5a565b611fc060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611ef8565b818152846020838601011115611fd557600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff82111561200c5761200c611e5a565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114611f5f57600080fd5b60006040828403121561204c57600080fd5b612054611e89565b905061205f82612016565b81526020820135602082015292915050565b600082601f83011261208257600080fd5b8135602061209761209283611ff2565b611ef8565b8083825260208201915060208460061b8701019350868411156120b957600080fd5b602086015b848110156120de576120d0888261203a565b8352918301916040016120be565b509695505050505050565b6000602082840312156120fb57600080fd5b813567ffffffffffffffff8082111561211357600080fd5b9083019060a0828603121561212757600080fd5b61212f611eb2565b8235815261213f60208401611f47565b602082015260408301358281111561215657600080fd5b61216287828601611f64565b60408301525060608301358281111561217a57600080fd5b61218687828601611f64565b60608301525060808301358281111561219e57600080fd5b6121aa87828601612071565b60808301525095945050505050565b80358015158114611f5f57600080fd5b600080604083850312156121dc57600080fd5b6121e583611f47565b91506121f3602084016121b9565b90509250929050565b6000815180845260005b8181101561222257602081850181015186830182015201612206565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061037960208301846121fc565b60006040828403121561228557600080fd5b61228d611e89565b905061229882611f47565b81526122a660208301612016565b602082015292915050565b600082601f8301126122c257600080fd5b813560206122d261209283611ff2565b82815260059290921b840181019181810190868411156122f157600080fd5b8286015b848110156120de57803567ffffffffffffffff808211156123165760008081fd5b81890191506060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d0301121561234f5760008081fd5b612357611e89565b6123638c898601612273565b81529083013590828211156123785760008081fd5b6123868c8984870101611f64565b8189015286525050509183019183016122f5565b60008060408084860312156123ae57600080fd5b833567ffffffffffffffff808211156123c657600080fd5b818601915086601f8301126123da57600080fd5b813560206123ea61209283611ff2565b8083825260208201915060208460061b87010193508a84111561240c57600080fd5b6020860195505b83861015612434576124258b87612273565b82529486019490820190612413565b9750505050602086013592508083111561244d57600080fd5b505061245b858286016122b1565b9150509250929050565b60008151808452602080850194506020840160005b838110156124ac57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161247a565b509495945050505050565b6020815260006103796020830184612465565b6000602082840312156124dc57600080fd5b61037982611f47565b6040815260006124f86040830185612465565b6020838203818501528185518084528284019150828160051b85010183880160005b83811015612566577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08784030185526125548383516121fc565b9486019492509085019060010161251a565b50909998505050505050505050565b600082601f83011261258657600080fd5b8135602061259661209283611ff2565b8083825260208201915060208460051b8701019350868411156125b857600080fd5b602086015b848110156120de576125ce81612016565b83529183019183016125bd565b6000602082840312156125ed57600080fd5b813567ffffffffffffffff8082111561260557600080fd5b908301906040828603121561261957600080fd5b612621611e89565b82358281111561263057600080fd5b61263c87828601612575565b82525060208301358281111561265157600080fd5b61265d87828601612575565b60208301525095945050505050565b6000806040838503121561267f57600080fd5b61268883611f47565b9150602083013567ffffffffffffffff8111156126a457600080fd5b830160a081860312156126b657600080fd5b809150509250929050565b6000602082840312156126d357600080fd5b61037982612016565b80356fffffffffffffffffffffffffffffffff81168114611f5f57600080fd5b6000602080838503121561270f57600080fd5b823567ffffffffffffffff81111561272657600080fd5b8301601f8101851361273757600080fd5b803561274561209282611ff2565b81815260a0918202830184019184820191908884111561276457600080fd5b938501935b8385101561282457848903818112156127825760008081fd5b61278a611ed5565b61279387611f47565b81526127a08888016121b9565b8882015260406060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0850112156127d85760008081fd5b6127e0611ed5565b93506127ed828a016121b9565b84526127fa818a016126dc565b8a8501525061280b608089016126dc565b8382015281019190915283529384019391850191612769565b50979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff8416815260606020820152600061288260608301856121fc565b905073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128dd57600080fd5b83018035915067ffffffffffffffff8211156128f857600080fd5b6020019150600681901b3603821315610f0d57600080fd5b60006040828403121561292257600080fd5b610379838361203a565b821515815260808101610ed660208301848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561037c5761037c612970565b8181038181111561037c5761037c612970565b6060810161037c82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b600060408284031215612a1357600080fd5b612a1b611e89565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114612a4757600080fd5b8152602083015163ffffffff81168114612a6057600080fd5b60208201529392505050565b600082612aa2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761037c5761037c612970565b600181811c90821680612ad257607f821691505b602082108103612b0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156105f7576000816000526020600020601f850160051c81016020861015612b3a5750805b601f850160051c820191505b81811015612b5957828155600101612b46565b505050505050565b815167ffffffffffffffff811115612b7b57612b7b611e5a565b612b8f81612b898454612abe565b84612b11565b602080601f831160018114612be25760008415612bac5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612b59565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612c2f57888601518255948401946001909101908401612c10565b5085821015612c6b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4d756c7469416767726567617465526174654c696d6974657220312e362e302d646576a164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"authorizedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyRateLimiterConfigUpdates\",\"inputs\":[{\"name\":\"rateLimiterUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.RateLimiterConfigArgs[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"currentRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllRateLimitTokens\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"localTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"remoteTokens\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeQuoter\",\"inputs\":[],\"outputs\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onInboundMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onOutboundMessage\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setFeeQuoter\",\"inputs\":[{\"name\":\"newFeeQuoter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateRateLimitTokens\",\"inputs\":[{\"name\":\"removes\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"adds\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.RateLimitTokenArgs[]\",\"components\":[{\"name\":\"localTokenArgs\",\"type\":\"tuple\",\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeQuoterSet\",\"inputs\":[{\"name\":\"newFeeQuoter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimiterConfigUpdated\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenAggregateRateLimitAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenAggregateRateLimitRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PriceNotFoundForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x60806040523461026457612f548038038061001981610269565b928339810190604081830312610264576100328161028e565b602082015190916001600160401b03821161026457019180601f84011215610264578251926001600160401b038411610225578360051b90602080610078818501610269565b80978152019282010192831161026457602001905b82821061024c57505050331561023b57600180546001600160a01b0319163317905560206100ba81610269565b60008152600036813760408051949085016001600160401b03811186821017610225576040528452808285015260005b8151811015610151576001906001600160a01b0361010882856102a2565b511684610114826102e4565b610121575b5050016100ea565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a13884610119565b5050915160005b81518110156101c9576001600160a01b0361017382846102a2565b51169081156101b8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef85836101aa6001956103e2565b50604051908152a101610158565b6342bcdf7f60e11b60005260046000fd5b50506001600160a01b03169081156101b857600580546001600160a01b031916831790556040519182527f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac91a1604051612b1190816104438239f35b634e487b7160e01b600052604160045260246000fd5b639b15e16f60e01b60005260046000fd5b602080916102598461028e565b81520191019061008d565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761022557604052565b51906001600160a01b038216820361026457565b80518210156102b65760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156102b65760005260206000200190600090565b60008181526003602052604090205480156103db5760001981018181116103c5576002546000198101919082116103c557808203610374575b505050600254801561035e57600019016103388160026102cc565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6103ad6103856103969360026102cc565b90549060031b1c92839260026102cc565b819391549060031b91821b91600019901b19161790565b9055600052600360205260406000205538808061031d565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8060005260036020526040600020541560001461043c57600254680100000000000000008110156102255761042361039682600185940160025560026102cc565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816308d450a114611ca3575080630a35bcc414611b72578063181f5a7714611ace5780631af18b7b1461156c5780632451a627146114bf578063537e304e146111f557806379ba50971461110c5780638da5cb5b146110ba57806391a2749a14610efc578063e0a0e50614610bbb578063e145291614610b69578063e835232b14610a8d578063f2fde38b1461099d5763fe843cd0146100b957600080fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985736602382011215610998578060040135610113816120da565b916101216040519384611ff8565b818352602460a06020850193028201019036821161099857602401915b8183106108ea578361014e61243d565b6000905b80518210156108e8576101658282612345565b519160408301519267ffffffffffffffff8151169081156108be576020015115156101908183612408565b805463ffffffff8160801c16801560001461066757505085516000915015610592576fffffffffffffffffffffffffffffffff6040870151166fffffffffffffffffffffffffffffffff602088015116811090811591610589575b50610526577ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b979161042960019697608093505b6fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116825115159160405161025d81611fa4565b828152602081019363ffffffff4216855260408201908152606082019384528882019283528a886000146104315760036103ef966103816fffffffffffffffffffffffffffffffff969587958695600052600660205261033a63ffffffff604060002095888060028901965116167fffffffffffffffffffffffffffffffff00000000000000000000000000000000865416178555511683907fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff73ffffffff0000000000000000000000000000000083549260801b169116179055565b5181547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016179055565b01945116167fffffffffffffffffffffffffffffffff0000000000000000000000000000000084541617835551166fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60405192835260208301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba20190610152565b8d6fffffffffffffffffffffffffffffffff949361038186946104da63ffffffff6105219b8897600052600660205287806040600020975116167fffffffffffffffffffffffffffffffff00000000000000000000000000000000875416178655511684907fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff73ffffffff0000000000000000000000000000000083549260801b169116179055565b5182547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178255565b6103ef565b606486610587604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b905015876101eb565b506fffffffffffffffffffffffffffffffff60408601511615801590610648575b6105e75760807ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b97916104296001969761021e565b606485610587604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff60208601511615156105b3565b6001969761079c6080947ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b9796946106a16104299542612430565b9081610804575b50506fffffffffffffffffffffffffffffffff8a8160208601511692828154168085106000146107fc57508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556107508651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1960606040516107f681856fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba16103ef565b8380916106d7565b6fffffffffffffffffffffffffffffffff916108388392838f6108319088015494828616958e1c906126f0565b91166123cc565b808210156108b757505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff00000000000000000000000000000000161781558b806106a8565b9050610842565b7fc65608950000000000000000000000000000000000000000000000000000000060005260046000fd5b005b82360360a081126109985760607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06040519261092584611fdc565b61092e87612050565b845261093c602088016121ac565b602085015201126109985760a09160209160405161095981611fdc565b610965604088016121ac565b8152610973606088016122fd565b84820152610983608088016122fd565b6040820152604082015281520192019161013e565b600080fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985773ffffffffffffffffffffffffffffffffffffffff6109e96120f2565b6109f161243d565b16338114610a6357807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985773ffffffffffffffffffffffffffffffffffffffff610ad96120f2565b610ae161243d565b168015610b3f576020817f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac927fffffffffffffffffffffffff00000000000000000000000000000000000000006005541617600555604051908152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857610bf2612039565b60243567ffffffffffffffff8111610998578036039060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261099857610c3a612388565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60448201359201821215610998570160048101359067ffffffffffffffff8211610998576024018160061b3603811361099857610c99913691612136565b90610ca5600182612408565b9160ff835460a01c16610cb457005b6000929167ffffffffffffffff16835b8251811015610ee857816000526004602052610d16604060002073ffffffffffffffffffffffffffffffffffffffff610cfd8487612345565b5151169060019160005201602052604060002054151590565b610d23575b600101610cc4565b93610d2e8584612345565b5173ffffffffffffffffffffffffffffffffffffffff60055416604073ffffffffffffffffffffffffffffffffffffffff83511660248251809481937fd02641a000000000000000000000000000000000000000000000000000000000835260048301525afa8015610edc57600090610e3c575b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505116908115610df75791670de0b6b3a7640000610de8610def9360206001960151906126f0565b04906123cc565b949050610d1b565b73ffffffffffffffffffffffffffffffffffffffff9051167f9a655f7b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040823d8211610ed4575b81610e5460409383611ff8565b81010312610ecd5760405191610e6983611fc0565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610ed0578352602001519063ffffffff82168203610ecd575060208201527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90610da2565b80fd5b8280fd5b3d9150610e47565b6040513d6000823e3d90fd5b5050509080610ef357005b6108e891612488565b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126109985760405190610f7682611fc0565b806004013567ffffffffffffffff811161099857610f9a9060043691840101612298565b825260248101359067ffffffffffffffff8211610998576004610fc09236920101612298565b60208201908152610fcf61243d565b519060005b8251811015611047578073ffffffffffffffffffffffffffffffffffffffff610fff60019386612345565b511661100a81612785565b611016575b5001610fd4565b60207fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a18461100f565b505160005b81518110156108e85773ffffffffffffffffffffffffffffffffffffffff6110748284612345565b5116908115610b3f577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6020836110ac600195612a4f565b50604051908152a10161104c565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760005473ffffffffffffffffffffffffffffffffffffffff811633036111cb577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985767ffffffffffffffff611235612039565b168060005260046020526040600020549061124f826120da565b9161125d6040519384611ff8565b8083527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061128a826120da565b0136602085013761129a816120da565b916112a86040519384611ff8565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06112d5836120da565b0160005b8181106114ae57505060005b82811061138457611305858560405192839260408452604084019061224e565b8281036020840152815180825260208201916020808360051b8301019401926000915b8383106113355786860387f35b919395509193602080611372837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301875289516121b9565b97019301930190928695949293611328565b8160005260046020526040600020600261139e838361276d565b90549060031b1c918260005201602052604060002090604051916000908054906113c782612703565b8086529160018116908115611469575060011461142f575b505082916114076001959473ffffffffffffffffffffffffffffffffffffffff930384611ff8565b166114128389612345565b5261141d8287612345565b526114288186612345565b50016112e5565b6000908152602081209092505b8183106114535750508201602001816114076113df565b600181602092548386890101520192019161143c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208088019190915292151560051b8601909201925083915061140790506113df565b8060606020809388010152016112d9565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b818110611556576115528561153e81870382611ff8565b60405191829160208352602083019061224e565b0390f35b8254845260209093019260019283019201611527565b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985736602382011215610998578060040135906115c7826120da565b916115d56040519384611ff8565b8083526024602084019160061b8301019136831161099857602401905b828210611ab4576024358467ffffffffffffffff82116109985736602383011215610998578160040135611625816120da565b926116336040519485611ff8565b8184526024602085019260051b820101903682116109985760248101925b828410611a2157858561166261243d565b60005b815181101561176d578073ffffffffffffffffffffffffffffffffffffffff602061169260019486612345565b5101511667ffffffffffffffff6116a98386612345565b515116908160005260046020526116e7816040600020816000526002810160205260406000206116d98154612703565b908161172b575b505061291b565b6116f4575b505001611665565b7f530cabd30786b7235e124a6c0db77e0b685ef22813b1fe87554247f404eb8ed69160409182519182526020820152a184806116ec565b81601f600093118a146117425750555b89806116e0565b8183526020832061175d91601f0160051c8101908b01612756565b808252816020812091555561173b565b8260005b81518110156108e8576117848183612345565b515160206117928385612345565b51015173ffffffffffffffffffffffffffffffffffffffff6020830151169182158015611a18575b80156119ec575b610b3f5767ffffffffffffffff905116806000526004602052604060002083600052600281016020526040600020835167ffffffffffffffff81116119bd5761180a8254612703565b601f8111611980575b506020601f82116001146118d5579261186d9282889796959360019a99946000916118ca575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828c1b9260031b1c1916179055612aaf565b61187b575b50505001611771565b7fad72a792d2a307f400c278be7deaeec6964276783304580cdc4e905436b8d5c5926118b960405193849384526060602085015260608401906121b9565b9060408301520390a1838080611872565b90508701518c611839565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110611968575083899897969361186d969360019c9b968d9410611931575b5050811b019055612aaf565b8901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c80611925565b9192602060018192868c015181550194019201611905565b6119ad90836000526020600020601f840160051c810191602085106119b3575b601f0160051c0190612756565b88611813565b90915081906119a0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b508151602083012060405160208101906000825260208152611a0f604082611ff8565b519020146117c1565b508151156117ba565b833567ffffffffffffffff811161099857820160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82360301126109985760405191611a6d83611fc0565b611a7a3660248401612218565b835260648201359267ffffffffffffffff841161099857611aa5602094936024869536920101612065565b83820152815201930192611651565b6020604091611ac33685612218565b8152019101906115f2565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857611552604051611b0e606082611ff8565b602381527f4d756c7469416767726567617465526174654c696d6974657220312e362e302d60208201527f646576000000000000000000000000000000000000000000000000000000000060408201526040519182916020835260208301906121b9565b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857611ba9612039565b6024359081151582036109985760a091611bcb91611bc561231a565b50612408565b6fffffffffffffffffffffffffffffffff60405191611be983611fa4565b8181549181831685526001602086019163ffffffff8560801c16835260ff6040880195891c161515855201549263ffffffff60608701928486168452608088019560801c8652611c3761231a565b508480855116611c64828b5116611c5e611c548787511642612430565b858c5116906126f0565b906123cc565b80821015611c9c57505b1680985281421681526040519788525116602087015251151560408601525116606084015251166080820152f35b9050611c6e565b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261099857611d1982611fa4565b80600401358252611d2c60248201612050565b9060208301918252604481013567ffffffffffffffff811161099857611d589060043691840101612065565b6040840152606481013567ffffffffffffffff811161099857611d819060043691840101612065565b606084015260848101359067ffffffffffffffff821161099857019036602383011215610998576080611dc767ffffffffffffffff933690602460048201359101612136565b9301928352611dd4612388565b51169051611de3600083612408565b9060ff825460a01c16611df257005b60009260005b8251811015610ee857816000526004602052611e31604060002073ffffffffffffffffffffffffffffffffffffffff610cfd8487612345565b611e3e575b600101611df8565b93611e498584612345565b5173ffffffffffffffffffffffffffffffffffffffff60055416604073ffffffffffffffffffffffffffffffffffffffff83511660248251809481937fd02641a000000000000000000000000000000000000000000000000000000000835260048301525afa8015610edc57600090611f0b575b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505116908115610df75791670de0b6b3a7640000610de8611f039360206001960151906126f0565b949050611e36565b6040823d8211611f9c575b81611f2360409383611ff8565b81010312610ecd5760405191611f3883611fc0565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610ed0578352602001519063ffffffff82168203610ecd575060208201527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90611ebd565b3d9150611f16565b60a0810190811067ffffffffffffffff8211176119bd57604052565b6040810190811067ffffffffffffffff8211176119bd57604052565b6060810190811067ffffffffffffffff8211176119bd57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176119bd57604052565b6004359067ffffffffffffffff8216820361099857565b359067ffffffffffffffff8216820361099857565b81601f820112156109985780359067ffffffffffffffff82116119bd57604051926120b8601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200185611ff8565b8284526020838301011161099857816000926020809301838601378301015290565b67ffffffffffffffff81116119bd5760051b60200190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361099857565b359073ffffffffffffffffffffffffffffffffffffffff8216820361099857565b929192612142826120da565b936121506040519586611ff8565b602085848152019260061b82019181831161099857925b8284106121745750505050565b604084830312610998576020604091825161218e81611fc0565b61219787612115565b81528287013583820152815201930192612167565b3590811515820361099857565b919082519283825260005b8481106122035750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016121c4565b91908260409103126109985760405161223081611fc0565b602061224981839561224181612050565b855201612115565b910152565b906020808351928381520192019060005b81811061226c5750505090565b825173ffffffffffffffffffffffffffffffffffffffff1684526020938401939092019160010161225f565b9080601f830112156109985781356122af816120da565b926122bd6040519485611ff8565b81845260208085019260051b82010192831161099857602001905b8282106122e55750505090565b602080916122f284612115565b8152019101906122d8565b35906fffffffffffffffffffffffffffffffff8216820361099857565b6040519061232782611fa4565b60006080838281528260208201528260408201528260608201520152565b80518210156123595760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3360005260036020526040600020541561239e57565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b919082018092116123d957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff16600052600660205260406000209060001461242d5760020190565b90565b919082039182116123d957565b73ffffffffffffffffffffffffffffffffffffffff60015416330361245e57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b805460ff8160a01c161580156126e8575b6126e3576fffffffffffffffffffffffffffffffff811690600183019081546124de63ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642612430565b9081612645575b5050848110612613575083821061256a5750916020916fffffffffffffffffffffffffffffffff80612538847f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a97612430565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b5460801c6125788285612430565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018281116123d9576125ab916123cc565b9080156125e45790047f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b84907ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8285929395116126b95761266092611c5e9160801c906126f0565b808310156126b45750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806124e5565b61266b565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b505050565b508215612499565b818102929181159184041417156123d957565b90600182811c9216801561274c575b602083101461271d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612712565b818110612761575050565b60008155600101612756565b80548210156123595760005260206000200190600090565b6000818152600360205260409020548015612914577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116123d957600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116123d9578082036128a5575b5050506002548015612876577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161283381600261276d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6128fc6128b66128c793600261276d565b90549060031b1c928392600261276d565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806127fa565b5050600090565b9060018201918160005282602052604060002054801515600014612a46577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116123d9578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116123d957808203612a0f575b50505080548015612876577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906129d0828261276d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b612a2f612a1f6128c7938661276d565b90549060031b1c9283928661276d565b905560005283602052604060002055388080612998565b50505050600090565b80600052600360205260406000205415600014612aa957600254680100000000000000008110156119bd57612a906128c7826001859401600255600261276d565b9055600254906000526003602052604060002055600190565b50600090565b600082815260018201602052604090205461291457805490680100000000000000008210156119bd5782612aed6128c784600180960185558461276d565b90558054926000520160205260406000205560019056fea164736f6c634300081a000a",
}
var MultiAggregateRateLimiterABI = MultiAggregateRateLimiterMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go b/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go
index 3d43d16d520..5a06ea5bea5 100644
--- a/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go
+++ b/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go
@@ -58,8 +58,8 @@ type MultiOCR3BaseOracle struct {
}
var MultiOCR3HelperMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"AfterConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"oracleAddress\",\"type\":\"address\"}],\"name\":\"getOracle\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"},{\"internalType\":\"enumMultiOCR3Base.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"structMultiOCR3Base.Oracle\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"setTransmitOcrPluginType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[2]\",\"name\":\"reportContext\",\"type\":\"bytes32[2]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmitWithSignatures\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[2]\",\"name\":\"reportContext\",\"type\":\"bytes32[2]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"transmitWithoutSignatures\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x60a060405234801561001057600080fd5b503360008161003257604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0384811691909117909155811615610062576100628161006d565b5050466080526100e6565b336001600160a01b0382160361009657604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b608051611d256200010960003960008181610edd0152610f290152611d256000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637ac0aa1a11610076578063c673e5841161005b578063c673e584146101c5578063f2fde38b146101e5578063f716f99f146101f857600080fd5b80637ac0aa1a1461015b5780638da5cb5b1461019d57600080fd5b806334a9c92e116100a757806334a9c92e146101205780633ecdb95b1461014057806379ba50971461015357600080fd5b806310061068146100c3578063181f5a77146100d8575b600080fd5b6100d66100d1366004611524565b61020b565b005b604080518082018252601981527f4d756c74694f4352334261736548656c70657220312e302e3000000000000000602082015290516101179190611578565b60405180910390f35b61013361012e36600461161f565b61023a565b6040516101179190611681565b6100d661014e3660046116f4565b6102ca565b6100d661034d565b6100d66101693660046117a7565b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055565b60015460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b6101d86101d33660046117a7565b61041b565b604051610117919061181b565b6100d66101f33660046118ae565b610593565b6100d6610206366004611a1a565b6105a7565b604080516000808252602082019092526004549091506102349060ff16858585858060006105e9565b50505050565b6040805180820182526000808252602080830182905260ff86811683526003825284832073ffffffffffffffffffffffffffffffffffffffff871684528252918490208451808601909552805480841686529394939092918401916101009091041660028111156102ad576102ad611652565b60028111156102be576102be611652565b90525090505b92915050565b60045460408051602080880282810182019093528782526103439360ff16928c928c928c928c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a92506105e9915050565b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461039e576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61045e6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561051457602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116104e9575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561058357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610558575b5050505050815250509050919050565b61059b610972565b6105a4816109c5565b50565b6105af610972565b60005b81518110156105e5576105dd8282815181106105d0576105d0611b83565b6020026020010151610a89565b6001016105b2565b5050565b60ff87811660009081526002602090815260408083208151608081018352815481526001909101548086169382019390935261010083048516918101919091526201000090910490921615156060830152873590610648876084611be1565b9050826060015115610690578451610661906020611bf4565b865161066e906020611bf4565b6106799060a0611be1565b6106839190611be1565b61068d9082611be1565b90505b3681146106d7576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044015b60405180910390fd5b508151811461071f5781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016106ce565b610727610eda565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561077557610775611652565b600281111561078657610786611652565b90525090506002816020015160028111156107a3576107a3611652565b1480156108045750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff16815481106107df576107df611b83565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b61083a576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081606001511561091c576020820151610855906001611c0b565b60ff16855114610891576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83518551146108cc576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600087876040516108de929190611c24565b6040519081900381206108f5918b90602001611c34565b60405160208183030381529060405280519060200120905061091a8a82888888610f5b565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146109c3576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b3373ffffffffffffffffffffffffffffffffffffffff821603610a14576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003610acd5760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ce9190611c48565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003610b3a57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055610b8f565b6060840151600182015460ff6201000090910416151590151514610b8f576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016106ce565b60a084015180516101001015610bd45760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ce9190611c48565b8051600003610c125760056040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ce9190611c48565b610c858484600301805480602002602001604051908101604052809291908181526020018280548015610c7b57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610c50575b505050505061116b565b846060015115610e2a57610d008484600201805480602002602001604051908101604052809291908181526020018280548015610c7b5760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610c5057505050505061116b565b608085015180516101001015610d455760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ce9190611c48565b6040860151610d55906003611c62565b60ff16815111610d945760036040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ce9190611c48565b815181511015610dd35760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ce9190611c48565b80516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841602179055610e1b906002860190602084019061142b565b50610e2885826001611203565b505b610e3684826002611203565b8051610e4b906003850190602084019061142b565b506040858101516001840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f54793610ec29389939260028a01929190611c85565b60405180910390a1610ed3846113f2565b5050505050565b467f0000000000000000000000000000000000000000000000000000000000000000146109c3576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106ce565b8251600090815b81811015610343576000600188868460208110610f8157610f81611b83565b610f8e91901a601b611c0b565b898581518110610fa057610fa0611b83565b6020026020010151898681518110610fba57610fba611b83565b602002602001015160405160008152602001604052604051610ff8949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561101a573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff8516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156110a6576110a6611652565b60028111156110b7576110b7611652565b90525090506001816020015160028111156110d4576110d4611652565b1461110b576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b85161561114e576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050610f62565b60005b81518110156111fe5760ff8316600090815260036020526040812083519091908490849081106111a0576111a0611b83565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161116e565b505050565b60005b825181101561023457600083828151811061122357611223611b83565b602002602001015190506000600281111561124057611240611652565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054610100900416600281111561128c5761128c611652565b146112c65760046040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ce9190611c48565b73ffffffffffffffffffffffffffffffffffffffff8116611313576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561133957611339611652565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156113de576113de611652565b021790555090505050806001019050611206565b60405160ff821681527f897ac1b2c12867721b284f3eb147bd4ab046d4eef1cf31c1d8988bfcfb962b539060200160405180910390a150565b8280548282559060005260206000209081019282156114a5579160200282015b828111156114a557825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061144b565b506114b19291506114b5565b5090565b5b808211156114b157600081556001016114b6565b80604081018310156102c457600080fd5b60008083601f8401126114ed57600080fd5b50813567ffffffffffffffff81111561150557600080fd5b60208301915083602082850101111561151d57600080fd5b9250929050565b60008060006060848603121561153957600080fd5b61154385856114ca565b9250604084013567ffffffffffffffff81111561155f57600080fd5b61156b868287016114db565b9497909650939450505050565b60006020808352835180602085015260005b818110156115a65785810183015185820160400152820161158a565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803560ff811681146115f657600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146115f657600080fd5b6000806040838503121561163257600080fd5b61163b836115e5565b9150611649602084016115fb565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815160ff16815260208201516040820190600381106116a2576116a2611652565b8060208401525092915050565b60008083601f8401126116c157600080fd5b50813567ffffffffffffffff8111156116d957600080fd5b6020830191508360208260051b850101111561151d57600080fd5b60008060008060008060008060c0898b03121561171057600080fd5b61171a8a8a6114ca565b9750604089013567ffffffffffffffff8082111561173757600080fd5b6117438c838d016114db565b909950975060608b013591508082111561175c57600080fd5b6117688c838d016116af565b909750955060808b013591508082111561178157600080fd5b5061178e8b828c016116af565b999c989b50969995989497949560a00135949350505050565b6000602082840312156117b957600080fd5b6117c2826115e5565b9392505050565b60008151808452602080850194506020840160005b8381101561181057815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016117de565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a084015261186a60e08401826117c9565b905060408401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160c08501526118a582826117c9565b95945050505050565b6000602082840312156118c057600080fd5b6117c2826115fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561191b5761191b6118c9565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611968576119686118c9565b604052919050565b600067ffffffffffffffff82111561198a5761198a6118c9565b5060051b60200190565b803580151581146115f657600080fd5b600082601f8301126119b557600080fd5b813560206119ca6119c583611970565b611921565b8083825260208201915060208460051b8701019350868411156119ec57600080fd5b602086015b84811015611a0f57611a02816115fb565b83529183019183016119f1565b509695505050505050565b60006020808385031215611a2d57600080fd5b823567ffffffffffffffff80821115611a4557600080fd5b818501915085601f830112611a5957600080fd5b8135611a676119c582611970565b81815260059190911b83018401908481019088831115611a8657600080fd5b8585015b83811015611b7657803585811115611aa157600080fd5b860160c0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215611ad65760008081fd5b611ade6118f8565b8882013581526040611af18184016115e5565b8a8301526060611b028185016115e5565b8284015260809150611b15828501611994565b9083015260a08381013589811115611b2d5760008081fd5b611b3b8f8d838801016119a4565b838501525060c0840135915088821115611b555760008081fd5b611b638e8c848701016119a4565b9083015250845250918601918601611a8a565b5098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156102c4576102c4611bb2565b80820281158282048414176102c4576102c4611bb2565b60ff81811683821601908111156102c4576102c4611bb2565b8183823760009101908152919050565b828152604082602083013760600192915050565b6020810160068310611c5c57611c5c611652565b91905290565b60ff8181168382160290811690818114611c7e57611c7e611bb2565b5092915050565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015611cec57845473ffffffffffffffffffffffffffffffffffffffff1683526001948501949284019201611cba565b50508481036060860152611d0081886117c9565b935050505060ff83166080830152969550505050505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getOracle\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"oracleAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.Oracle\",\"components\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"role\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.Role\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTransmitOcrPluginType\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transmitWithSignatures\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"ss\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"rawVs\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transmitWithoutSignatures\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"AfterConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]}]",
+ Bin: "0x60a080604052346051573315604057600180546001600160a01b0319163317905546608052611f2090816100578239608051818181610f2f015261169b0152f35b639b15e16f60e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806310061068146115df578063181f5a771461150f57806334a9c92e146114285780633ecdb95b14610e2d57806379ba509714610d445780637ac0aa1a14610cdc5780638da5cb5b14610c8a578063c673e58414610b2e578063f2fde38b14610a3b5763f716f99f1461008a57600080fd5b34610a365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760043567ffffffffffffffff8111610a365736602382011215610a365780600401356100e481611c1a565b916100f26040519384611bd9565b8183526024602084019260051b82010190368211610a365760248101925b82841061093b5784610120611e58565b6002906000805b82518110156109395761013a8184611dc8565b5190604082019060ff8251161561090a5760ff60208401511692836000528660205260406000206001810190815460ff8116156000146108c6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff62ff00006060860151151560101b1691161782555b60a08301928351956101008751116107dc578651156108975760038301996101eb6101de6101e58d60405192838092611d78565b0382611bd9565b8a611ea3565b6060830151610566575b60005b88518110156103b55773ffffffffffffffffffffffffffffffffffffffff610220828b611dc8565b5116908a600052600360205260ff60408060002060009073ffffffffffffffffffffffffffffffffffffffff86168252602052205460081c16600381101561032e5761038757811561035d578b6040519261027a84611b85565b60ff83168452602084019161032e578f604060ff928f8493865260005260036020528160002073ffffffffffffffffffffffffffffffffffffffff60009216825260205220945116167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008454161783555191600383101561032e576001927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0083549260081b169116179055016101f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7fd6c62c9b0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f367f56a2000000000000000000000000000000000000000000000000000000006000526004805260246000fd5b509997969091929394959781519167ffffffffffffffff83116105375768010000000000000000831161053757815483835580841061050e575b509060208d989796959493920190600052602060002060005b8381106104e157505050509360019796936104cb7fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946104bd7f897ac1b2c12867721b284f3eb147bd4ab046d4eef1cf31c1d8988bfcfb962b53999560ff60209a51169460ff86167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055519485835551916040519687968a88528b88015260a0604088015260a087019101611d78565b908482036060860152611b3b565b9060808301520390a1604051908152a101610127565b825173ffffffffffffffffffffffffffffffffffffffff16818301558e9950602090920191600101610408565b8260005283602060002091820191015b81811061052b57506103ef565b6000815560010161051e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8b840161058360405161057d816101de8186611d78565b8b611ea3565b60808401519061010082511161086957815160ff8551166003029060ff821691820361083a57111561080b5781518a51116107dc5781519087547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff008460081b16911617885567ffffffffffffffff8211610537576801000000000000000082116105375780548282558083106107b3575b506020830190600052602060002060005b8381106107895750600193600093508392509050835b61064c575b505050506101f5565b80518310156107845773ffffffffffffffffffffffffffffffffffffffff6106748483611dc8565b5116928d600052600360205260ff60408060002060009073ffffffffffffffffffffffffffffffffffffffff88168252602052205460081c16600381101561032e5761038757831561035d5782604051946106ce86611b85565b60ff83168652602086019161032e578f604060ff9283928a865260005260036020528160002073ffffffffffffffffffffffffffffffffffffffff60009216825260205220965116167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008654161785555190600382101561032e57859485927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0083549260081b169116179055019261063e565b610643565b600190602073ffffffffffffffffffffffffffffffffffffffff8551169401938184015501610628565b8160005282602060002091820191015b8181106107d05750610617565b600081556001016107c3565b7f367f56a200000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f367f56a200000000000000000000000000000000000000000000000000000000600052600360045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8d7f367f56a20000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f367f56a200000000000000000000000000000000000000000000000000000000600052600560045260246000fd5b60ff606085015115159160101c16151503156101aa57857f87f6037c0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f367f56a200000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b005b833567ffffffffffffffff8111610a3657820160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8236030112610a36576040519160c0830183811067ffffffffffffffff82111761053757604052602482013583526109ab60448301611afc565b60208401526109bc60648301611afc565b604084015260848201358015158103610a3657606084015260a482013567ffffffffffffffff8111610a36576109f89060243691850101611c32565b608084015260c48201359267ffffffffffffffff8411610a3657610a26602094936024869536920101611c32565b60a0820152815201930192610110565b600080fd5b34610a365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760043573ffffffffffffffffffffffffffffffffffffffff8116809103610a3657610a93611e58565b338114610b0457807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b34610a365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760ff610b67611aec565b606060408051610b7681611ba1565b8151610b8181611bbd565b60008152600060208201526000838201526000848201528152826020820152015216600052600260205260606040600020610c866003610c5560405193610bc785611ba1565b610bd081611d3f565b8552610c0860405191610bf183610bea8160028501611d78565b0384611bd9565b60208701928352610bea6040518096819301611d78565b6040850192835260405195869560208752518051602088015260ff602082015116604088015260ff604082015116828801520151151560808601525160c060a086015260e0850190611b3b565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160c0850152611b3b565b0390f35b34610a365760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a3657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b34610a365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760ff610d15611aec565b167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006004541617600455600080f35b34610a365760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760005473ffffffffffffffffffffffffffffffffffffffff81163303610e03577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b34610a365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365736604411610a365760443567ffffffffffffffff8111610a3657610e84903690600401611abe565b9060643567ffffffffffffffff8111610a3657610ea5903690600401611b0a565b919060843567ffffffffffffffff8111610a3657610eca610ee9913690600401611b0a565b9190610ee160a4359460ff60045416973691611cf3565b923691611cf3565b90846000526002602052610f006040600020611d3f565b9560043594610f0e82611e0b565b97606081019889516113db575b8036036113aa5750805187810361137857507f00000000000000000000000000000000000000000000000000000000000000004681036113475750876000526003602052604060002073ffffffffffffffffffffffffffffffffffffffff331660005260205260406000209860405199610f948b611b85565b5460ff81168b52610faf60ff60208d019260081c1682611ce7565b519960038b101561032e57600260009b1490816112d2575b50156112aa5751611014575b88887f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef060408a815190815267ffffffffffffffff602435166020820152a280f35b60ff611027816020875194015116611e34565b160361128257825184510361125a578761104083611cad565b9161104e6040519384611bd9565b8383526020830193368183011161125657806020928637830101525190206040516020810191825260406004818301376060815261108d608082611bd9565b51902090869281519488945b8686106110a65750610fd3565b60208610156112295760208a60806110bf858a1a611e46565b6110c98a89611dc8565b516110d48b89611dc8565b519060ff604051938c855216868401526040830152606082015282805260015afa1561121e578951898b52600360205273ffffffffffffffffffffffffffffffffffffffff60408c2091168b5260205260408a206040519061113582611b85565b5460ff8116825261115060ff602084019260081c1682611ce7565b5160038110156111f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016111c957600160ff8251161b82166111a15790600160ff819351161b17950194611099565b60048b7ff67bc7c4000000000000000000000000000000000000000000000000000000008152fd5b60048b7fca31867a000000000000000000000000000000000000000000000000000000008152fd5b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b6040513d8b823e3d90fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b8280fd5b6004887fa75d88af000000000000000000000000000000000000000000000000000000008152fd5b6004887f71253a25000000000000000000000000000000000000000000000000000000008152fd5b60048a7fda0f08e8000000000000000000000000000000000000000000000000000000008152fd5b9050898b52600260205260ff600360408d200191511690805482101561131a579073ffffffffffffffffffffffffffffffffffffffff918c5260208c2001541633148b610fc7565b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b7f0f01ce85000000000000000000000000000000000000000000000000000000006000526004524660245260446000fd5b87907f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f8e1192e1000000000000000000000000000000000000000000000000000000006000526004523660245260446000fd5b84518060051b908082046020149015171561083a576113f990611e19565b908651918260051b928084046020149015171561083a576114239261141d91611e27565b90611e27565b610f1b565b34610a365760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365761145f611aec565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610a365760ff906000602060405161149381611b85565b828152015216600052600360205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526040600020604051906114d582611b85565b5460ff811682526114f060ff602084019260081c1682611ce7565b60ff60405192511682525190600382101561032e576040916020820152f35b34610a365760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a3657604080519061154d8183611bd9565b601982527f4d756c74694f4352334261736548656c70657220312e302e30000000000000006020830152805180926020825280519081602084015260005b8281106115c85750506000828201840152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101030190f35b60208282018101518783018701528694500161158b565b34610a365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365736604411610a365760443567ffffffffffffffff8111610a3657611636903690600401611abe565b604051602092916116478483611bd9565b60008252600036813760ff6004541691826000526002855261166c6040600020611d3f565b936004359261167a81611e0b565b9560608101968751611a79575b8036036113aa57508051858103611a4757507f000000000000000000000000000000000000000000000000000000000000000046810361134757508560005260038852604060002073ffffffffffffffffffffffffffffffffffffffff33166000528852604060002096604051976116fe89611b85565b5460ff8116895261171860ff8b8b019260081c1682611ce7565b5197600389101561032e576002600099149081611a01575b50156119d9575161177d575b86867f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef06040888c825191825267ffffffffffffffff6024351690820152a280f35b60ff61178f818a875194015116611e34565b16036119b15761179e81611cad565b906117ac6040519283611bd9565b8082528782019236828201116119ad578188928a928637830101525190206040518681019182526040600481830137606081526117ea608082611bd9565b519020849082519286925b848410611802575061173c565b88841015611980578888608061181982881a611e46565b6118238887611dc8565b5161182e8988611dc8565b519060ff604051938a855216868401526040830152606082015282805260015afa1561197557875187895260038a5273ffffffffffffffffffffffffffffffffffffffff60408a20911689528952604088206040519061188d82611b85565b5460ff811682526118a760ff8c84019260081c1682611ce7565b516003811015611948577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161192057600160ff8251161b82166118f85790600160ff819351161b179301926117f5565b6004897ff67bc7c4000000000000000000000000000000000000000000000000000000008152fd5b6004897fca31867a000000000000000000000000000000000000000000000000000000008152fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b6040513d89823e3d90fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b8780fd5b6004867f71253a25000000000000000000000000000000000000000000000000000000008152fd5b6004887fda0f08e8000000000000000000000000000000000000000000000000000000008152fd5b905087895260028a5260ff600360408b2001915116908054821015611229579073ffffffffffffffffffffffffffffffffffffffff918a528a8a2001541633148a611730565b85907f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b84518060051b908082048b149015171561083a57611a9690611e19565b908551918260051b928084048c149015171561083a57611ab99261141d91611e27565b611687565b9181601f84011215610a365782359167ffffffffffffffff8311610a365760208381860195010111610a3657565b6004359060ff82168203610a3657565b359060ff82168203610a3657565b9181601f84011215610a365782359167ffffffffffffffff8311610a36576020808501948460051b010111610a3657565b906020808351928381520192019060005b818110611b595750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101611b4c565b6040810190811067ffffffffffffffff82111761053757604052565b6060810190811067ffffffffffffffff82111761053757604052565b6080810190811067ffffffffffffffff82111761053757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761053757604052565b67ffffffffffffffff81116105375760051b60200190565b9080601f83011215610a3657813590611c4a82611c1a565b92611c586040519485611bd9565b82845260208085019360051b820101918211610a3657602001915b818310611c805750505090565b823573ffffffffffffffffffffffffffffffffffffffff81168103610a3657815260209283019201611c73565b67ffffffffffffffff811161053757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600382101561032e5752565b929190611cff81611c1a565b93611d0d6040519586611bd9565b602085838152019160051b8101928311610a3657905b828210611d2f57505050565b8135815260209182019101611d23565b90604051611d4c81611bbd565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b818110611d9c5750505090565b825473ffffffffffffffffffffffffffffffffffffffff16845260209093019260019283019201611d8f565b8051821015611ddc5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b608401908160841161083a57565b60a001908160a01161083a57565b9190820180921161083a57565b60ff60019116019060ff821161083a57565b60ff601b9116019060ff821161083a57565b73ffffffffffffffffffffffffffffffffffffffff600154163303611e7957565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b91909160005b8351811015611f0d5760019060ff831660005260036020526000604080822073ffffffffffffffffffffffffffffffffffffffff611ee7858a611dc8565b511673ffffffffffffffffffffffffffffffffffffffff16835260205281205501611ea9565b5050905056fea164736f6c634300081a000a",
}
var MultiOCR3HelperABI = MultiOCR3HelperMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go b/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go
index ccd28cdd6ce..5593b55e827 100644
--- a/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go
+++ b/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go
@@ -47,8 +47,8 @@ type NonceManagerPreviousRampsArgs struct {
}
var NonceManagerMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"authorizedCallers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"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\"},{\"internalType\":\"bool\",\"name\":\"overrideExistingRamps\",\"type\":\"bool\"},{\"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: "0x60806040523480156200001157600080fd5b5060405162001ad438038062001ad4833981016040819052620000349162000449565b80336000816200005757604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008a576200008a81620000c0565b5050604080518082018252828152815160008152602080820190935291810191909152620000b8906200013a565b505062000569565b336001600160a01b03821603620000ea57604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b8151811015620001ca5760008282815181106200016357620001636200051b565b602090810291909101015190506200017d60028262000289565b15620001c0576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b5060010162000142565b50815160005b815181101562000283576000828281518110620001f157620001f16200051b565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200022f576040516342bcdf7f60e11b815260040160405180910390fd5b6200023c600282620002a9565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101620001d0565b50505050565b6000620002a0836001600160a01b038416620002c0565b90505b92915050565b6000620002a0836001600160a01b038416620003c4565b60008181526001830160205260408120548015620003b9576000620002e760018362000531565b8554909150600090620002fd9060019062000531565b9050818114620003695760008660000182815481106200032157620003216200051b565b90600052602060002001549050808760000184815481106200034757620003476200051b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200037d576200037d62000553565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620002a3565b6000915050620002a3565b60008181526001830160205260408120546200040d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620002a3565b506000620002a3565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200044457600080fd5b919050565b600060208083850312156200045d57600080fd5b82516001600160401b03808211156200047557600080fd5b818501915085601f8301126200048a57600080fd5b8151818111156200049f576200049f62000416565b8060051b604051601f19603f83011681018181108582111715620004c757620004c762000416565b604052918252848201925083810185019188831115620004e657600080fd5b938501935b828510156200050f57620004ff856200042c565b84529385019392850192620004eb565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b81810381811115620002a357634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b61155b80620005796000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806391a2749a11610081578063e0e03cae1161005b578063e0e03cae1461027c578063ea458c0c1461029f578063f2fde38b146102b257600080fd5b806391a2749a1461022a578063bf18402a1461023d578063c92236251461026957600080fd5b806379ba5097116100b257806379ba5097146101e55780637a75a094146101ef5780638da5cb5b1461020257600080fd5b8063181f5a77146100d95780632451a6271461012b578063294b563014610140575b600080fd5b6101156040518060400160405280601681526020017f4e6f6e63654d616e6167657220312e362e302d6465760000000000000000000081525081565b6040516101229190610f05565b60405180910390f35b6101336102c5565b6040516101229190610f72565b6101b161014e366004610fe2565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600460209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff9081168452600190910154169082015290565b60408051825173ffffffffffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610122565b6101ed6102d6565b005b6101ed6101fd366004610fff565b6103a4565b60015460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610122565b6101ed61023836600461118a565b610594565b61025061024b366004611231565b6105a8565b60405167ffffffffffffffff9091168152602001610122565b6102506102773660046112b3565b6105bd565b61028f61028a366004611308565b6105d4565b6040519015158152602001610122565b6102506102ad366004611231565b6106dd565b6101ed6102c036600461136d565b610771565b60606102d16002610782565b905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610327576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6103ac61078f565b60005b8181101561058f57368383838181106103ca576103ca61138a565b608002919091019150600090506004816103e76020850185610fe2565b67ffffffffffffffff1681526020810191909152604001600020805490915073ffffffffffffffffffffffffffffffffffffffff161515806104425750600181015473ffffffffffffffffffffffffffffffffffffffff1615155b1561048d5761045760408301602084016113b9565b61048d576040517fc6117ae200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61049d606083016040840161136d565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff919091161781556104ed608083016060840161136d565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556105416020830183610fe2565b67ffffffffffffffff167fa2e43edcbc4fd175ae4bebbe3fd6139871ed1f1783cd4a1ace59b90d302c33198360400160405161057d91906113db565b60405180910390a250506001016103af565b505050565b61059c61078f565b6105a5816107e2565b50565b60006105b48383610974565b90505b92915050565b60006105ca848484610a91565b90505b9392505050565b60006105de610be2565b60006105eb868585610a91565b6105f6906001611452565b90508467ffffffffffffffff168167ffffffffffffffff161461065a577f606ff8179e5e3c059b82df931acc496b7b6053e8879042f8267f930e0595f69f868686866040516106489493929190611473565b60405180910390a160009150506106d5565b67ffffffffffffffff861660009081526006602052604090819020905182919061068790879087906114df565b908152604051908190036020019020805467ffffffffffffffff929092167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905550600190505b949350505050565b60006106e7610be2565b60006106f38484610974565b6106fe906001611452565b67ffffffffffffffff808616600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902080549183167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905591505092915050565b61077961078f565b6105a581610c29565b606060006105cd83610ced565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107e0576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b602081015160005b815181101561087d5760008282815181106108075761080761138a565b60200260200101519050610825816002610d4990919063ffffffff16565b156108745760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b506001016107ea565b50815160005b815181101561096e5760008282815181106108a0576108a061138a565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610910576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61091b600282610d6b565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a150600101610883565b50505050565b67ffffffffffffffff808316600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120549091168082036105b45767ffffffffffffffff841660009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff168015610a89576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015282169063856c824790602401602060405180830381865afa158015610a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8091906114ef565b925050506105b7565b509392505050565b67ffffffffffffffff83166000908152600660205260408082209051829190610abd90869086906114df565b9081526040519081900360200190205467ffffffffffffffff16905060008190036105ca5767ffffffffffffffff851660009081526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168015610bd95773ffffffffffffffffffffffffffffffffffffffff811663856c8247610b438688018861136d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd091906114ef565b925050506105cd565b50949350505050565b610bed600233610d8d565b6107e0576040517fd86ad9cf00000000000000000000000000000000000000000000000000000000815233600482015260240160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603610c78576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b606081600001805480602002602001604051908101604052809291908181526020018280548015610d3d57602002820191906000526020600020905b815481526020019060010190808311610d29575b50505050509050919050565b60006105b48373ffffffffffffffffffffffffffffffffffffffff8416610dbc565b60006105b48373ffffffffffffffffffffffffffffffffffffffff8416610eb6565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156105b4565b60008181526001830160205260408120548015610ea5576000610de060018361150c565b8554909150600090610df49060019061150c565b9050818114610e59576000866000018281548110610e1457610e1461138a565b9060005260206000200154905080876000018481548110610e3757610e3761138a565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610e6a57610e6a61151f565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105b7565b60009150506105b7565b5092915050565b6000818152600183016020526040812054610efd575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105b7565b5060006105b7565b60006020808352835180602085015260005b81811015610f3357858101830151858201604001528201610f17565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b81811015610fc057835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610f8e565b50909695505050505050565b67ffffffffffffffff811681146105a557600080fd5b600060208284031215610ff457600080fd5b81356105b481610fcc565b6000806020838503121561101257600080fd5b823567ffffffffffffffff8082111561102a57600080fd5b818501915085601f83011261103e57600080fd5b81358181111561104d57600080fd5b8660208260071b850101111561106257600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105a557600080fd5b600082601f8301126110d657600080fd5b8135602067ffffffffffffffff808311156110f3576110f3611074565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561113657611136611074565b604052938452602081870181019490810192508785111561115657600080fd5b6020870191505b8482101561117f578135611170816110a3565b8352918301919083019061115d565b979650505050505050565b60006020828403121561119c57600080fd5b813567ffffffffffffffff808211156111b457600080fd5b90830190604082860312156111c857600080fd5b6040516040810181811083821117156111e3576111e3611074565b6040528235828111156111f557600080fd5b611201878286016110c5565b82525060208301358281111561121657600080fd5b611222878286016110c5565b60208301525095945050505050565b6000806040838503121561124457600080fd5b823561124f81610fcc565b9150602083013561125f816110a3565b809150509250929050565b60008083601f84011261127c57600080fd5b50813567ffffffffffffffff81111561129457600080fd5b6020830191508360208285010111156112ac57600080fd5b9250929050565b6000806000604084860312156112c857600080fd5b83356112d381610fcc565b9250602084013567ffffffffffffffff8111156112ef57600080fd5b6112fb8682870161126a565b9497909650939450505050565b6000806000806060858703121561131e57600080fd5b843561132981610fcc565b9350602085013561133981610fcc565b9250604085013567ffffffffffffffff81111561135557600080fd5b6113618782880161126a565b95989497509550505050565b60006020828403121561137f57600080fd5b81356105b4816110a3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156113cb57600080fd5b813580151581146105b457600080fd5b6040810182356113ea816110a3565b73ffffffffffffffffffffffffffffffffffffffff9081168352602084013590611413826110a3565b8082166020850152505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115610eaf57610eaf611423565b600067ffffffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b8183823760009101908152919050565b60006020828403121561150157600080fd5b81516105b481610fcc565b818103818111156105b7576105b7611423565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"authorizedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyPreviousRampsUpdates\",\"inputs\":[{\"name\":\"previousRampsArgs\",\"type\":\"tuple[]\",\"internalType\":\"structNonceManager.PreviousRampsArgs[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"overrideExistingRamps\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"prevRamps\",\"type\":\"tuple\",\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getIncrementedOutboundNonce\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getOutboundNonce\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPreviousRamps\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"incrementInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"expectedNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PreviousRampsUpdated\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"prevRamp\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedIncorrectNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousRampAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x60806040523461020f576117738038038061001981610214565b92833981019060208183031261020f578051906001600160401b03821161020f570181601f8201121561020f578051916001600160401b0383116101c8578260051b9160208061006a818601610214565b80968152019382010191821161020f57602001915b8183106101ef578333156101de57600180546001600160a01b031916331790556020906100ab82610214565b60008152600036813760408051929083016001600160401b038111848210176101c8576040528252808383015260005b8151811015610142576001906001600160a01b036100f98285610239565b5116856101058261027b565b610112575b5050016100db565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1858561010a565b50505160005b81518110156101b9576001600160a01b036101638284610239565b51169081156101a8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef848361019a600195610379565b50604051908152a101610148565b6342bcdf7f60e11b60005260046000fd5b60405161139990816103da8239f35b634e487b7160e01b600052604160045260246000fd5b639b15e16f60e01b60005260046000fd5b82516001600160a01b038116810361020f5781526020928301920161007f565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176101c857604052565b805182101561024d5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561024d5760005260206000200190600090565b600081815260036020526040902054801561037257600019810181811161035c5760025460001981019190821161035c5780820361030b575b50505060025480156102f557600019016102cf816002610263565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61034461031c61032d936002610263565b90549060031b1c9283926002610263565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806102b4565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146103d357600254680100000000000000008110156101c8576103ba61032d8260018594016002556002610263565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c908163181f5a7714610a94575080632451a627146109a6578063294b5630146108ff57806379ba5097146108165780637a75a094146105f95780638da5cb5b146105a757806391a2749a146103bd578063bf18402a14610373578063c9223625146102fe578063e0e03cae14610272578063ea458c0c1461019b5763f2fde38b146100a357600080fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff8116809103610196576100fb610e81565b33811461016c57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760206101d4610bef565b6101dc610c06565b6101e461113a565b67ffffffffffffffff6101ff6101fa8385610f2f565b610d1e565b92166000526005835273ffffffffffffffffffffffffffffffffffffffff604060002091166000528252604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905567ffffffffffffffff60405191168152f35b346101965760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576102a9610bef565b60243567ffffffffffffffff81168103610196576044359067ffffffffffffffff8211610196576020926102e46102f4933690600401610cba565b9290916102ef61113a565b610d6d565b6040519015158152f35b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657610335610bef565b60243567ffffffffffffffff81116101965760209161035b610361923690600401610cba565b9161104a565b67ffffffffffffffff60405191168152f35b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760206103616103af610bef565b6103b7610c06565b90610f2f565b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043567ffffffffffffffff81116101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610196576040519061043782610b63565b806004013567ffffffffffffffff81116101965761045b9060043691840101610c4a565b825260248101359067ffffffffffffffff82116101965760046104819236920101610c4a565b60208201908152610490610e81565b519060005b8251811015610508578073ffffffffffffffffffffffffffffffffffffffff6104c060019386610ecc565b51166104cb81611196565b6104d7575b5001610495565b60207fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1846104d0565b505160005b81518110156105a55773ffffffffffffffffffffffffffffffffffffffff6105358284610ecc565b511690811561057b577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef60208361056d60019561132c565b50604051908152a10161050d565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b005b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043567ffffffffffffffff8111610196573660238201121561019657806004013567ffffffffffffffff8111610196573660248260071b8401011161019657610670610e81565b60005b818110156105a55760008160071b84016024810167ffffffffffffffff61069982610ce8565b1683526004602052604083209273ffffffffffffffffffffffffffffffffffffffff845416158015906107f3575b6107b3575b5060408273ffffffffffffffffffffffffffffffffffffffff6107a667ffffffffffffffff6107907fa2e43edcbc4fd175ae4bebbe3fd6139871ed1f1783cd4a1ace59b90d302c3319966084606460019c9b9a01968661072b89610cfd565b167fffffffffffffffffffffffff00000000000000000000000000000000000000008c5416178b550198858c6107608c610cfd565b920191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610ce8565b16958261079e865195610c29565b168452610c29565b166020820152a201610673565b60448301358015908115036107ef57156106cc57807fc6117ae20000000000000000000000000000000000000000000000000000000060049252fd5b5080fd5b5073ffffffffffffffffffffffffffffffffffffffff60018501541615156106c7565b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760005473ffffffffffffffffffffffffffffffffffffffff811633036108d5577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965767ffffffffffffffff61093f610bef565b6000602060405161094f81610b63565b828152015216600052600460205260408060002073ffffffffffffffffffffffffffffffffffffffff825161098381610b63565b602082600181865416958685520154169101908152835192835251166020820152f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576040518060206002549283815201809260026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b818110610a7e5750505081610a25910382610bae565b6040519182916020830190602084525180915260408301919060005b818110610a4f575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101610a41565b8254845260209093019260019283019201610a0f565b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657610acc81610b63565b601681527f4e6f6e63654d616e6167657220312e362e302d64657600000000000000000000602082015260405190602082528181519182602083015260005b838110610b4b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610b0b565b6040810190811067ffffffffffffffff821117610b7f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b7f57604052565b6004359067ffffffffffffffff8216820361019657565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361019657565b359073ffffffffffffffffffffffffffffffffffffffff8216820361019657565b9080601f830112156101965781359167ffffffffffffffff8311610b7f578260051b9060405193610c7e6020840186610bae565b845260208085019282010192831161019657602001905b828210610ca25750505090565b60208091610caf84610c29565b815201910190610c95565b9181601f840112156101965782359167ffffffffffffffff8311610196576020838186019501011161019657565b3567ffffffffffffffff811681036101965790565b3573ffffffffffffffffffffffffffffffffffffffff811681036101965790565b67ffffffffffffffff60019116019067ffffffffffffffff8211610d3e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291909267ffffffffffffffff610d886101fa85858561104a565b94168067ffffffffffffffff861603610df8575067ffffffffffffffff9291836020921660005260068252604060002083604051948593843782019081520301902091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600190565b7f606ff8179e5e3c059b82df931acc496b7b6053e8879042f8267f930e0595f69f9450601f8467ffffffffffffffff956080957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09460405198899716875260208701526060604087015281606087015286860137600085828601015201168101030190a1600090565b73ffffffffffffffffffffffffffffffffffffffff600154163303610ea257565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b8051821015610ee05760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610196575167ffffffffffffffff811681036101965790565b67ffffffffffffffff1690816000526005602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205267ffffffffffffffff60406000205416918215610f8157505090565b600052600460205273ffffffffffffffffffffffffffffffffffffffff604060002054169081610fb057505090565b6020919250602473ffffffffffffffffffffffffffffffffffffffff9160405194859384927f856c82470000000000000000000000000000000000000000000000000000000084521660048301525afa90811561103e57600091611012575090565b611034915060203d602011611037575b61102c8183610bae565b810190610f0f565b90565b503d611022565b6040513d6000823e3d90fd5b67ffffffffffffffff90929192169182600052600660205267ffffffffffffffff60406000206020604051809286868337868201908152030190205416928315611095575b50505090565b600052600460205273ffffffffffffffffffffffffffffffffffffffff6001604060002001541691821561108f57819293509060209181010312610196573573ffffffffffffffffffffffffffffffffffffffff8116809103610196576020906024604051809481937f856c824700000000000000000000000000000000000000000000000000000000835260048301525afa90811561103e57600091611012575090565b3360005260036020526040600020541561115057565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b8054821015610ee05760005260206000200190600090565b6000818152600360205260409020548015611325577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111610d3e57600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211610d3e578082036112b6575b5050506002548015611287577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161124481600261117e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61130d6112c76112d893600261117e565b90549060031b1c928392600261117e565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600052600360205260406000205538808061120b565b5050600090565b806000526003602052604060002054156000146113865760025468010000000000000000811015610b7f5761136d6112d8826001859401600255600261117e565b9055600254906000526003602052604060002055600190565b5060009056fea164736f6c634300081a000a",
}
var NonceManagerABI = NonceManagerMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go
index 830dcaf7bf4..3370efd2261 100644
--- a/core/gethwrappers/ccip/generated/offramp/offramp.go
+++ b/core/gethwrappers/ccip/generated/offramp/offramp.go
@@ -156,8 +156,8 @@ type OffRampStaticConfig struct {
}
var OffRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\"},{\"internalType\":\"contractIRMNRemote\",\"name\":\"rmnRemote\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reportOnRamp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"configOnRamp\",\"type\":\"bytes\"}],\"name\":\"CommitOnRampMismatch\",\"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\":\"EmptyBatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokenIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"oldLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenGasOverride\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionTokenGasOverride\",\"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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidOnRampUpdate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionGasAmountCountMismatch\",\"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\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorMismatch\",\"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\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"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[]\"}],\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SkippedReportExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\"},{\"internalType\":\"contractIRMNRemote\",\"name\":\"rmnRemote\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[2]\",\"name\":\"reportContext\",\"type\":\"bytes32[2]\"},{\"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[2]\",\"name\":\"reportContext\",\"type\":\"bytes32[2]\"},{\"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\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"uint32[]\",\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllSourceChainConfigs\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\"},{\"internalType\":\"contractIRMNRemote\",\"name\":\"rmnRemote\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"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\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"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.ExecutionReport[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint32[]\",\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\"}],\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x6101406040523480156200001257600080fd5b5060405162006d0638038062006d06833981016040819052620000359162000936565b336000816200005757604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008a576200008a81620001dc565b50504660805260408301516001600160a01b03161580620000b6575060608301516001600160a01b0316155b80620000cd575060808301516001600160a01b0316155b15620000ec576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b0316600003620001185760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a0908152604080860180516001600160a01b0390811660c05260608089018051831660e0526080808b0180518516610100526020808d01805161ffff9081166101205289518f51909c168c52905116908a0152945184169588019590955251821690860152905116908301527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b7910160405180910390a1620001c88262000256565b620001d38162000344565b50505062000cde565b336001600160a01b038216036200020657604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b03166200027f576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516001600160a01b039889166001600160c01b03199097168717600160a01b63ffffffff958616021760ff60c01b1916600160c01b911515919091021790965560608089018051600580546001600160a01b031916918b169190911790558251968752935190921693850193909352935115159183019190915251909216908201527fcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee9060800160405180910390a150565b60005b8151811015620005d957600082828151811062000368576200036862000a16565b60200260200101519050600081602001519050806001600160401b0316600003620003a65760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b0316620003cf576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b03811660009081526008602052604090206060830151600182018054620003fd9062000a2c565b905060000362000460578154600160a81b600160e81b031916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620004d1565b8154600160a81b90046001600160401b0316600114801590620004a35750805160208201206040516200049890600185019062000a68565b604051809103902014155b15620004d157604051632105803760e11b81526001600160401b038416600482015260240160405180910390fd5b80511580620005075750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b1562000526576040516342bcdf7f60e11b815260040160405180910390fd5b6001820162000536828262000b3b565b506040840151825485516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b0319909116171782556200058560066001600160401b038516620005dd565b50826001600160401b03167f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b83604051620005c1919062000c07565b60405180910390a25050505080600101905062000347565b5050565b6000620005eb8383620005f4565b90505b92915050565b60008181526001830160205260408120546200063d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005ee565b506000620005ee565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171562000681576200068162000646565b60405290565b60405160a081016001600160401b038111828210171562000681576200068162000646565b604051601f8201601f191681016001600160401b0381118282101715620006d757620006d762000646565b604052919050565b80516001600160401b0381168114620006f757600080fd5b919050565b6001600160a01b03811681146200071257600080fd5b50565b80518015158114620006f757600080fd5b6000608082840312156200073957600080fd5b620007436200065c565b905081516200075281620006fc565b8152602082015163ffffffff811681146200076c57600080fd5b60208201526200077f6040830162000715565b604082015260608201516200079481620006fc565b606082015292915050565b6000601f83601f840112620007b357600080fd5b825160206001600160401b0380831115620007d257620007d262000646565b8260051b620007e3838201620006ac565b9384528681018301938381019089861115620007fe57600080fd5b84890192505b8583101562000929578251848111156200081e5760008081fd5b89016080601f19828d038101821315620008385760008081fd5b620008426200065c565b888401516200085181620006fc565b8152604062000862858201620006df565b8a83015260606200087581870162000715565b838301529385015193898511156200088d5760008081fd5b84860195508f603f870112620008a557600094508485fd5b8a860151945089851115620008be57620008be62000646565b620008cf8b858f88011601620006ac565b93508484528f82868801011115620008e75760008081fd5b60005b8581101562000907578681018301518582018d01528b01620008ea565b5060009484018b01949094525091820152835250918401919084019062000804565b9998505050505050505050565b60008060008385036101408112156200094e57600080fd5b60a08112156200095d57600080fd5b506200096862000687565b6200097385620006df565b8152602085015161ffff811681146200098b57600080fd5b60208201526040850151620009a081620006fc565b60408201526060850151620009b581620006fc565b60608201526080850151620009ca81620006fc565b60808201529250620009e08560a0860162000726565b6101208501519092506001600160401b03811115620009fe57600080fd5b62000a0c868287016200079f565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4157607f821691505b60208210810362000a6257634e487b7160e01b600052602260045260246000fd5b50919050565b600080835462000a788162000a2c565b6001828116801562000a93576001811462000aa95762000ada565b60ff198416875282151583028701945062000ada565b8760005260208060002060005b8581101562000ad15781548a82015290840190820162000ab6565b50505082870194505b50929695505050505050565b601f82111562000b36576000816000526020600020601f850160051c8101602086101562000b115750805b601f850160051c820191505b8181101562000b325782815560010162000b1d565b5050505b505050565b81516001600160401b0381111562000b575762000b5762000646565b62000b6f8162000b68845462000a2c565b8462000ae6565b602080601f83116001811462000ba7576000841562000b8e5750858301515b600019600386901b1c1916600185901b17855562000b32565b600085815260208120601f198616915b8281101562000bd85788860151825594840194600190910190840162000bb7565b508582101562000bf75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000c5c8162000a2c565b8060a089015260c0600183166000811462000c80576001811462000c9d5762000ccf565b60ff19841660c08b015260c083151560051b8b0101945062000ccf565b85600052602060002060005b8481101562000cc65781548c820185015290880190890162000ca9565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e0516101005161012051615f8b62000d7b600039600081816101b001528181610ce801528181612ed1015261380b0152600081816102380152612aa10152600081816102090152612d490152600081816101da01528181610fcc0152818161117c01526124a10152600081816101810152818161264c015261270301526000818161195b015261198e0152615f8b6000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80637edf52f4116100ad578063de5e0b9a11610071578063de5e0b9a146104eb578063e9d68a8e146104fe578063f2fde38b1461051e578063f58e03fc14610531578063f716f99f1461054457600080fd5b80637edf52f41461044b57806385572ffb1461045e5780638da5cb5b1461046c578063c673e58414610487578063ccd37ba3146104a757600080fd5b80635e36480c116100f45780635e36480c146103405780635e7bb0081461036057806360987c20146103735780637437ff9f1461038657806379ba50971461044357600080fd5b806304666f9c1461013157806306285c6914610146578063181f5a77146102c65780633f4b04aa1461030f5780635215505b1461032a575b600080fd5b61014461013f366004613eaf565b610557565b005b6102686040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040518060a001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160401b031681526020017f000000000000000000000000000000000000000000000000000000000000000061ffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040805182516001600160401b0316815260208084015161ffff1690820152828201516001600160a01b03908116928201929092526060808401518316908201526080928301519091169181019190915260a0015b60405180910390f35b6103026040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102bd919061401d565b600b546040516001600160401b0390911681526020016102bd565b61033261056b565b6040516102bd929190614077565b61035361034e366004614118565b6107c6565b6040516102bd9190614175565b61014461036e3660046146de565b61081b565b61014461038136600461496d565b610aaf565b6103fc60408051608081018252600080825260208201819052918101829052606081019190915250604080516080810182526004546001600160a01b038082168352600160a01b820463ffffffff166020840152600160c01b90910460ff16151592820192909252600554909116606082015290565b6040516102bd919081516001600160a01b03908116825260208084015163ffffffff1690830152604080840151151590830152606092830151169181019190915260800190565b610144610d8a565b610144610459366004614a01565b610e0d565b61014461012c366004614a66565b6001546040516001600160a01b0390911681526020016102bd565b61049a610495366004614ab1565b610e1e565b6040516102bd9190614b11565b6104dd6104b5366004614b86565b6001600160401b03919091166000908152600a60209081526040808320938352929052205490565b6040519081526020016102bd565b6101446104f9366004614c02565b610f7c565b61051161050c366004614cb4565b61147f565b6040516102bd9190614ccf565b61014461052c366004614ce2565b61158b565b61014461053f366004614cff565b61159c565b610144610552366004614dba565b611605565b61055f611647565b61056881611674565b50565b606080600061057a60066118fd565b6001600160401b0381111561059157610591613ccf565b6040519080825280602002602001820160405280156105e257816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816105af5790505b50905060006105f160066118fd565b6001600160401b0381111561060857610608613ccf565b604051908082528060200260200182016040528015610631578160200160208202803683370190505b50905060005b61064160066118fd565b8110156107bd57610653600682611907565b82828151811061066557610665614ef7565b60200260200101906001600160401b031690816001600160401b0316815250506008600083838151811061069b5761069b614ef7565b6020908102919091018101516001600160401b039081168352828201939093526040918201600020825160808101845281546001600160a01b038116825260ff600160a01b820416151593820193909352600160a81b9092049093169181019190915260018201805491929160608401919061071690614f0d565b80601f016020809104026020016040519081016040528092919081815260200182805461074290614f0d565b801561078f5780601f106107645761010080835404028352916020019161078f565b820191906000526020600020905b81548152906001019060200180831161077257829003601f168201915b5050505050815250508382815181106107aa576107aa614ef7565b6020908102919091010152600101610637565b50939092509050565b60006107d460016004614f5d565b60026107e1608085614f86565b6001600160401b03166107f49190614fac565b6107fe8585611913565b901c1660038111156108125761081261414b565b90505b92915050565b610823611958565b815181518114610846576040516320f8fd5960e21b815260040160405180910390fd5b60005b81811015610a9f57600084828151811061086557610865614ef7565b6020026020010151905060008160200151519050600085848151811061088d5761088d614ef7565b60200260200101519050805182146108b8576040516320f8fd5960e21b815260040160405180910390fd5b60005b82811015610a905760008282815181106108d7576108d7614ef7565b60200260200101516000015190506000856020015183815181106108fd576108fd614ef7565b6020026020010151905081600014610956578060800151821015610956578551815151604051633a98d46360e11b81526001600160401b0390921660048301526024820152604481018390526064015b60405180910390fd5b83838151811061096857610968614ef7565b602002602001015160200151518160a0015151146109b557805180516060909101516040516370a193fd60e01b815260048101929092526001600160401b0316602482015260440161094d565b60005b8160a0015151811015610a825760008585815181106109d9576109d9614ef7565b60200260200101516020015182815181106109f6576109f6614ef7565b602002602001015163ffffffff16905080600014610a795760008360a001518381518110610a2657610a26614ef7565b60200260200101516040015163ffffffff16905080821015610a77578351516040516348e617b360e01b8152600481019190915260248101849052604481018290526064810183905260840161094d565b505b506001016109b8565b5050508060010190506108bb565b50505050806001019050610849565b50610aaa83836119c0565b505050565b333014610acf576040516306e34e6560e31b815260040160405180910390fd5b6040805160008082526020820190925281610b0c565b6040805180820190915260008082526020820152815260200190600190039081610ae55790505b5060a08701515190915015610b4257610b3f8660a001518760200151886060015189600001516020015189898989611a83565b90505b6040805160a081018252875151815287516020908101516001600160401b03168183015288015181830152908701516060820152608081018290526005546001600160a01b03168015610c35576040516308d450a160e01b81526001600160a01b038216906308d450a190610bbb908590600401615070565b600060405180830381600087803b158015610bd557600080fd5b505af1925050508015610be6575060015b610c35573d808015610c14576040519150601f19603f3d011682016040523d82523d6000602084013e610c19565b606091505b50806040516309c2532560e01b815260040161094d919061401d565b604088015151158015610c4a57506080880151155b80610c61575060608801516001600160a01b03163b155b80610c8857506060880151610c86906001600160a01b03166385572ffb60e01b611c34565b155b15610c9557505050610d83565b87516020908101516001600160401b03166000908152600890915260408082205460808b015160608c01519251633cf9798360e01b815284936001600160a01b0390931692633cf9798392610d119289927f00000000000000000000000000000000000000000000000000000000000000009291600401615083565b6000604051808303816000875af1158015610d30573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d5891908101906150bf565b509150915081610d7d57806040516302a35ba360e21b815260040161094d919061401d565b50505050505b5050505050565b6000546001600160a01b03163314610db55760405163015aa1e360e11b815260040160405180910390fd5b600180546001600160a01b0319808216339081179093556000805490911681556040516001600160a01b03909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e15611647565b61056881611c50565b610e616040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c082015294855291820180548451818402810184019095528085529293858301939092830182828015610f0a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610eec575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610f6c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f4e575b5050505050815250509050919050565b6000610f8a8789018961536c565b6004805491925090600160c01b900460ff1661103457602082015151156110345760208201516040808401519051633854844f60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926370a9089e926110039230929190600401615594565b60006040518083038186803b15801561101b57600080fd5b505afa15801561102f573d6000803e3d6000fd5b505050505b8151515115158061104a57508151602001515115155b1561111557600b5460208b0135906001600160401b03808316911610156110ed57600b805467ffffffffffffffff19166001600160401b03831617905581548351604051633937306f60e01b81526001600160a01b0390921691633937306f916110b6916004016156a7565b600060405180830381600087803b1580156110d057600080fd5b505af11580156110e4573d6000803e3d6000fd5b50505050611113565b82602001515160000361111357604051632261116760e01b815260040160405180910390fd5b505b60005b8260200151518110156113cb5760008360200151828151811061113d5761113d614ef7565b60209081029190910101518051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa1580156111c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e791906156ba565b1561121057604051637edeb53960e11b81526001600160401b038216600482015260240161094d565b600061121b82611d55565b90508060010160405161122e91906156d7565b60405180910390208360200151805190602001201461126b5782602001518160010160405163b80d8fa960e01b815260040161094d9291906157ca565b60408301518154600160a81b90046001600160401b0390811691161415806112ac575082606001516001600160401b031683604001516001600160401b0316115b156112f157825160408085015160608601519151636af0786b60e11b81526001600160401b03938416600482015290831660248201529116604482015260640161094d565b6080830151806113145760405163504570e360e01b815260040160405180910390fd5b83516001600160401b03166000908152600a602090815260408083208484529091529020541561136c5783516040516332cf0cbf60e01b81526001600160401b0390911660048201526024810182905260440161094d565b606084015161137c9060016157ef565b825467ffffffffffffffff60a81b1916600160a81b6001600160401b0392831602179092559251166000908152600a602090815260408083209483529390529190912042905550600101611118565b50602082015182516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e492611403929091615816565b60405180910390a1610d7d60008b8b8b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c9250611da1915050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b03878116845260088352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b90920490921694830194909452600184018054939492939184019161150b90614f0d565b80601f016020809104026020016040519081016040528092919081815260200182805461153790614f0d565b8015610f6c5780601f1061155957610100808354040283529160200191610f6c565b820191906000526020600020905b81548152906001019060200180831161156757505050919092525091949350505050565b611593611647565b6105688161209a565b6115dc6115ab8284018461583b565b60408051600080825260208201909252906115d6565b60608152602001906001900390816115c15790505b506119c0565b6040805160008082526020820190925290506115ff600185858585866000611da1565b50505050565b61160d611647565b60005b81518110156116435761163b82828151811061162e5761162e614ef7565b6020026020010151612113565b600101611610565b5050565b6001546001600160a01b03163314611672576040516315ae3a6f60e11b815260040160405180910390fd5b565b60005b815181101561164357600082828151811061169457611694614ef7565b60200260200101519050600081602001519050806001600160401b03166000036116d15760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166116f9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b0381166000908152600860205260409020606083015160018201805461172590614f0d565b905060000361178757815467ffffffffffffffff60a81b1916600160a81b1782556040516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a16117f0565b8154600160a81b90046001600160401b03166001148015906117c75750805160208201206040516117bc9060018501906156d7565b604051809103902014155b156117f057604051632105803760e11b81526001600160401b038416600482015260240161094d565b805115806118255750604080516000602082015201604051602081830303815290604052805190602001208180519060200120145b15611843576040516342bcdf7f60e11b815260040160405180910390fd5b6001820161185182826158bf565b506040840151825485516001600160a01b03166001600160a01b0319921515600160a01b029290921674ffffffffffffffffffffffffffffffffffffffffff19909116171782556118ac60066001600160401b03851661243d565b50826001600160401b03167f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b836040516118e6919061597e565b60405180910390a250505050806001019050611677565b6000610815825490565b60006108128383612449565b6001600160401b0382166000908152600960205260408120816119376080856159cc565b6001600160401b031681526020810191909152604001600020549392505050565b467f00000000000000000000000000000000000000000000000000000000000000001461167257604051630f01ce8560e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161094d565b81516000036119e25760405163c2e5347d60e01b815260040160405180910390fd5b80516040805160008082526020820190925291159181611a25565b6040805180820190915260008152606060208201528152602001906001900390816119fd5790505b50905060005b8451811015610d8357611a7b858281518110611a4957611a49614ef7565b602002602001015184611a7557858381518110611a6857611a68614ef7565b6020026020010151612473565b83612473565b600101611a2b565b606088516001600160401b03811115611a9e57611a9e613ccf565b604051908082528060200260200182016040528015611ae357816020015b6040805180820190915260008082526020820152815260200190600190039081611abc5790505b509050811560005b8a51811015611c265781611b8357848482818110611b0b57611b0b614ef7565b9050602002016020810190611b2091906159f2565b63ffffffff1615611b8357848482818110611b3d57611b3d614ef7565b9050602002016020810190611b5291906159f2565b8b8281518110611b6457611b64614ef7565b60200260200101516040019063ffffffff16908163ffffffff16815250505b611c018b8281518110611b9857611b98614ef7565b60200260200101518b8b8b8b8b87818110611bb557611bb5614ef7565b9050602002810190611bc79190615a0d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612d0e92505050565b838281518110611c1357611c13614ef7565b6020908102919091010152600101611aeb565b505098975050505050505050565b6000611c3f8361300e565b801561081257506108128383613041565b80516001600160a01b0316611c78576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516001600160a01b039889167fffffffffffffffff0000000000000000000000000000000000000000000000009097168717600160a01b63ffffffff958616021760ff60c01b1916600160c01b911515919091021790965560608089018051600580546001600160a01b031916918b169190911790558251968752935190921693850193909352935115159183019190915251909216908201527fcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee9060800160405180910390a150565b6001600160401b03811660009081526008602052604081208054600160a01b900460ff166108155760405163ed053c5960e01b81526001600160401b038416600482015260240161094d565b60ff87811660009081526002602090815260408083208151608081018352815481526001909101548086169382019390935261010083048516918101919091526201000090910490921615156060830152873590611e00876084615a53565b9050826060015115611e48578451611e19906020614fac565b8651611e26906020614fac565b611e319060a0615a53565b611e3b9190615a53565b611e459082615a53565b90505b368114611e7157604051638e1192e160e01b81526004810182905236602482015260440161094d565b5081518114611ea05781516040516324f7d61360e21b815260048101919091526024810182905260440161094d565b611ea8611958565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611ef657611ef661414b565b6002811115611f0757611f0761414b565b9052509050600281602001516002811115611f2457611f2461414b565b148015611f785750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611f6057611f60614ef7565b6000918252602090912001546001600160a01b031633145b611f9557604051631b41e11d60e31b815260040160405180910390fd5b50816060015115612045576020820151611fb0906001615a66565b60ff16855114611fd3576040516371253a2560e01b815260040160405180910390fd5b8351855114611ff55760405163a75d88af60e01b815260040160405180910390fd5b60008787604051612007929190615a7f565b60405190819003812061201e918b90602001615a8f565b6040516020818303038152906040528051906020012090506120438a828888886130cb565b505b6040805182815260208a8101356001600160401b03169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b336001600160a01b038216036120c357604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff1660000361213e576000604051631b3fab5160e11b815260040161094d9190615aa3565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361218f576060840151600182018054911515620100000262ff0000199092169190911790556121cb565b6060840151600182015460ff62010000909104161515901515146121cb576040516321fd80df60e21b815260ff8416600482015260240161094d565b60a0840151805161010010156121f7576001604051631b3fab5160e11b815260040161094d9190615aa3565b805160000361221c576005604051631b3fab5160e11b815260040161094d9190615aa3565b612282848460030180548060200260200160405190810160405280929190818152602001828054801561227857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161225a575b505050505061327e565b8460600151156123b2576122f08484600201805480602002602001604051908101604052809291908181526020018280548015612278576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161225a57505050505061327e565b60808501518051610100101561231c576002604051631b3fab5160e11b815260040161094d9190615aa3565b604086015161232c906003615abd565b60ff16815111612352576003604051631b3fab5160e11b815260040161094d9190615aa3565b815181511015612378576001604051631b3fab5160e11b815260040161094d9190615aa3565b805160018401805461ff00191661010060ff8416021790556123a39060028601906020840190613c55565b506123b0858260016132e7565b505b6123be848260026132e7565b80516123d39060038501906020840190613c55565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361242c9389939260028a01929190615ad9565b60405180910390a1610d8384613442565b600061081283836134c5565b600082600001828154811061246057612460614ef7565b9060005260206000200154905092915050565b81518151604051632cbc26bb60e01b8152608083901b67ffffffffffffffff60801b166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156124f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251491906156ba565b1561258557801561254357604051637edeb53960e11b81526001600160401b038316600482015260240161094d565b6040516001600160401b03831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b60208401515160008190036125bb57845160405163676cf24b60e11b81526001600160401b03909116600482015260240161094d565b84604001515181146125e0576040516357e0e08360e01b815260040160405180910390fd5b6000816001600160401b038111156125fa576125fa613ccf565b604051908082528060200260200182016040528015612623578160200160208202803683370190505b50905060007f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f857f000000000000000000000000000000000000000000000000000000000000000061267488611d55565b60010160405161268491906156d7565b6040519081900381206126bc949392916020019384526001600160401b03928316602085015291166040830152606082015260800190565b60405160208183030381529060405280519060200120905060005b838110156127f2576000886020015182815181106126f7576126f7614ef7565b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160401b03168160000151604001516001600160401b03161461276e5780516040908101519051631c21951160e11b81526001600160401b03909116600482015260240161094d565b866001600160401b03168160000151602001516001600160401b0316146127c257805160200151604051636c95f1eb60e01b81526001600160401b03808a166004830152909116602482015260440161094d565b6127cc8184613514565b8483815181106127de576127de614ef7565b6020908102919091010152506001016126d7565b5050600061280a858389606001518a6080015161361c565b90508060000361283857604051633ee8bd3f60e11b81526001600160401b038616600482015260240161094d565b60005b83811015612d045760005a905060008960200151838151811061286057612860614ef7565b60200260200101519050600061287e898360000151606001516107c6565b905060008160038111156128945761289461414b565b14806128b1575060038160038111156128af576128af61414b565b145b61290757815160600151604080516001600160401b03808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a1505050612cfc565b606088156129e6578a858151811061292157612921614ef7565b6020908102919091018101510151600454909150600090600160a01b900463ffffffff1661294f8842614f5d565b119050808061296f5750600383600381111561296d5761296d61414b565b145b612997576040516354e7e43160e11b81526001600160401b038c16600482015260240161094d565b8b86815181106129a9576129a9614ef7565b6020026020010151600001516000146129e0578b86815181106129ce576129ce614ef7565b60209081029190910101515160808501525b50612a52565b60008260038111156129fa576129fa61414b565b14612a5257825160600151604080516001600160401b03808e16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe65120910160405180910390a150505050612cfc565b8251608001516001600160401b031615612b28576000826003811115612a7a57612a7a61414b565b03612b285782516080015160208401516040516370701e5760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612ad8928f929190600401615b8b565b6020604051808303816000875af1158015612af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1b91906156ba565b612b285750505050612cfc565b60008c604001518681518110612b4057612b40614ef7565b6020026020010151905080518460a001515114612b8a57835160600151604051631cfe6d8b60e01b81526001600160401b03808e166004830152909116602482015260440161094d565b612b9e8b8560000151606001516001613659565b600080612bac8684866136fe565b91509150612bc38d87600001516060015184613659565b8b15612c1a576003826003811115612bdd57612bdd61414b565b03612c1a576000856003811115612bf657612bf661414b565b14612c1a57855151604051632b11b8d960e01b815261094d91908390600401615bb7565b6002826003811115612c2e57612c2e61414b565b14612c6f576003826003811115612c4757612c4761414b565b14612c6f578551606001516040516349362d1f60e11b815261094d918f918590600401615bd0565b8560000151600001518660000151606001516001600160401b03168e6001600160401b03167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8d8c81518110612cc757612cc7614ef7565b602002602001015186865a612cdc908f614f5d565b604051612cec9493929190615bf5565b60405180910390a4505050505050505b60010161283b565b5050505050505050565b6040805180820190915260008082526020820152602086015160405163bbe4f6db60e01b81526001600160a01b0380831660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015612d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db69190615c2c565b90506001600160a01b0381161580612de55750612de36001600160a01b03821663aff2afbf60e01b611c34565b155b15612e0e5760405163ae9b4ce960e01b81526001600160a01b038216600482015260240161094d565b600080612e2688858c6040015163ffffffff166137b2565b915091506000806000612ef76040518061010001604052808e81526020018c6001600160401b031681526020018d6001600160a01b031681526020018f608001518152602001896001600160a01b031681526020018f6000015181526020018f6060015181526020018b815250604051602401612ea39190615c49565b60408051601f198184030181529190526020810180516001600160e01b0316633907753760e01b17905287867f000000000000000000000000000000000000000000000000000000000000000060846138b5565b92509250925082612f1f578582604051634ff17cad60e11b815260040161094d929190615d15565b8151602014612f4e578151604051631e3be00960e21b815260206004820152602481019190915260440161094d565b600082806020019051810190612f649190615d37565b9050866001600160a01b03168c6001600160a01b031614612fe0576000612f958d8a612f90868a614f5d565b6137b2565b50905086811080612faf575081612fac8883614f5d565b14155b15612fde5760405163a966e21f60e01b815260048101839052602481018890526044810182905260640161094d565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b6000613021826301ffc9a760e01b613041565b8015610815575061303a826001600160e01b0319613041565b1592915050565b6040516001600160e01b031982166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03166301ffc9a760e01b178152825192935060009283928392909183918a617530fa92503d915060005190508280156130b4575060208210155b80156130c05750600081115b979650505050505050565b8251600090815b81811015612d045760006001888684602081106130f1576130f1614ef7565b6130fe91901a601b615a66565b89858151811061311057613110614ef7565b602002602001015189868151811061312a5761312a614ef7565b602002602001015160405160008152602001604052604051613168949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561318a573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b038516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156131eb576131eb61414b565b60028111156131fc576131fc61414b565b90525090506001816020015160028111156132195761321961414b565b1461323757604051636518c33d60e11b815260040160405180910390fd5b8051600160ff9091161b85161561326157604051633d9ef1f160e21b815260040160405180910390fd5b806000015160ff166001901b8517945050508060010190506130d2565b60005b8151811015610aaa5760ff8316600090815260036020526040812083519091908490849081106132b3576132b3614ef7565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff19169055600101613281565b60005b82518110156115ff57600083828151811061330757613307614ef7565b60200260200101519050600060028111156133245761332461414b565b60ff80871660009081526003602090815260408083206001600160a01b038716845290915290205461010090041660028111156133635761336361414b565b14613384576004604051631b3fab5160e11b815260040161094d9190615aa3565b6001600160a01b0381166133ab5760405163d6c62c9b60e01b815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156133d1576133d161414b565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561342e5761342e61414b565b0217905550905050508060010190506132ea565b60ff8181166000818152600260205260409020600101546201000090049091169061349a5780613485576040516317bd8dd160e11b815260040160405180910390fd5b600b805467ffffffffffffffff191690555050565b60001960ff831601611643578015611643576040516307b8c74d60e51b815260040160405180910390fd5b600081815260018301602052604081205461350c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610815565b506000610815565b81518051606080850151908301516080808701519401516040516000958695889561357895919490939192916020019485526001600160a01b039390931660208501526001600160401b039182166040850152606084015216608082015260a00190565b604051602081830303815290604052805190602001208560200151805190602001208660400151805190602001208760a001516040516020016135bb9190615df1565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b60008061362a85858561398f565b6001600160401b0387166000908152600a6020908152604080832093835292905220549150505b949350505050565b60006002613668608085614f86565b6001600160401b031661367b9190614fac565b905060006136898585611913565b90508161369860016004614f5d565b901b1916818360038111156136af576136af61414b565b6001600160401b03871660009081526009602052604081209190921b929092179182916136dd6080886159cc565b6001600160401b031681526020810191909152604001600020555050505050565b604051630304c3e160e51b815260009060609030906360987c209061372b90889088908890600401615e88565b600060405180830381600087803b15801561374557600080fd5b505af1925050508015613756575060015b613795573d808015613784576040519150601f19603f3d011682016040523d82523d6000602084013e613789565b606091505b506003925090506137aa565b50506040805160208101909152600081526002905b935093915050565b6000806000806000613831886040516024016137dd91906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166370a0823160e01b17905288887f000000000000000000000000000000000000000000000000000000000000000060846138b5565b92509250925082613859578682604051634ff17cad60e11b815260040161094d929190615d15565b6020825114613888578151604051631e3be00960e21b815260206004820152602481019190915260440161094d565b8180602001905181019061389c9190615d37565b6138a68288614f5d565b94509450505050935093915050565b6000606060008361ffff166001600160401b038111156138d7576138d7613ccf565b6040519080825280601f01601f191660200182016040528015613901576020820181803683370190505b509150863b61391b5763030ed58f60e21b60005260046000fd5b5a8581101561393557632be8ca8b60e21b60005260046000fd5b8590036040810481038710613955576337c3be2960e01b60005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156139785750835b808352806000602085013e50955095509592505050565b82518251600091908183036139b757604051630469ac9960e21b815260040160405180910390fd5b61010182118015906139cb57506101018111155b6139e8576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613a12576040516309bde33960e01b815260040160405180910390fd5b80600003613a3f5786600081518110613a2d57613a2d614ef7565b60200260200101519350505050613c0d565b6000816001600160401b03811115613a5957613a59613ccf565b604051908082528060200260200182016040528015613a82578160200160208202803683370190505b50905060008080805b85811015613bac5760006001821b8b811603613ae65788851015613acf578c5160018601958e918110613ac057613ac0614ef7565b60200260200101519050613b08565b8551600185019487918110613ac057613ac0614ef7565b8b5160018401938d918110613afd57613afd614ef7565b602002602001015190505b600089861015613b38578d5160018701968f918110613b2957613b29614ef7565b60200260200101519050613b5a565b8651600186019588918110613b4f57613b4f614ef7565b602002602001015190505b82851115613b7b576040516309bde33960e01b815260040160405180910390fd5b613b858282613c14565b878481518110613b9757613b97614ef7565b60209081029190910101525050600101613a8b565b506001850382148015613bbe57508683145b8015613bc957508581145b613be6576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613bfb57613bfb614ef7565b60200260200101519750505050505050505b9392505050565b6000818310613c2c57613c278284613c32565b610812565b61081283835b6040805160016020820152908101839052606081018290526000906080016135fe565b828054828255906000526020600020908101928215613caa579160200282015b82811115613caa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613c75565b50613cb6929150613cba565b5090565b5b80821115613cb65760008155600101613cbb565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613d0757613d07613ccf565b60405290565b60405160a081016001600160401b0381118282101715613d0757613d07613ccf565b60405160c081016001600160401b0381118282101715613d0757613d07613ccf565b604080519081016001600160401b0381118282101715613d0757613d07613ccf565b604051606081016001600160401b0381118282101715613d0757613d07613ccf565b604051601f8201601f191681016001600160401b0381118282101715613dbd57613dbd613ccf565b604052919050565b60006001600160401b03821115613dde57613dde613ccf565b5060051b60200190565b6001600160a01b038116811461056857600080fd5b80356001600160401b0381168114613e1457600080fd5b919050565b801515811461056857600080fd5b8035613e1481613e19565b60006001600160401b03821115613e4b57613e4b613ccf565b50601f01601f191660200190565b600082601f830112613e6a57600080fd5b8135613e7d613e7882613e32565b613d95565b818152846020838601011115613e9257600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215613ec257600080fd5b82356001600160401b0380821115613ed957600080fd5b818501915085601f830112613eed57600080fd5b8135613efb613e7882613dc5565b81815260059190911b83018401908481019088831115613f1a57600080fd5b8585015b83811015613fc057803585811115613f365760008081fd5b86016080818c03601f1901811315613f4e5760008081fd5b613f56613ce5565b89830135613f6381613de8565b81526040613f72848201613dfd565b8b830152606080850135613f8581613e19565b83830152928401359289841115613f9e57600091508182fd5b613fac8f8d86880101613e59565b908301525085525050918601918601613f1e565b5098975050505050505050565b60005b83811015613fe8578181015183820152602001613fd0565b50506000910152565b60008151808452614009816020860160208601613fcd565b601f01601f19169290920160200192915050565b6020815260006108126020830184613ff1565b6001600160a01b0381511682526020810151151560208301526001600160401b03604082015116604083015260006060820151608060608501526136516080850182613ff1565b604080825283519082018190526000906020906060840190828701845b828110156140b95781516001600160401b031684529284019290840190600101614094565b50505083810382850152845180825282820190600581901b8301840187850160005b8381101561410957601f198684030185526140f7838351614030565b948701949250908601906001016140db565b50909998505050505050505050565b6000806040838503121561412b57600080fd5b61413483613dfd565b915061414260208401613dfd565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b600481106141715761417161414b565b9052565b602081016108158284614161565b600060a0828403121561419557600080fd5b61419d613d0d565b9050813581526141af60208301613dfd565b60208201526141c060408301613dfd565b60408201526141d160608301613dfd565b60608201526141e260808301613dfd565b608082015292915050565b8035613e1481613de8565b803563ffffffff81168114613e1457600080fd5b600082601f83011261421d57600080fd5b8135602061422d613e7883613dc5565b82815260059290921b8401810191818101908684111561424c57600080fd5b8286015b8481101561431c5780356001600160401b03808211156142705760008081fd5b9088019060a0828b03601f190181131561428a5760008081fd5b614292613d0d565b87840135838111156142a45760008081fd5b6142b28d8a83880101613e59565b8252506040808501356142c481613de8565b828a015260606142d58682016141f8565b828401526080915081860135858111156142ef5760008081fd5b6142fd8f8c838a0101613e59565b9184019190915250919093013590830152508352918301918301614250565b509695505050505050565b6000610140828403121561433a57600080fd5b614342613d2f565b905061434e8383614183565b815260a08201356001600160401b038082111561436a57600080fd5b61437685838601613e59565b602084015260c084013591508082111561438f57600080fd5b61439b85838601613e59565b60408401526143ac60e085016141ed565b606084015261010084013560808401526101208401359150808211156143d157600080fd5b506143de8482850161420c565b60a08301525092915050565b600082601f8301126143fb57600080fd5b8135602061440b613e7883613dc5565b82815260059290921b8401810191818101908684111561442a57600080fd5b8286015b8481101561431c5780356001600160401b0381111561444d5760008081fd5b61445b8986838b0101614327565b84525091830191830161442e565b600082601f83011261447a57600080fd5b8135602061448a613e7883613dc5565b82815260059290921b840181019181810190868411156144a957600080fd5b8286015b8481101561431c5780356001600160401b03808211156144cc57600080fd5b818901915089603f8301126144e057600080fd5b858201356144f0613e7882613dc5565b81815260059190911b830160400190878101908c83111561451057600080fd5b604085015b838110156145495780358581111561452c57600080fd5b61453b8f6040838a0101613e59565b845250918901918901614515565b508752505050928401925083016144ad565b600082601f83011261456c57600080fd5b8135602061457c613e7883613dc5565b8083825260208201915060208460051b87010193508684111561459e57600080fd5b602086015b8481101561431c57803583529183019183016145a3565b600082601f8301126145cb57600080fd5b813560206145db613e7883613dc5565b82815260059290921b840181019181810190868411156145fa57600080fd5b8286015b8481101561431c5780356001600160401b038082111561461e5760008081fd5b9088019060a0828b03601f19018113156146385760008081fd5b614640613d0d565b61464b888501613dfd565b8152604080850135848111156146615760008081fd5b61466f8e8b838901016143ea565b8a84015250606080860135858111156146885760008081fd5b6146968f8c838a0101614469565b83850152506080915081860135858111156146b15760008081fd5b6146bf8f8c838a010161455b565b91840191909152509190930135908301525083529183019183016145fe565b600080604083850312156146f157600080fd5b6001600160401b038335111561470657600080fd5b61471384843585016145ba565b91506001600160401b036020840135111561472d57600080fd5b6020830135830184601f82011261474357600080fd5b614750613e788235613dc5565b81358082526020808301929160051b84010187101561476e57600080fd5b602083015b6020843560051b850101811015614914576001600160401b038135111561479957600080fd5b87603f8235860101126147ab57600080fd5b6147be613e786020833587010135613dc5565b81358501602081810135808452908301929160059190911b016040018a10156147e657600080fd5b604083358701015b83358701602081013560051b01604001811015614904576001600160401b038135111561481a57600080fd5b833587018135016040818d03603f1901121561483557600080fd5b61483d613d51565b604082013581526001600160401b036060830135111561485c57600080fd5b8c605f60608401358401011261487157600080fd5b6040606083013583010135614888613e7882613dc5565b808282526020820191508f60608460051b60608801358801010111156148ad57600080fd5b6060808601358601015b60608460051b6060880135880101018110156148e4576148d6816141f8565b8352602092830192016148b7565b5080602085015250505080855250506020830192506020810190506147ee565b5084525060209283019201614773565b508093505050509250929050565b60008083601f84011261493457600080fd5b5081356001600160401b0381111561494b57600080fd5b6020830191508360208260051b850101111561496657600080fd5b9250929050565b60008060008060006060868803121561498557600080fd5b85356001600160401b038082111561499c57600080fd5b6149a889838a01614327565b965060208801359150808211156149be57600080fd5b6149ca89838a01614922565b909650945060408801359150808211156149e357600080fd5b506149f088828901614922565b969995985093965092949392505050565b600060808284031215614a1357600080fd5b614a1b613ce5565b8235614a2681613de8565b8152614a34602084016141f8565b60208201526040830135614a4781613e19565b60408201526060830135614a5a81613de8565b60608201529392505050565b600060208284031215614a7857600080fd5b81356001600160401b03811115614a8e57600080fd5b820160a08185031215613c0d57600080fd5b803560ff81168114613e1457600080fd5b600060208284031215614ac357600080fd5b61081282614aa0565b60008151808452602080850194506020840160005b83811015614b065781516001600160a01b031687529582019590820190600101614ae1565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614b6060e0840182614acc565b90506040840151601f198483030160c0850152614b7d8282614acc565b95945050505050565b60008060408385031215614b9957600080fd5b614ba283613dfd565b946020939093013593505050565b806040810183101561081557600080fd5b60008083601f840112614bd357600080fd5b5081356001600160401b03811115614bea57600080fd5b60208301915083602082850101111561496657600080fd5b60008060008060008060008060c0898b031215614c1e57600080fd5b614c288a8a614bb0565b975060408901356001600160401b0380821115614c4457600080fd5b614c508c838d01614bc1565b909950975060608b0135915080821115614c6957600080fd5b614c758c838d01614922565b909750955060808b0135915080821115614c8e57600080fd5b50614c9b8b828c01614922565b999c989b50969995989497949560a00135949350505050565b600060208284031215614cc657600080fd5b61081282613dfd565b6020815260006108126020830184614030565b600060208284031215614cf457600080fd5b8135613c0d81613de8565b600080600060608486031215614d1457600080fd5b614d1e8585614bb0565b925060408401356001600160401b03811115614d3957600080fd5b614d4586828701614bc1565b9497909650939450505050565b600082601f830112614d6357600080fd5b81356020614d73613e7883613dc5565b8083825260208201915060208460051b870101935086841115614d9557600080fd5b602086015b8481101561431c578035614dad81613de8565b8352918301918301614d9a565b60006020808385031215614dcd57600080fd5b82356001600160401b0380821115614de457600080fd5b818501915085601f830112614df857600080fd5b8135614e06613e7882613dc5565b81815260059190911b83018401908481019088831115614e2557600080fd5b8585015b83811015613fc057803585811115614e4057600080fd5b860160c0818c03601f19011215614e575760008081fd5b614e5f613d2f565b8882013581526040614e72818401614aa0565b8a8301526060614e83818501614aa0565b8284015260809150614e96828501613e27565b9083015260a08381013589811115614eae5760008081fd5b614ebc8f8d83880101614d52565b838501525060c0840135915088821115614ed65760008081fd5b614ee48e8c84870101614d52565b9083015250845250918601918601614e29565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680614f2157607f821691505b602082108103614f4157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081557610815614f47565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b0380841680614fa057614fa0614f70565b92169190910692915050565b808202811582820484141761081557610815614f47565b80518252600060206001600160401b0381840151168185015260408084015160a06040870152614ff660a0870182613ff1565b90506060850151868203606088015261500f8282613ff1565b608087810151898303918a01919091528051808352908601935060009250908501905b8083101561506457835180516001600160a01b0316835286015186830152928501926001929092019190840190615032565b50979650505050505050565b6020815260006108126020830184614fc3565b6080815260006150966080830187614fc3565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b6000806000606084860312156150d457600080fd5b83516150df81613e19565b60208501519093506001600160401b038111156150fb57600080fd5b8401601f8101861361510c57600080fd5b805161511a613e7882613e32565b81815287602083850101111561512f57600080fd5b615140826020830160208601613fcd565b809450505050604084015190509250925092565b80356001600160e01b0381168114613e1457600080fd5b600082601f83011261517c57600080fd5b8135602061518c613e7883613dc5565b82815260069290921b840181019181810190868411156151ab57600080fd5b8286015b8481101561431c57604081890312156151c85760008081fd5b6151d0613d51565b6151d982613dfd565b81526151e6858301615154565b818601528352918301916040016151af565b600082601f83011261520957600080fd5b81356020615219613e7883613dc5565b82815260059290921b8401810191818101908684111561523857600080fd5b8286015b8481101561431c5780356001600160401b038082111561525c5760008081fd5b9088019060a0828b03601f19018113156152765760008081fd5b61527e613d0d565b615289888501613dfd565b81526040808501358481111561529f5760008081fd5b6152ad8e8b83890101613e59565b8a84015250606093506152c1848601613dfd565b9082015260806152d2858201613dfd565b9382019390935292013590820152835291830191830161523c565b600082601f8301126152fe57600080fd5b8135602061530e613e7883613dc5565b82815260069290921b8401810191818101908684111561532d57600080fd5b8286015b8481101561431c576040818903121561534a5760008081fd5b615352613d51565b813581528482013585820152835291830191604001615331565b6000602080838503121561537f57600080fd5b82356001600160401b038082111561539657600080fd5b90840190606082870312156153aa57600080fd5b6153b2613d73565b8235828111156153c157600080fd5b830160408189038113156153d457600080fd5b6153dc613d51565b8235858111156153eb57600080fd5b8301601f81018b136153fc57600080fd5b803561540a613e7882613dc5565b81815260069190911b8201890190898101908d83111561542957600080fd5b928a01925b828410156154795785848f0312156154465760008081fd5b61544e613d51565b843561545981613de8565b8152615466858d01615154565b818d0152825292850192908a019061542e565b84525050508287013591508482111561549157600080fd5b61549d8a83850161516b565b818801528352505082840135828111156154b657600080fd5b6154c2888286016151f8565b858301525060408301359350818411156154db57600080fd5b6154e7878585016152ed565b60408201529695505050505050565b600082825180855260208086019550808260051b84010181860160005b8481101561558757601f19868403018952815160a06001600160401b0380835116865286830151828888015261554b83880182613ff1565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101615513565b5090979650505050505050565b6001600160a01b0384168152600060206060818401526155b760608401866154f6565b83810360408581019190915285518083528387019284019060005b81811015614109578451805184528601518684015293850193918301916001016155d2565b805160408084528151848201819052600092602091908201906060870190855b8181101561564e57835180516001600160a01b031684528501516001600160e01b0316858401529284019291850191600101615617565b50508583015187820388850152805180835290840192506000918401905b8083101561506457835180516001600160401b031683528501516001600160e01b03168583015292840192600192909201919085019061566c565b60208152600061081260208301846155f7565b6000602082840312156156cc57600080fd5b8151613c0d81613e19565b60008083546156e581614f0d565b600182811680156156fd576001811461571257615741565b60ff1984168752821515830287019450615741565b8760005260208060002060005b858110156157385781548a82015290840190820161571f565b50505082870194505b50929695505050505050565b6000815461575a81614f0d565b8085526020600183811680156157775760018114615791576157bf565b60ff1985168884015283151560051b8801830195506157bf565b866000528260002060005b858110156157b75781548a820186015290830190840161579c565b890184019650505b505050505092915050565b6040815260006157dd6040830185613ff1565b8281036020840152614b7d818561574d565b6001600160401b0381811683821601908082111561580f5761580f614f47565b5092915050565b60408152600061582960408301856154f6565b8281036020840152614b7d81856155f7565b60006020828403121561584d57600080fd5b81356001600160401b0381111561586357600080fd5b613651848285016145ba565b601f821115610aaa576000816000526020600020601f850160051c810160208610156158985750805b601f850160051c820191505b818110156158b7578281556001016158a4565b505050505050565b81516001600160401b038111156158d8576158d8613ccf565b6158ec816158e68454614f0d565b8461586f565b602080601f83116001811461592157600084156159095750858301515b600019600386901b1c1916600185901b1785556158b7565b600085815260208120601f198616915b8281101561595057888601518255948401946001909101908401615931565b508582101561596e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208152600082546001600160a01b038116602084015260ff8160a01c16151560408401526001600160401b038160a81c1660608401525060808083015261081260a083016001850161574d565b60006001600160401b03808416806159e6576159e6614f70565b92169190910492915050565b600060208284031215615a0457600080fd5b610812826141f8565b6000808335601e19843603018112615a2457600080fd5b8301803591506001600160401b03821115615a3e57600080fd5b60200191503681900382131561496657600080fd5b8082018082111561081557610815614f47565b60ff818116838216019081111561081557610815614f47565b8183823760009101908152919050565b828152604082602083013760600192915050565b6020810160068310615ab757615ab761414b565b91905290565b60ff818116838216029081169081811461580f5761580f614f47565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b81811015615b315784546001600160a01b031683526001948501949284019201615b0c565b50508481036060860152865180825290820192508187019060005b81811015615b715782516001600160a01b031685529383019391830191600101615b4c565b50505060ff851660808501525090505b9695505050505050565b60006001600160401b03808616835280851660208401525060606040830152614b7d6060830184613ff1565b8281526040602082015260006136516040830184613ff1565b6001600160401b03848116825283166020820152606081016136516040830184614161565b848152615c056020820185614161565b608060408201526000615c1b6080830185613ff1565b905082606083015295945050505050565b600060208284031215615c3e57600080fd5b8151613c0d81613de8565b6020815260008251610100806020850152615c68610120850183613ff1565b91506020850151615c8460408601826001600160401b03169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615cbe60a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615cdb8483613ff1565b935060c08701519150808685030160e0870152615cf88483613ff1565b935060e0870151915080868503018387015250615b818382613ff1565b6001600160a01b03831681526040602082015260006136516040830184613ff1565b600060208284031215615d4957600080fd5b5051919050565b600082825180855260208086019550808260051b84010181860160005b8481101561558757601f19868403018952815160a08151818652615d9382870182613ff1565b9150506001600160a01b03868301511686860152604063ffffffff8184015116818701525060608083015186830382880152615dcf8382613ff1565b6080948501519790940196909652505098840198925090830190600101615d6d565b6020815260006108126020830184615d50565b60008282518085526020808601955060208260051b8401016020860160005b8481101561558757601f19868403018952615e3f838351613ff1565b98840198925090830190600101615e23565b60008151808452602080850194506020840160005b83811015614b0657815163ffffffff1687529582019590820190600101615e66565b60608152600084518051606084015260208101516001600160401b0380821660808601528060408401511660a08601528060608401511660c08601528060808401511660e0860152505050602085015161014080610100850152615ef06101a0850183613ff1565b91506040870151605f198086850301610120870152615f0f8483613ff1565b935060608901519150615f2c838701836001600160a01b03169052565b608089015161016087015260a0890151925080868503016101808701525050615f558282615d50565b9150508281036020840152615f6a8186615e04565b90508281036040840152615b818185615e5156fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applySourceChainConfigUpdates\",\"inputs\":[{\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"commit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"ss\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"rawVs\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeSingleMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllSourceChainConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExecutionState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMerkleRoot\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyExecute\",\"inputs\":[{\"name\":\"reports\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\",\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"components\":[{\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AlreadyAttempted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RootRemoved\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedAlreadyExecutedMessage\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedReportExecution\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainConfigSet\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sourceConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainSelectorAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaticConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CommitOnRampMismatch\",\"inputs\":[{\"name\":\"reportOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"configOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"EmptyBatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyReport\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"InvalidDataLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInterval\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"min\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"max\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionGasLimit\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"newLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionTokenGasOverride\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"oldLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverride\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageDestChainSelector\",\"inputs\":[{\"name\":\"messageDestChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNewState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newState\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}]},{\"type\":\"error\",\"name\":\"InvalidOnRampUpdate\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionGasAmountCountMismatch\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ManualExecutionGasLimitMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionNotYetEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotACompatiblePool\",\"inputs\":[{\"name\":\"notPool\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReceiverError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReleaseOrMintBalanceMismatch\",\"inputs\":[{\"name\":\"amountReleased\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePre\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePost\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RootAlreadyCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"RootNotCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SourceChainNotEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SourceChainSelectorMismatch\",\"inputs\":[{\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"StaleCommitReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"TokenDataMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"TokenHandlingError\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedTokenData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x6101408060405234610848576162ef803803809161001d828561087e565b833981019080820361014081126108485760a08112610848576040519060a082016001600160401b0381118382101761084d5760405261005c836108a1565b825260208301519261ffff84168403610848576020830193845260408101516001600160a01b0381168103610848576040840190815261009e606083016108b5565b946060850195865260806100b38185016108b5565b86820190815294609f19011261084857604051946100d086610863565b6100dc60a085016108b5565b865260c08401519463ffffffff86168603610848576020870195865261010460e086016108c9565b976040880198895261011961010087016108b5565b6060890190815261012087015190966001600160401b03821161084857018a601f820112156108485780519a6001600160401b038c1161084d578b60051b916020806040519e8f9061016d8388018361087e565b81520193820101908282116108485760208101935b828510610748575050505050331561073757600180546001600160a01b031916331790554660805284516001600160a01b0316158015610725575b8015610713575b6106f15782516001600160401b0316156107025782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a182516001600160a01b0316156106f1579151600480548351865160ff60c01b90151560c01b1663ffffffff60a01b60a09290921b919091166001600160a01b039485166001600160c81b0319909316831717179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff166020820152935115159184019190915290511660608201527fcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee90608090a160005b815181101561066b576020600582901b8301810151908101516001600160401b031690600090821561065c5780516001600160a01b03161561064d57828252600860205260408220906060810151600183019361038585546108d6565b6105ee578354600160a81b600160e81b031916600160a81b1784556040518681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b815180159081156105c3575b506105b4578151916001600160401b0383116105a0576103f986546108d6565b601f811161055b575b50602091601f84116001146104e257926001989796949281926000805160206162cf8339815191529795926104d7575b5050600019600383901b1c191690881b1783555b60408101518254915160a089811b8a9003801960ff60a01b1990951693151590911b60ff60a01b169290921792909216911617815561048484610993565b506104ce6040519283926020845254888060a01b038116602085015260ff8160a01c1615156040850152888060401b039060a81c16606084015260808084015260a0830190610910565b0390a201610328565b015190503880610432565b9190601f198416878452828420935b818110610543575092600199989795939285926000805160206162cf83398151915298968c951061052a575b505050811b018355610446565b015160001960f88460031b161c1916905538808061051d565b929360206001819287860151815501950193016104f1565b86835260208320601f850160051c81019160208610610596575b601f0160051c01905b81811061058b5750610402565b83815560010161057e565b9091508190610575565b634e487b7160e01b82526041600452602482fd5b6342bcdf7f60e11b8152600490fd5b905060208301206040516020810190838252602081526105e460408261087e565b51902014386103d9565b835460a81c6001600160401b0316600114158061061f575b156103cd57632105803760e11b81526004869052602490fd5b50604051610638816106318189610910565b038261087e565b60208151910120825160208401201415610606565b6342bcdf7f60e11b8252600482fd5b63c656089560e01b8252600482fd5b6040516158a89081610a2782396080518161368c015260a05181818161048e01526141a1015260c0518181816104e401528181612cba0152818161310e015261413b015260e051818181610513015261497e01526101005181818161054201526145640152610120518181816104b50152818161243401528181614a7101526155dd0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101c4565b5080516001600160a01b0316156101bd565b639b15e16f60e01b60005260046000fd5b84516001600160401b0381116108485782016080818603601f190112610848576040519061077582610863565b60208101516001600160a01b0381168103610848578252610798604082016108a1565b60208301526107a9606082016108c9565b604083015260808101516001600160401b03811161084857602091010185601f820112156108485780516001600160401b03811161084d57604051916107f9601f8301601f19166020018461087e565b81835287602083830101116108485760005b8281106108335750509181600060208096949581960101526060820152815201940193610182565b8060208092840101518282870101520161080b565b600080fd5b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b0382111761084d57604052565b601f909101601f19168101906001600160401b0382119082101761084d57604052565b51906001600160401b038216820361084857565b51906001600160a01b038216820361084857565b5190811515820361084857565b90600182811c92168015610906575b60208310146108f057565b634e487b7160e01b600052602260045260246000fd5b91607f16916108e5565b60009291815491610920836108d6565b8083529260018116908115610976575060011461093c57505050565b60009081526020812093945091925b83831061095c575060209250010190565b60018160209294939454838587010152019101919061094b565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a20576006546801000000000000000081101561084d576001810180600655811015610a0a577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806304666f9c1461015757806306285c6914610152578063181f5a771461014d5780633f4b04aa146101485780635215505b146101435780635e36480c1461013e5780635e7bb0081461013957806360987c20146101345780637437ff9f1461012f57806379ba50971461012a5780637edf52f41461012557806385572ffb146101205780638da5cb5b1461011b578063c673e58414610116578063ccd37ba314610111578063de5e0b9a1461010c578063e9d68a8e14610107578063f2fde38b14610102578063f58e03fc146100fd5763f716f99f146100f857600080fd5b6118d4565b6117b7565b61172c565b611691565b6115f5565b611571565b6114c6565b6113de565b6113a8565b6111e2565b611162565b6110b9565b61103e565b610e39565b6108ce565b610789565b61067c565b61061d565b61043d565b61031f565b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b0382111761018d57604052565b61015c565b60a081019081106001600160401b0382111761018d57604052565b604081019081106001600160401b0382111761018d57604052565b606081019081106001600160401b0382111761018d57604052565b90601f801991011681019081106001600160401b0382111761018d57604052565b6040519061021360c0836101e3565b565b6040519061021360a0836101e3565b60405190610213610100836101e3565b604051906102136040836101e3565b6001600160401b03811161018d5760051b60200190565b6001600160a01b0381160361026b57565b600080fd5b600435906001600160401b038216820361026b57565b35906001600160401b038216820361026b57565b8015150361026b57565b35906102138261029a565b6001600160401b03811161018d57601f01601f191660200190565b9291926102d6826102af565b916102e460405193846101e3565b82948184528183011161026b578281602093846000960137010152565b9080601f8301121561026b5781602061031c933591016102ca565b90565b3461026b57602036600319011261026b576004356001600160401b03811161026b573660238201121561026b5780600401359061035b82610243565b9061036960405192836101e3565b8282526024602083019360051b8201019036821161026b5760248101935b8285106103995761039784611a0f565b005b84356001600160401b03811161026b5782016080602319823603011261026b57604051916103c683610172565b60248201356103d48161025a565b83526103e260448301610286565b602084015260648201356103f58161029a565b60408401526084820135926001600160401b03841161026b57610422602094936024869536920101610301565b6060820152815201940193610387565b600091031261026b57565b3461026b57600036600319011261026b576000608060405161045e81610192565b82815282602082015282604082015282606082015201526105bc60405161048481610192565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b604051906105cf6020836101e3565b60008252565b60005b8381106105e85750506000910152565b81810151838201526020016105d8565b90602091610611815180928185528580860191016105d5565b601f01601f1916010190565b3461026b57600036600319011261026b576105bc604080519061064081836101e3565b601182527f4f666652616d7020312e362e302d6465760000000000000000000000000000006020830152519182916020835260208301906105f8565b3461026b57600036600319011261026b5760206001600160401b03600b5416604051908152f35b906080606061031c936001600160a01b0381511684526020810151151560208501526001600160401b03604082015116604085015201519181606082015201906105f8565b6040810160408252825180915260206060830193019060005b81811061076a575050506020818303910152815180825260208201916020808360051b8301019401926000915b83831061073d57505050505090565b909192939460208061075b600193601f1986820301875289516106a3565b9701930193019193929061072e565b82516001600160401b0316855260209485019490920191600101610701565b3461026b57600036600319011261026b576006546107a681610243565b906107b460405192836101e3565b808252601f196107c382610243565b0160005b8181106108855750506107d981611ce2565b9060005b8181106107f55750506105bc604051928392836106e8565b8061082b610813610807600194614022565b6001600160401b031690565b61081d8387611d3c565b906001600160401b03169052565b61086961086461084b61083e8488611d3c565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611e28565b6108738287611d3c565b5261087e8186611d3c565b50016107dd565b602090610890611cbb565b828287010152016107c7565b634e487b7160e01b600052602160045260246000fd5b600411156108bc57565b61089c565b9060048210156108bc5752565b3461026b57604036600319011261026b576108e7610270565b602435906001600160401b038216820361026b5760209161090791611ec4565b61091460405180926108c1565bf35b91908260a091031261026b5760405161092e81610192565b60806109738183958035855261094660208201610286565b602086015261095760408201610286565b604086015261096860608201610286565b606086015201610286565b910152565b35906102138261025a565b63ffffffff81160361026b57565b359061021382610983565b81601f8201121561026b578035906109b382610243565b926109c160405194856101e3565b82845260208085019360051b8301019181831161026b5760208101935b8385106109ed57505050505090565b84356001600160401b03811161026b57820160a0818503601f19011261026b5760405191610a1a83610192565b60208201356001600160401b03811161026b57856020610a3c92850101610301565b83526040820135610a4c8161025a565b6020840152610a5d60608301610991565b60408401526080820135926001600160401b03841161026b5760a083610a8a886020809881980101610301565b6060840152013560808201528152019401936109de565b9190916101408184031261026b57610ab7610204565b92610ac28183610916565b845260a08201356001600160401b03811161026b5781610ae3918401610301565b602085015260c08201356001600160401b03811161026b5781610b07918401610301565b6040850152610b1860e08301610978565b606085015261010082013560808501526101208201356001600160401b03811161026b57610b46920161099c565b60a0830152565b9080601f8301121561026b578135610b6481610243565b92610b7260405194856101e3565b81845260208085019260051b8201019183831161026b5760208201905b838210610b9e57505050505090565b81356001600160401b03811161026b57602091610bc087848094880101610aa1565b815201910190610b8f565b81601f8201121561026b57803590610be282610243565b92610bf060405194856101e3565b82845260208085019360051b8301019181831161026b5760208101935b838510610c1c57505050505090565b84356001600160401b03811161026b57820183603f8201121561026b576020810135610c4781610243565b91610c5560405193846101e3565b8183526020808085019360051b830101019186831161026b5760408201905b838210610c8e575050509082525060209485019401610c0d565b81356001600160401b03811161026b57602091610cb28a8480809589010101610301565b815201910190610c74565b929190610cc981610243565b93610cd760405195866101e3565b602085838152019160051b810192831161026b57905b828210610cf957505050565b8135815260209182019101610ced565b9080601f8301121561026b5781602061031c93359101610cbd565b81601f8201121561026b57803590610d3b82610243565b92610d4960405194856101e3565b82845260208085019360051b8301019181831161026b5760208101935b838510610d7557505050505090565b84356001600160401b03811161026b57820160a0818503601f19011261026b57610d9d610215565b91610daa60208301610286565b835260408201356001600160401b03811161026b57856020610dce92850101610b4d565b602084015260608201356001600160401b03811161026b57856020610df592850101610bcb565b60408401526080820135926001600160401b03841161026b5760a083610e22886020809881980101610d09565b606084015201356080820152815201940193610d66565b3461026b57604036600319011261026b576004356001600160401b03811161026b57610e69903690600401610d24565b6024356001600160401b03811161026b573660238201121561026b57806004013591610e9483610243565b91610ea260405193846101e3565b8383526024602084019460051b8201019036821161026b5760248101945b828610610ed1576103978585611f0c565b85356001600160401b03811161026b5782013660438201121561026b576024810135610efc81610243565b91610f0a60405193846101e3565b818352602060248185019360051b830101019036821161026b5760448101925b828410610f44575050509082525060209586019501610ec0565b83356001600160401b03811161026b576024908301016040601f19823603011261026b5760405190610f75826101ad565b6020810135825260408101356001600160401b03811161026b57602091010136601f8201121561026b57803590610fab82610243565b91610fb960405193846101e3565b80835260208084019160051b8301019136831161026b57602001905b828210610ff45750505091816020938480940152815201930192610f2a565b60208091833561100381610983565b815201910190610fd5565b9181601f8401121561026b578235916001600160401b03831161026b576020808501948460051b01011161026b57565b3461026b57606036600319011261026b576004356001600160401b03811161026b5761106e903690600401610aa1565b6024356001600160401b03811161026b5761108d90369060040161100e565b91604435926001600160401b03841161026b576110b161039794369060040161100e565b939092612318565b3461026b57600036600319011261026b576110d26125e5565b506105bc6040516110e281610172565b60ff6004546001600160a01b038116835263ffffffff8160a01c16602084015260c01c16151560408201526001600160a01b036005541660608201526040519182918291909160606001600160a01b0381608084019582815116855263ffffffff6020820151166020860152604081015115156040860152015116910152565b3461026b57600036600319011261026b576000546001600160a01b03811633036111d1576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b3461026b57608036600319011261026b57600060405161120181610172565b60043561120d8161025a565b815260243561121b81610983565b602082015260443561122c8161029a565b604082015260643561123d8161025a565b606082015261124a613489565b6001600160a01b038151161561139957611393816112a96001600160a01b037fcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee9451166001600160a01b03166001600160a01b03196004541617600455565b60208101516004547fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff77ffffffff000000000000000000000000000000000000000078ff0000000000000000000000000000000000000000000000006040860151151560c01b169360a01b169116171760045561134f61133360608301516001600160a01b031690565b6001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160606001600160a01b0381608084019582815116855263ffffffff6020820151166020860152604081015115156040860152015116910152565b0390a180f35b6342bcdf7f60e11b8252600482fd5b3461026b57602036600319011261026b576004356001600160401b03811161026b5760a090600319903603011261026b57600080fd5b3461026b57600036600319011261026b5760206001600160a01b0360015416604051908152f35b6004359060ff8216820361026b57565b359060ff8216820361026b57565b906020808351928381520192019060005b8181106114415750505090565b82516001600160a01b0316845260209384019390920191600101611434565b9061031c9160208152606082518051602084015260ff602082015116604084015260ff6040820151168284015201511515608082015260406114b1602084015160c060a085015260e0840190611423565b9201519060c0601f1982850301910152611423565b3461026b57602036600319011261026b5760ff6114e1611405565b6060604080516114f0816101c8565b6114f86125e5565b815282602082015201521660005260026020526105bc6040600020600361156060405192611525846101c8565b61152e8161260a565b845260405161154b816115448160028601612643565b03826101e3565b60208501526115446040518094819301612643565b604082015260405191829182611460565b3461026b57604036600319011261026b5761158a610270565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b9060049160441161026b57565b9181601f8401121561026b578235916001600160401b03831161026b576020838186019501011161026b57565b3461026b5760c036600319011261026b5761160f366115bb565b6044356001600160401b03811161026b5761162e9036906004016115c8565b6064929192356001600160401b03811161026b5761165090369060040161100e565b60843594916001600160401b03861161026b5761167461039796369060040161100e565b94909360a43596612c75565b90602061031c9281815201906106a3565b3461026b57602036600319011261026b576001600160401b036116b2610270565b6116ba611cbb565b501660005260086020526105bc6040600020600161171b604051926116de84610172565b6001600160401b0381546001600160a01b038116865260ff8160a01c161515602087015260a81c1660408501526115446040518094819301611d8a565b606082015260405191829182611680565b3461026b57602036600319011261026b576001600160a01b036004356117518161025a565b611759613489565b163381146117a657806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b3461026b57606036600319011261026b576117d1366115bb565b6044356001600160401b03811161026b576117f09036906004016115c8565b9182820160208382031261026b578235906001600160401b03821161026b5761181a918401610d24565b60405190602061182a81846101e3565b60008352601f19810160005b81811061185e57505050610397949161184e916136cd565b611856613184565b928392613a33565b60608582018401528201611836565b9080601f8301121561026b57813561188481610243565b9261189260405194856101e3565b81845260208085019260051b82010192831161026b57602001905b8282106118ba5750505090565b6020809183356118c98161025a565b8152019101906118ad565b3461026b57602036600319011261026b576004356001600160401b03811161026b573660238201121561026b5780600401359061191082610243565b9061191e60405192836101e3565b8282526024602083019360051b8201019036821161026b5760248101935b82851061194c57610397846131a0565b84356001600160401b03811161026b57820160c0602319823603011261026b57611974610204565b916024820135835261198860448301611415565b602084015261199960648301611415565b60408401526119aa608483016102a4565b606084015260a48201356001600160401b03811161026b576119d2906024369185010161186d565b608084015260c4820135926001600160401b03841161026b576119ff60209493602486953692010161186d565b60a082015281520194019361193c565b611a17613489565b60005b8151811015611cb757611a2d8183611d3c565b5190611a4360208301516001600160401b031690565b916001600160401b038316908115611ca657611a78611a6c611a6c83516001600160a01b031690565b6001600160a01b031690565b15611c0d57611a9a846001600160401b03166000526008602052604060002090565b906060810151916001810195611ab08754611d50565b611c3457611b237ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb991611b0984750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b82518015908115611c1e575b50611c0d57611bee611bd2611c0493611b6f7f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b9660019a61352b565b611bc5611b7f6040830151151590565b85547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178555565b516001600160a01b031690565b82906001600160a01b03166001600160a01b0319825416179055565b611bf78461504a565b50604051918291826135fc565b0390a201611a1a565b6342bcdf7f60e11b60005260046000fd5b90506020840120611c2d6134ae565b1438611b33565b60016001600160401b03611c5384546001600160401b039060a81c1690565b16141580611c87575b611c665750611b27565b632105803760e11b6000526001600160401b031660045260246000fd5b6000fd5b50611c9187611e0d565b60208151910120845160208601201415611c5c565b63c656089560e01b60005260046000fd5b5050565b60405190611cc882610172565b606080836000815260006020820152600060408201520152565b90611cec82610243565b611cf960405191826101e3565b8281528092611d0a601f1991610243565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611d375760200190565b611d14565b8051821015611d375760209160051b010190565b90600182811c92168015611d80575b6020831014611d6a57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611d5f565b60009291815491611d9a83611d50565b8083529260018116908115611df05750600114611db657505050565b60009081526020812093945091925b838310611dd6575060209250010190565b600181602092949394548385870101520191019190611dc5565b915050602093945060ff929192191683830152151560051b010190565b90610213611e219260405193848092611d8a565b03836101e3565b9060016060604051611e3981610172565b611e8281956001600160401b0381546001600160a01b038116855260ff8160a01c161515602086015260a81c166040840152611e7b6040518096819301611d8a565b03846101e3565b0152565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611eb257565b611e86565b91908203918211611eb257565b611ed082607f92613646565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611eb2576003911c1660048110156108bc5790565b611f1461368a565b80518251810361210b5760005b818110611f3457505090610213916136cd565b611f3e8184611d3c565b516020810190815151611f518488611d3c565b51928351820361210b5790916000925b808410611f75575050505050600101611f21565b91949398611f87848b98939598611d3c565b515198611f95888851611d3c565b5199806120c2575b5060a08a01988b6020611fb38b8d515193611d3c565b51015151036120855760005b8a515181101561207057611ffb611ff2611fe88f6020611fe08f8793611d3c565b510151611d3c565b5163ffffffff1690565b63ffffffff1690565b8b8161200c575b5050600101611fbf565b611ff2604061201f8561202b9451611d3c565b51015163ffffffff1690565b9081811061203a57508b612002565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611f61565b611c838b516120a0606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b60808b0151811015611f9d57611c83908b6120e488516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190612129826101ad565b60006020838281520152565b604051906121446020836101e3565b600080835282815b82811061215857505050565b60209061216361211c565b8282850101520161214c565b805182526001600160401b03602082015116602083015260806121b66121a4604084015160a0604087015260a08601906105f8565b606084015185820360608701526105f8565b9101519160808183039101526020808351928381520192019060005b8181106121df5750505090565b825180516001600160a01b0316855260209081015181860152604090940193909201916001016121d2565b90602061031c92818152019061216f565b6040513d6000823e3d90fd5b3d15612252573d90612238826102af565b9161224660405193846101e3565b82523d6000602084013e565b606090565b90602061031c9281815201906105f8565b909160608284031261026b57815161227f8161029a565b9260208301516001600160401b03811161026b5783019080601f8301121561026b578151916122ad836102af565b916122bb60405193846101e3565b8383526020848301011161026b576040926122dc91602080850191016105d5565b92015190565b9293606092959461ffff6123066001600160a01b039460808852608088019061216f565b97166020860152604085015216910152565b929093913033036125d45761232b612135565b9460a0850151805161258d575b5050505050805191612356602084519401516001600160401b031690565b906020830151916040840192612383845192612370610215565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b036123ac6005546001600160a01b031690565b1680612510575b5051511580612504575b80156124ee575b80156124c5575b611cb75761245d9181612402611a6c6123f561084b602060009751016001600160401b0390511690565b546001600160a01b031690565b908361241d606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f000000000000000000000000000000000000000000000000000000000000000090600486016122e2565b03925af19081156124c057600090600092612499575b501561247c5750565b6040516302a35ba360e21b815290819061206c9060048301612257565b90506124b891503d806000833e6124b081836101e3565b810190612268565b509038612473565b61221b565b506124e96124e56124e060608401516001600160a01b031690565b6138f4565b1590565b6123cb565b5060608101516001600160a01b03163b156123c4565b506080810151156123bd565b803b1561026b57600060405180926308d450a160e01b82528183816125388a6004830161220a565b03925af19081612572575b5061256c5761206c612553612227565b6040516309c2532560e01b815291829160048301612257565b386123b3565b806125816000612587936101e3565b80610432565b38612543565b85965060206125c99601516125ac60608901516001600160a01b031690565b906125c360208a51016001600160401b0390511690565b926137db565b903880808080612338565b6306e34e6560e31b60005260046000fd5b604051906125f282610172565b60006060838281528260208201528260408201520152565b9060405161261781610172565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106126675750505090565b82546001600160a01b031684526020909301926001928301920161265a565b90610213611e219260405193848092612643565b35906001600160e01b038216820361026b57565b81601f8201121561026b578035906126c582610243565b926126d360405194856101e3565b82845260208085019360061b8301019181831161026b57602001925b8284106126fd575050505090565b60408483031261026b5760206040918251612717816101ad565b61272087610286565b815261272d83880161269a565b838201528152019301926126ef565b81601f8201121561026b5780359061275382610243565b9261276160405194856101e3565b82845260208085019360051b8301019181831161026b5760208101935b83851061278d57505050505090565b84356001600160401b03811161026b57820160a0818503601f19011261026b57604051916127ba83610192565b6127c660208301610286565b83526040820135926001600160401b03841161026b5760a0836127f0886020809881980101610301565b8584015261280060608201610286565b604084015261281160808201610286565b60608401520135608082015281520194019361277e565b81601f8201121561026b5780359061283f82610243565b9261284d60405194856101e3565b82845260208085019360061b8301019181831161026b57602001925b828410612877575050505090565b60408483031261026b5760206040918251612891816101ad565b863581528287013583820152815201930192612869565b60208183031261026b578035906001600160401b03821161026b570160608183031261026b57604051916128db836101c8565b81356001600160401b03811161026b57820160408183031261026b5760405190612904826101ad565b80356001600160401b03811161026b57810183601f8201121561026b57803561292c81610243565b9161293a60405193846101e3565b81835260208084019260061b8201019086821161026b57602001915b8183106129d25750505082526020810135906001600160401b03821161026b57612982918491016126ae565b6020820152835260208201356001600160401b03811161026b57816129a891840161273c565b602084015260408201356001600160401b03811161026b576129ca9201612828565b604082015290565b60408388031261026b57602060409182516129ec816101ad565b85356129f78161025a565b8152612a0483870161269a565b83820152815201920191612956565b9080602083519182815201916020808360051b8301019401926000915b838310612a3f57505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612a7d8585015160a08786015260a08501906105f8565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612a30565b916001600160a01b03612ad992168352606060208401526060830190612a13565b9060408183039101526020808351928381520192019060005b818110612aff5750505090565b8251805185526020908101518186015260409094019390920191600101612af2565b906020808351928381520192019060005b818110612b3f5750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612b32565b9190604081019083519160408252825180915260206060830193019060005b818110612bb357505050602061031c93940151906020818403910152612b21565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612b92565b90602061031c928181520190612b73565b9081602091031261026b575161031c8161029a565b9091612c2461031c936040845260408401906105f8565b916020818403910152611d8a565b6001600160401b036001911601906001600160401b038211611eb257565b9091612c6761031c93604084526040840190612a13565b916020818403910152612b73565b929693959190979497612c8a828201826128a8565b98612c9e6124e560045460ff9060c01c1690565b6130f2575b895180515115908115916130e3575b5061300a575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316999860208a019860005b8a518051821015612fa85781612d0191611d3c565b518d612d1482516001600160401b031690565b604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201529091602090829060249082905afa9081156124c057600091612f7a575b50612f5d57612d6390613942565b60208201805160208151910120906001830191612d7f83611e0d565b6020815191012003612f40575050805460408301516001600160401b039081169160a81c168114801590612f18575b612ec657506080820151908115612eb557612dff82612df0612dd786516001600160401b031690565b6001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b54612e81578291612e65612e7a92612e2c612e2760606001999801516001600160401b031690565b612c32565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b612df0612dd74294516001600160401b031690565b5501612cec565b50612e96611c8392516001600160401b031690565b6332cf0cbf60e01b6000526001600160401b0316600452602452604490565b63504570e360e01b60005260046000fd5b82611c8391612ef06060612ee184516001600160401b031690565b9301516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b50612f3061080760608501516001600160401b031690565b6001600160401b03821611612dae565b5161206c60405192839263b80d8fa960e01b845260048401612c0d565b637edeb53960e11b6000526001600160401b031660045260246000fd5b612f9b915060203d8111612fa1575b612f9381836101e3565b810190612bf8565b38612d55565b503d612f89565b50506130049496989b507f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e46102139b612ffc949597999b51905190612ff260405192839283612c50565b0390a13691610cbd565b943691610cbd565b93613d11565b61301f602086015b356001600160401b031690565b600b546001600160401b03828116911610156130c757613055906001600160401b03166001600160401b0319600b541617600b55565b61306d611a6c611a6c6004546001600160a01b031690565b8a5190803b1561026b57604051633937306f60e01b815291600091839182908490829061309d9060048301612be7565b03925af180156124c0576130b2575b50612cb8565b8061258160006130c1936101e3565b386130ac565b5060208a015151612cb857632261116760e01b60005260046000fd5b60209150015151151538612cb2565b60208a01518051613104575b50612ca3565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060408c0151823b1561026b57604051633854844f60e11b815292600092849283918291613160913060048501612ab8565b03915afa80156124c057156130fe5780612581600061317e936101e3565b386130fe565b604051906131936020836101e3565b6000808352366020840137565b6131a8613489565b60005b8151811015611cb7576131be8183611d3c565b51906040820160ff6131d1825160ff1690565b161561347357602083015160ff16926131f78460ff166000526002602052604060002090565b916001830191825461321261320c8260ff1690565b60ff1690565b613438575061323f6132276060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a081019182516101008151116133e057805115613422576003860161326d61326782612686565b8a614df8565b60608401516132fd575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946002946132d96132c96132f79a966132c28760019f9c6132bd6132ef9a8f614f59565b613f25565b5160ff1690565b845460ff191660ff821617909455565b5190818555519060405195869501908886613fab565b0390a1614fdb565b016131ab565b9794600287939597019661331961331389612686565b88614df8565b60808501519461010086511161340c57855161334161320c61333c8a5160ff1690565b613f11565b10156133f65785518451116133e0576132d96132c97fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547986132c28760019f6132bd6132f79f9a8f6133c860029f6133c26132ef9f8f906132bd84926133a7845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b82614e8c565b505050979c9f50975050969a50505094509450613277565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff1661345361344e6060840151151590565b151590565b9015151461323f576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b6001600160a01b0360015416330361349d57565b6315ae3a6f60e11b60005260046000fd5b604051602081019060008252602081526134c96040826101e3565b51902090565b8181106134da575050565b600081556001016134cf565b9190601f81116134f557505050565b610213926000526020600020906020601f840160051c83019310613521575b601f0160051c01906134cf565b9091508190613514565b91909182516001600160401b03811161018d576135528161354c8454611d50565b846134e6565b6020601f8211600114613593578190613584939495600092613588575b50508160011b916000199060031b1c19161790565b9055565b01519050388061356f565b601f198216906135a884600052602060002090565b9160005b8181106135e4575095836001959697106135cb575b505050811b019055565b015160001960f88460031b161c191690553880806135c1565b9192602060018192868b0151815501940192016135ac565b90600160a061031c93602081526001600160401b0384546001600160a01b038116602084015260ff81851c161515604084015260a81c166060820152608080820152019101611d8a565b906001600160401b03613686921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036136b55750565b630f01ce8560e01b6000526004524660245260446000fd5b91909180511561376f5782511592602091604051926136ec81856101e3565b60008452601f19810160005b81811061374b5750505060005b8151811015613743578061372c61371e60019385611d3c565b5188156137325786906140ea565b01613705565b61373c8387611d3c565b51906140ea565b505050509050565b8290604051613759816101ad565b60008152606083820152828289010152016136f8565b63c2e5347d60e01b60005260046000fd5b9190811015611d375760051b0190565b3561031c81610983565b9190811015611d375760051b81013590601e198136030182121561026b5701908135916001600160401b03831161026b57602001823603811361026b579190565b909294919397968151966137ee88610243565b976137fc604051998a6101e3565b80895261380b601f1991610243565b0160005b8181106138dd57505060005b83518110156138d057806138628c8a8a8a61385c613855878d61384e828f8f9d8f9e60019f8161387e575b505050611d3c565b519761379a565b36916102ca565b9361492f565b61386c828c611d3c565b52613877818b611d3c565b500161381b565b63ffffffff613896613891858585613780565b613790565b1615613846576138c6926138ad9261389192613780565b60406138b98585611d3c565b51019063ffffffff169052565b8f8f908391613846565b5096985050505050505050565b6020906138e861211c565b82828d0101520161380f565b6139056385572ffb60e01b82614c92565b908161391f575b81613915575090565b61031c9150614c64565b905061392a81614be9565b159061390c565b61390563aff2afbf60e01b82614c92565b6001600160401b031680600052600860205260406000209060ff825460a01c161561396b575090565b63ed053c5960e01b60005260045260246000fd5b6084019081608411611eb257565b60a001908160a011611eb257565b91908201809211611eb257565b600311156108bc57565b60038210156108bc5752565b906102136040516139ce816101ad565b602060ff829554818116845260081c1691016139b2565b8054821015611d375760005260206000200190600090565b60ff60019116019060ff8211611eb257565b60ff601b9116019060ff8211611eb257565b90606092604091835260208301370190565b6001600052600260205293613a677fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e061260a565b93853594613a748561397f565b6060820190613a838251151590565b613ce3575b803603613ccb57508151878103613cb25750613aa261368a565b60016000526003602052613af1613aec7fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b6139be565b60026020820151613b01816139a8565b613b0a816139a8565b149081613c4a575b5015613c395751613b70575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613b5461301260019460200190565b604080519283526001600160401b0391909116602083015290a2565b613b9161320c613b8c602085969799989a955194015160ff1690565b6139fd565b03613c28578151835103613c1757613c0f6000613b549461301294613bdb7f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b36916102ca565b60208151910120604051613c0681613bf889602083019586613a21565b03601f1981018352826101e3565b5190208a614cc2565b948394613b1e565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b631b41e11d60e31b60005260046000fd5b60016000526002602052613caa9150611a6c90613c9790613c9160037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b906139e5565b90546001600160a01b039160031b1c1690565b331438613b12565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613d0c90613d06613cfc613cf78751611e9c565b61398d565b613d068851611e9c565b9061399b565b613a88565b60008052600260205294909390929091613d4a7fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b61260a565b94863595613d578361397f565b6060820190613d668251151590565b613eee575b803603613ccb57508151888103613ed55750613d8561368a565b600080526003602052613dba613aec7f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613ad4565b60026020820151613dca816139a8565b613dd3816139a8565b149081613e8c575b5015613c395751613e1e575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613b5461301260009460200190565b613e3a61320c613b8c602087989a999b96975194015160ff1690565b03613c28578351865103613c17576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613b5495613bdb613e83946130129736916102ca565b94839438613de7565b600080526002602052613ecd9150611a6c90613c9790613c9160037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613c88565b331438613ddb565b6324f7d61360e21b600052600452602488905260446000fd5b613f0c90613d06613f02613cf78951611e9c565b613d068a51611e9c565b613d6b565b60ff166003029060ff8216918203611eb257565b8151916001600160401b03831161018d5768010000000000000000831161018d576020908254848455808510613f8e575b500190600052602060002060005b838110613f715750505050565b60019060206001600160a01b038551169401938184015501613f64565b613fa59084600052858460002091820191016134cf565b38613f56565b95949392909160ff613fd093168752602087015260a0604087015260a0860190612643565b84810360608601526020808351928381520192019060005b818110614003575050509060806102139294019060ff169052565b82516001600160a01b0316845260209384019390920191600101613fe8565b600654811015611d375760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b0361031c94938160609416835216602082015281604082015201906105f8565b60409061031c9392815281602082015201906105f8565b9291906001600160401b039081606495166004521660245260048110156108bc57604452565b9493926140d46060936140e593885260208801906108c1565b6080604087015260808601906105f8565b930152565b906140fc82516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156124c057600091614818575b506147d65760208301918251519485156147a6576040850180515187036147955761419e87611ce2565b957f00000000000000000000000000000000000000000000000000000000000000006141d460016141ce87613942565b01611e0d565b6020815191012060405161423481613bf86020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a81106146fd57505050806080606061426493015191015190888661528b565b9788156146df5760005b8881106142815750505050505050505050565b5a61428d828951611d3c565b518051606001516142a7906001600160401b031688611ec4565b6142b0816108b2565b8015908d82831593846146cc575b15614689576060881561460c57506142e560206142db898d611d3c565b5101519242611eb7565b6004546142fa9060a01c63ffffffff16611ff2565b1080156145f9575b156145db57614311878b611d3c565b51516145c5575b845160800151614330906001600160401b0316610807565b61450d575b50614341868951611d3c565b5160a0850151518151036144d157936143a69695938c938f966143868e958c9261438061437a60608951016001600160401b0390511690565b896152bd565b86615464565b9a9080966143a060608851016001600160401b0390511690565b90615345565b61447f575b50506143b6826108b2565b60028203614437575b60019661442d7f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b0393519261441e6144158b61440d60608801516001600160401b031690565b96519b611d3c565b51985a90611eb7565b916040519586951698856140bb565b0390a45b0161426e565b91509193949250614447826108b2565b6003820361445b578b929493918a916143bf565b51606001516349362d1f60e11b600052611c8391906001600160401b031689614095565b614488846108b2565b600384036143ab5790929495506144a09193506108b2565b6144b0578b92918a9138806143ab565b5151604051632b11b8d960e01b815290819061206c9087906004840161407e565b611c838b6144eb60608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b614516836108b2565b614521575b38614335565b8351608001516001600160401b0316602080860151918c61455660405194859384936370701e5760e11b855260048501614057565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156124c0576000916145a7575b5061451b575050505050600190614431565b6145bf915060203d8111612fa157612f9381836101e3565b38614595565b6145cf878b611d3c565b51516080860152614318565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b50614603836108b2565b60038314614302565b915083614618846108b2565b1561431857506001959450614681925061465f91507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a1614431565b50505050600192915061468161465f60607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b506146d6836108b2565b600383146142be565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b614708818a51611d3c565b518051604001516001600160401b031683810361477857508051602001516001600160401b031689810361475557509061474484600193615183565b61474e828d611d3c565b5201614244565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611c836147ba86516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b5092915050612f5d576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b614831915060203d602011612fa157612f9381836101e3565b38614174565b9081602091031261026b575161031c8161025a565b9061031c916020815260e06148ea6148d5614875855161010060208701526101208601906105f8565b60208601516001600160401b0316604086015260408601516001600160a01b03166060860152606086015160808601526148bf608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c08701526105f8565b60c0850151848203601f1901848601526105f8565b92015190610100601f19828503019101526105f8565b6040906001600160a01b0361031c949316815281602082015201906105f8565b9081602091031261026b575190565b9193929361493b61211c565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9384156124c057600094614bb8575b506001600160a01b0384169586158015614ba6575b614b8857614a6d614a9692613bf8926149f16149ea611ff260408c015163ffffffff1690565b8c896155a5565b9690996080810151614a1f6060835193015193614a0c610224565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b60208201529283916024830161484c565b82857f000000000000000000000000000000000000000000000000000000000000000092615633565b94909115614b6c5750805160208103614b53575090614abf826020808a95518301019101614920565b956001600160a01b03841603614af7575b5050505050614aef614ae0610234565b6001600160a01b039093168352565b602082015290565b614b0a93614b0491611eb7565b916155a5565b50908082108015614b40575b614b2257808481614ad0565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614b4c8284611eb7565b1415614b16565b631e3be00960e21b600052602060045260245260446000fd5b61206c604051928392634ff17cad60e11b845260048401614900565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614bb36124e586613931565b6149c4565b614bdb91945060203d602011614be2575b614bd381836101e3565b810190614837565b92386149af565b503d614bc9565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614c176044836101e3565b6179185a10614c53576020926000925191617530fa6000513d82614c47575b5081614c40575090565b9050151590565b60201115915038614c36565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614c176044836101e3565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614c176044836101e3565b919390926000948051946000965b868810614ce1575050505050505050565b6020881015611d375760206000614cf9878b1a613a0f565b614d038b87611d3c565b5190614d3a614d128d8a611d3c565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156124c057614d80613aec600051614d688960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b9060016020830151614d91816139a8565b614d9a816139a8565b03614de757614db7614dad835160ff1690565b60ff600191161b90565b8116614dd657614dcd614dad6001935160ff1690565b17970196614cd0565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b8351811015614e515760019060ff831660005260036020526000614e4a604082206001600160a01b03614e31858a611d3c565b51166001600160a01b0316600052602052604060002090565b5501614dfe565b50509050565b8151815460ff191660ff91909116178155906020015160038110156108bc57815461ff00191660089190911b61ff0016179055565b919060005b8151811015614e5157614ea7611bc58284611d3c565b90614ed0614ec683614d688860ff166000526003602052604060002090565b5460081c60ff1690565b614ed9816139a8565b614f44576001600160a01b03821615614f3357614f2d600192614f28614efd610234565b60ff8516815291614f1186602085016139b2565b614d688960ff166000526003602052604060002090565b614e57565b01614e91565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015614e5157614f74611bc58284611d3c565b90614f93614ec683614d688860ff166000526003602052604060002090565b614f9c816139a8565b614f44576001600160a01b03821615614f3357614fd5600192614f28614fc0610234565b60ff8516815291614f116002602085016139b2565b01614f5e565b60ff1680600052600260205260ff60016040600020015460101c16908015600014615029575015615018576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146150335750565b61503957565b6307b8c74d60e51b60005260046000fd5b806000526007602052604060002054156000146150c8576006546801000000000000000081101561018d57600181016006556000600654821015611d3757600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b9080602083519182815201916020808360051b8301019401926000915b8383106150fa57505050505090565b9091929394602080600192601f1985820301865288519060808061515d61512a855160a0865260a08601906105f8565b6001600160a01b0387870151168786015263ffffffff6040870151166040860152606086015185820360608701526105f8565b930151910152970193019301919392906150eb565b90602061031c9281815201906150ce565b6134c981518051906152176151a260608601516001600160a01b031690565b613bf86151b960608501516001600160401b031690565b936151d26080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613bf86020840151602081519101209360a060408201516020815191012091015160405161525081613bf8602082019485615172565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b039261529e926156f0565b9116600052600a60205260406000209060005260205260406000205490565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611eb257615342916001600160401b036153008584613646565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b55565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611eb25761537d8484613646565b60048310156108bc576001600160401b036153429416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b9080602083519182815201916020808360051b8301019401926000915b8383106153fd57505050505090565b909192939460208061541b600193601f1986820301875289516105f8565b970193019301919392906153ee565b906020808351928381520192019060005b8181106154485750505090565b825163ffffffff1684526020938401939092019160010161543b565b91606092303b1561026b5761556660a0926155546000956155426040519889978897630304c3e160e51b89528260048a01526001600160401b0360808251805160648d01528260208201511660848d01528260408201511660a48d015282868201511660c48d015201511660e48a015261552361550e6154f78b61014061010460208701519201526101a48d01906105f8565b60408401518c8203606319016101248e01526105f8565b938201516001600160a01b03166101448b0152565b60808101516101648a01520151878203606319016101848901526150ce565b858103600319016024870152906153d1565b8381036003190160448501529061542a565b038183305af19081615590575b5061558557615580612227565b600391565b60029061031c6105c0565b80612581600061559f936101e3565b38615573565b6040516370a0823160e01b60208201526001600160a01b039091166024820152919291615602906155d98160448101613bf8565b84837f000000000000000000000000000000000000000000000000000000000000000092615633565b92909115614b6c5750805160208103614b5357509061562d8260208061031c95518301019101614920565b93611eb7565b93919361564060846102af565b9461564e60405196876101e3565b6084865261565c60846102af565b602087019590601f1901368737833b156156df575a908082106156ce578291038060061c900311156156bd576000918291825a9560208451940192f1905a9003923d90608482116156b4575b6000908287523e929190565b608491506156a8565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b805192825190841561584c5761010185111580615840575b1561576f5781850194600019860195610100871161576f5786156158305761572f87611ce2565b9660009586978795885b84811061579457505050505060011901809514938461578a575b505082615780575b50501561576f5761576b91611d3c565b5190565b6309bde33960e01b60005260046000fd5b149050388061575b565b1492503880615753565b6001811b8281160361582257868a101561580d576157b660018b019a85611d3c565b51905b8c888c10156157f957506157d160018c019b86611d3c565b515b818d1161576f576157f2828f926157ec9060019661585d565b92611d3c565b5201615739565b60018d019c61580791611d3c565b516157d3565b61581b60018c019b8d611d3c565b51906157b9565b61581b600189019884611d3c565b50505050905061576b9150611d2a565b50610101821115615708565b630469ac9960e21b60005260046000fd5b8181101561586f579061031c91615874565b61031c915b906040519060208201926001845260408301526060820152606081526134c96080826101e356fea164736f6c634300081a000a49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b",
}
var OffRampABI = OffRampMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/onramp/onramp.go
index f6f61ebc976..9e00fb7a88b 100644
--- a/core/gethwrappers/ccip/generated/onramp/onramp.go
+++ b/core/gethwrappers/ccip/generated/onramp/onramp.go
@@ -100,8 +100,8 @@ type OnRampStaticConfig struct {
}
var OnRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNRemote\",\"name\":\"rmnRemote\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowlistAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowlistEnabled\",\"type\":\"bool\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidAllowListRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allowlistAdmin\",\"type\":\"address\"}],\"name\":\"AllowListAdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"senders\",\"type\":\"address[]\"}],\"name\":\"AllowListSendersAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"senders\",\"type\":\"address[]\"}],\"name\":\"AllowListSendersRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPMessageSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNRemote\",\"name\":\"rmnRemote\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowlistAdmin\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowlistEnabled\",\"type\":\"bool\"}],\"name\":\"DestChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeTokenWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowlistEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\"}],\"internalType\":\"structOnRamp.AllowlistConfigArgs[]\",\"name\":\"allowlistConfigArgsItems\",\"type\":\"tuple[]\"}],\"name\":\"applyAllowlistUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowlistEnabled\",\"type\":\"bool\"}],\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllowedSendersList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"configuredAddresses\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowlistEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowlistAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPoolV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNRemote\",\"name\":\"rmnRemote\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"messageInterceptor\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowlistAdmin\",\"type\":\"address\"}],\"internalType\":\"structOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"}],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b506040516200409f3803806200409f833981016040819052620000359162000709565b336000816200005757604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200008a576200008a816200014f565b505082516001600160401b03161580620000af575060208301516001600160a01b0316155b80620000c6575060408301516001600160a01b0316155b80620000dd575060608301516001600160a01b0316155b15620000fc576040516306b7c75960e31b815260040160405180910390fd5b82516001600160401b031660805260208301516001600160a01b0390811660a0526040840151811660c05260608401511660e0526200013b82620001c9565b620001468162000378565b5050506200080a565b336001600160a01b038216036200017957604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b03161580620001ec575060608101516001600160a01b0316155b80620001f9575080602001515b1562000218576040516306b7c75960e31b815260040160405180910390fd5b8051600280546020808501511515600160a01b026001600160a81b03199092166001600160a01b039485161791909117909155604080840151600380549185166001600160a01b0319928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251808301845291516001600160401b0316825260a05185169382019390935260c05184168183015260e05190931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f1916200036d91849082516001600160401b031681526020808401516001600160a01b03908116828401526040858101518216818501526060958601518216868501528451821660808086019190915292850151151560a0850152840151811660c084015293830151841660e0830152909101519091166101008201526101200190565b60405180910390a150565b60005b8151811015620004cb5760008282815181106200039c576200039c620007f4565b602002602001015190506000838381518110620003bd57620003bd620007f4565b6020026020010151600001519050806001600160401b0316600003620004055760405163c35aa79d60e01b81526001600160401b038216600482015260240160405180910390fd5b6001600160401b0381811660008181526006602090815260409182902086820151815488850151600160401b600160e81b031990911669010000000000000000006001600160a01b0390931692830260ff60401b19161768010000000000000000911515820217808455855197811688529387019190915260ff920491909116151591840191909152917fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a25050508060010190506200037b565b5050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200050a576200050a620004cf565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200053b576200053b620004cf565b604052919050565b80516001600160401b03811681146200055b57600080fd5b919050565b6001600160a01b03811681146200057657600080fd5b50565b805180151581146200055b57600080fd5b600060a082840312156200059d57600080fd5b60405160a081016001600160401b0381118282101715620005c257620005c2620004cf565b80604052508091508251620005d78162000560565b8152620005e76020840162000579565b60208201526040830151620005fc8162000560565b60408201526060830151620006118162000560565b60608201526080830151620006268162000560565b6080919091015292915050565b600082601f8301126200064557600080fd5b815160206001600160401b03821115620006635762000663620004cf565b62000673818360051b0162000510565b828152606092830285018201928282019190878511156200069357600080fd5b8387015b85811015620006fc5781818a031215620006b15760008081fd5b620006bb620004e5565b620006c68262000543565b815285820151620006d78162000560565b818701526040620006ea83820162000579565b90820152845292840192810162000697565b5090979650505050505050565b60008060008385036101408112156200072157600080fd5b60808112156200073057600080fd5b50604051608081016001600160401b038082118383101715620007575762000757620004cf565b81604052620007668762000543565b8352602087015191506200077a8262000560565b81602084015260408701519150620007928262000560565b81604084015260608701519150620007aa8262000560565b816060840152829550620007c288608089016200058a565b9450610120870151925080831115620007da57600080fd5b5050620007ea8682870162000633565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e05161381c62000883600039600081816101fc015281816107670152611ac40152600081816101c0015281816114b90152611a9d015260008181610184015281816105a50152611a7301526000818161015401528181611040015281816115d60152611a4f015261381c6000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80637437ff9f116100b2578063972b461211610081578063df0aa9e911610066578063df0aa9e9146104fb578063f2fde38b1461050e578063fbca3b741461052157600080fd5b8063972b4612146104c7578063c9b146b3146104e857600080fd5b80637437ff9f146103cb57806379ba5097146104755780638da5cb5b1461047d5780639041be3d1461049b57600080fd5b806327e936f1116100ee57806327e936f1146102ce57806348a98aa4146102e15780635cb80c5d146103195780636def4ce71461032c57600080fd5b806306285c6914610120578063181f5a771461024f57806320487ded146102985780632716072b146102b9575b600080fd5b61023960408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102469190612589565b60405180910390f35b61028b6040518060400160405280601081526020017f4f6e52616d7020312e362e302d6465760000000000000000000000000000000081525081565b604051610246919061264e565b6102ab6102a636600461268f565b610541565b604051908152602001610246565b6102cc6102c73660046127fd565b6106fa565b005b6102cc6102dc3660046128eb565b61070e565b6102f46102ef366004612983565b61071f565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610246565b6102cc610327366004612a08565b6107d4565b61038f61033a366004612a4a565b67ffffffffffffffff9081166000908152600660205260409020549081169168010000000000000000820460ff16916901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6040805167ffffffffffffffff9094168452911515602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610246565b6104686040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260025473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000090910460ff161515602083015260035481169282019290925260045482166060820152600554909116608082015290565b6040516102469190612a67565b6102cc610956565b60015473ffffffffffffffffffffffffffffffffffffffff166102f4565b6104ae6104a9366004612a4a565b610a24565b60405167ffffffffffffffff9091168152602001610246565b6104da6104d5366004612a4a565b610a4d565b604051610246929190612b12565b6102cc6104f6366004612a08565b610a91565b6102ab610509366004612b2d565b610dad565b6102cc61051c366004612b99565b6116bb565b61053461052f366004612a4a565b6116cc565b6040516102469190612bb6565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa1580156105ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106109190612bc9565b15610658576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6002546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd906106b09086908690600401612ce8565b602060405180830381865afa1580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190612e31565b90505b92915050565b610702611700565b61070b81611753565b50565b610716611700565b61070b816118f6565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190612e4a565b60045473ffffffffffffffffffffffffffffffffffffffff1660005b8281101561095057600084848381811061080c5761080c612e67565b90506020020160208101906108219190612b99565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b59190612e31565b90508015610946576108de73ffffffffffffffffffffffffffffffffffffffff83168583611b26565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e8360405161093d91815260200190565b60405180910390a35b50506001016107f0565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109a7576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff80821660009081526006602052604081205490916106f491166001612ec5565b67ffffffffffffffff8116600090815260066020526040812080546060916801000000000000000090910460ff1690610a8890600101611bb3565b91509150915091565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b015760055473ffffffffffffffffffffffffffffffffffffffff163314610b01576040517f905d7d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610da8576000838383818110610b2057610b20612e67565b9050602002810190610b329190612ee6565b610b3b90612f97565b805167ffffffffffffffff1660009081526006602090815260409182902090830151815490151568010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff90911617815590820151519192509015610cfb57816020015115610cba5760005b826040015151811015610c6a57600083604001518281518110610bd457610bd4612e67565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c535783516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161064f565b610c606001840182611bc7565b5050600101610baf565b50816000015167ffffffffffffffff167f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc32818360400151604051610cad9190612bb6565b60405180910390a2610cfb565b81516040517f463258ff00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161064f565b60005b826060015151811015610d4757610d3e83606001518281518110610d2457610d24612e67565b602002602001015183600101611be990919063ffffffff16565b50600101610cfe565b5060608201515115610d9e57816000015167ffffffffffffffff167fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d4215868360600151604051610d959190612bb6565b60405180910390a25b5050600101610b04565b505050565b60025460009074010000000000000000000000000000000000000000900460ff1615610e05576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905567ffffffffffffffff8516600090815260066020526040902073ffffffffffffffffffffffffffffffffffffffff8316610eaa576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805468010000000000000000900460ff1615610f1b57610ecd6001820184611c0b565b610f1b576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161064f565b80546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610f78576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff16801561101e576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e50690610feb908a908a90600401612ce8565b600060405180830381600087803b15801561100557600080fd5b505af1158015611019573d6000803e3d6000fd5b505050505b50604080516101c081019091526000610120820181815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811661014085015289811661016085015284549293928392916101808401918791879161108c9116613048565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001600067ffffffffffffffff1681525081526020018573ffffffffffffffffffffffffffffffffffffffff168152602001878060200190611100919061306f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611144888061306f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810183529381529284019290925250016111a06080890160608a01612b99565b73ffffffffffffffffffffffffffffffffffffffff168152602001868152602001600081526020018780604001906111d891906130d4565b905067ffffffffffffffff8111156111f2576111f26126df565b60405190808252806020026020018201604052801561126b57816020015b6112586040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8152602001906001900390816112105790505b5090529050600061127f60408801886130d4565b808060200260200160405190810160405280939291908181526020016000905b828210156112cb576112bc6040830286013681900381019061313c565b8152602001906001019061129f565b5050505050905060005b6112e260408901896130d4565b905081101561137c5761135282828151811061130057611300612e67565b60209081029190910101518a6113168b8061306f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611c3a915050565b836101000151828151811061136957611369612e67565b60209081029190910101526001016112d5565b50600254600090606090819073ffffffffffffffffffffffffffffffffffffffff1663430d138c8c6113b360808e018e8601612b99565b8c8e80608001906113c4919061306f565b8b61010001518b6040518863ffffffff1660e01b81526004016113ed9796959493929190613259565b600060405180830381865afa15801561140a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611450919081019061338b565b60e0890193909352909450925090508261152b576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c16600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af1158015611502573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611526919061347e565b61152e565b60005b855167ffffffffffffffff909116608091820152850182905260005b856101000151518110156115a05781818151811061156a5761156a612e67565b6020026020010151866101000151828151811061158957611589612e67565b60209081029190910101516080015260010161154a565b50604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c16606082015230608082015261163090869060a00160405160208183030381529060405280519060200120611f51565b85515284516060015160405167ffffffffffffffff918216918d16907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f329061167990899061349b565b60405180910390a35050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055505051519150505b949350505050565b6116c3611700565b61070b816120a3565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff163314611751576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005b81518110156118f257600082828151811061177357611773612e67565b60200260200101519050600083838151811061179157611791612e67565b60200260200101516000015190508067ffffffffffffffff166000036117ef576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161064f565b67ffffffffffffffff818116600081815260066020908152604091829020868201518154888501517fffffff000000000000000000000000000000000000000000ffffffffffffffff909116690100000000000000000073ffffffffffffffffffffffffffffffffffffffff9093169283027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff161768010000000000000000911515820217808455855197811688529387019190915260ff920491909116151591840191909152917fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef59060600160405180910390a2505050806001019050611756565b5050565b805173ffffffffffffffffffffffffffffffffffffffff1615806119325750606081015173ffffffffffffffffffffffffffffffffffffffff16155b8061193e575080602001515b15611975576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160028054602080850151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090921673ffffffffffffffffffffffffffffffffffffffff9485161791909117909155604080840151600380549185167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055606080860151600480549187169184169190911790556080808701516005805491881691909416179092558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008516938201939093527f00000000000000000000000000000000000000000000000000000000000000008416818301527f000000000000000000000000000000000000000000000000000000000000000090931691830191909152517fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f191611b1b9184906135f3565b60405180910390a150565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610da8908490612167565b60606000611bc083612273565b9392505050565b60006106f18373ffffffffffffffffffffffffffffffffffffffff84166122cf565b60006106f18373ffffffffffffffffffffffffffffffffffffffff841661231e565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156106f1565b611c826040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016060815260200160008152602001606081525090565b8460200151600003611cc0576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cd085876000015161071f565b905073ffffffffffffffffffffffffffffffffffffffff81161580611da057506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015611d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9e9190612bc9565b155b15611df25785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161064f565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611e9191906136a1565b6000604051808303816000875af1158015611eb0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ef69190810190613717565b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff90941684528151602080860191909152918201518482015288820151606085015280519182019052600081526080830152509050949350505050565b60008060001b8284602001518560000151606001518660000151608001518760a001518860c00151604051602001611fcf95949392919073ffffffffffffffffffffffffffffffffffffffff958616815267ffffffffffffffff94851660208201529290931660408301529092166060830152608082015260a00190565b6040516020818303038152906040528051906020012085606001518051906020012086604001518051906020012087610100015160405160200161201391906137a8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808d0151805190840120928501999099529183019690965260608201949094529485019190915260a084015260c083015260e08201526101000160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff8216036120f2576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006121c9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124189092919063ffffffff16565b805190915015610da857808060200190518101906121e79190612bc9565b610da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161064f565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122c357602002820191906000526020600020905b8154815260200190600101908083116122af575b50505050509050919050565b6000818152600183016020526040812054612316575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f4565b5060006106f4565b600081815260018301602052604081205480156124075760006123426001836137bb565b8554909150600090612356906001906137bb565b90508082146123bb57600086600001828154811061237657612376612e67565b906000526020600020015490508087600001848154811061239957612399612e67565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123cc576123cc6137ce565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f4565b60009150506106f4565b5092915050565b60606116b38484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161244c91906137fd565b60006040518083038185875af1925050503d8060008114612489576040519150601f19603f3d011682016040523d82523d6000602084013e61248e565b606091505b509150915061249f878383876124aa565b979650505050505050565b606083156125405782516000036125395773ffffffffffffffffffffffffffffffffffffffff85163b612539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161064f565b50816116b3565b6116b383838151156125555781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064f919061264e565b608081016106f4828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b838110156125fb5781810151838201526020016125e3565b50506000910152565b6000815180845261261c8160208601602086016125e0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106f16020830184612604565b67ffffffffffffffff8116811461070b57600080fd5b600060a0828403121561268957600080fd5b50919050565b600080604083850312156126a257600080fd5b82356126ad81612661565b9150602083013567ffffffffffffffff8111156126c957600080fd5b6126d585828601612677565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715612731576127316126df565b60405290565b6040805190810167ffffffffffffffff81118282101715612731576127316126df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127a1576127a16126df565b604052919050565b600067ffffffffffffffff8211156127c3576127c36126df565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461070b57600080fd5b801515811461070b57600080fd5b6000602080838503121561281057600080fd5b823567ffffffffffffffff81111561282757600080fd5b8301601f8101851361283857600080fd5b803561284b612846826127a9565b61275a565b8181526060918202830184019184820191908884111561286a57600080fd5b938501935b838510156128cf5780858a0312156128875760008081fd5b61288f61270e565b853561289a81612661565b8152858701356128a9816127cd565b818801526040868101356128bc816127ef565b908201528352938401939185019161286f565b50979650505050505050565b80356128e6816127cd565b919050565b600060a082840312156128fd57600080fd5b60405160a0810181811067ffffffffffffffff82111715612920576129206126df565b604052823561292e816127cd565b8152602083013561293e816127ef565b60208201526040830135612951816127cd565b60408201526060830135612964816127cd565b60608201526080830135612977816127cd565b60808201529392505050565b6000806040838503121561299657600080fd5b82356129a181612661565b915060208301356129b1816127cd565b809150509250929050565b60008083601f8401126129ce57600080fd5b50813567ffffffffffffffff8111156129e657600080fd5b6020830191508360208260051b8501011115612a0157600080fd5b9250929050565b60008060208385031215612a1b57600080fd5b823567ffffffffffffffff811115612a3257600080fd5b612a3e858286016129bc565b90969095509350505050565b600060208284031215612a5c57600080fd5b8135611bc081612661565b60a081016106f4828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152806060830151166060840152806080830151166080840152505050565b60008151808452602080850194506020840160005b83811015612b0757815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612ad5565b509495945050505050565b82151581526040602082015260006116b36040830184612ac0565b60008060008060808587031215612b4357600080fd5b8435612b4e81612661565b9350602085013567ffffffffffffffff811115612b6a57600080fd5b612b7687828801612677565b935050604085013591506060850135612b8e816127cd565b939692955090935050565b600060208284031215612bab57600080fd5b8135611bc0816127cd565b6020815260006106f16020830184612ac0565b600060208284031215612bdb57600080fd5b8151611bc0816127ef565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612c1b57600080fd5b830160208101925035905067ffffffffffffffff811115612c3b57600080fd5b803603821315612a0157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b85811015612b07578135612cb6816127cd565b73ffffffffffffffffffffffffffffffffffffffff168752818301358388015260409687019690910190600101612ca3565b600067ffffffffffffffff808516835260406020840152612d098485612be6565b60a06040860152612d1e60e086018284612c4a565b915050612d2e6020860186612be6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080878503016060880152612d64848385612c4a565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612d9d57600080fd5b60209288019283019235915084821115612db657600080fd5b8160061b3603831315612dc857600080fd5b80878503016080880152612ddd848385612c93565b9450612deb606089016128db565b73ffffffffffffffffffffffffffffffffffffffff811660a08901529350612e166080890189612be6565b94509250808786030160c0880152505061249f838383612c4a565b600060208284031215612e4357600080fd5b5051919050565b600060208284031215612e5c57600080fd5b8151611bc0816127cd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561241157612411612e96565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112612f1a57600080fd5b9190910192915050565b600082601f830112612f3557600080fd5b81356020612f45612846836127a9565b8083825260208201915060208460051b870101935086841115612f6757600080fd5b602086015b84811015612f8c578035612f7f816127cd565b8352918301918301612f6c565b509695505050505050565b600060808236031215612fa957600080fd5b6040516080810167ffffffffffffffff8282108183111715612fcd57612fcd6126df565b8160405284359150612fde82612661565b908252602084013590612ff0826127ef565b816020840152604085013591508082111561300a57600080fd5b61301636838701612f24565b6040840152606085013591508082111561302f57600080fd5b5061303c36828601612f24565b60608301525092915050565b600067ffffffffffffffff80831681810361306557613065612e96565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126130a457600080fd5b83018035915067ffffffffffffffff8211156130bf57600080fd5b602001915036819003821315612a0157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261310957600080fd5b83018035915067ffffffffffffffff82111561312457600080fd5b6020019150600681901b3603821315612a0157600080fd5b60006040828403121561314e57600080fd5b613156612737565b8235613161816127cd565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b8481101561324c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a073ffffffffffffffffffffffffffffffffffffffff82511685528582015181878701526131f582870182612604565b9150506040808301518683038288015261320f8382612604565b925050506060808301518187015250608080830151925085820381870152506132388183612604565b9a86019a9450505090830190600101613193565b5090979650505050505050565b67ffffffffffffffff881681526000602073ffffffffffffffffffffffffffffffffffffffff808a1682850152604089604086015260c060608601526132a360c08601898b612c4a565b85810360808701526132b58189613176565b86810360a0880152875180825285890192509085019060005b818110156132f55783518051871684528701518784015292860192918401916001016132ce565b50909e9d5050505050505050505050505050565b600082601f83011261331a57600080fd5b815167ffffffffffffffff811115613334576133346126df565b61336560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161275a565b81815284602083860101111561337a57600080fd5b6116b38260208301602087016125e0565b600080600080608085870312156133a157600080fd5b845193506020808601516133b4816127ef565b604087015190945067ffffffffffffffff808211156133d257600080fd5b6133de89838a01613309565b945060608801519150808211156133f457600080fd5b818801915088601f83011261340857600080fd5b8151613416612846826127a9565b81815260059190911b8301840190848101908b83111561343557600080fd5b8585015b8381101561346d578051858111156134515760008081fd5b61345f8e89838a0101613309565b845250918601918601613439565b50989b979a50959850505050505050565b60006020828403121561349057600080fd5b8151611bc081612661565b602081526134ec60208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161351560c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101a08060e08501526135326101c0850183612604565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101008187860301818801526135708584612604565b945060808801519250818786030161012088015261358e8584612604565b945060a088015192506135ba61014088018473ffffffffffffffffffffffffffffffffffffffff169052565b60c088015161016088015260e08801516101808801528701518685039091018387015290506135e98382613176565b9695505050505050565b610120810161364b828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff9081166080848101919091526020850151151560a08501526040850151821660c08501526060850151821660e085015284015116610100830152611bc0565b602081526000825160a060208401526136bd60c0840182612604565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b60006020828403121561372957600080fd5b815167ffffffffffffffff8082111561374157600080fd5b908301906040828603121561375557600080fd5b61375d612737565b82518281111561376c57600080fd5b61377887828601613309565b82525060208301518281111561378d57600080fd5b61379987828601613309565b60208301525095945050505050565b6020815260006106f16020830184613176565b818103818111156106f4576106f4612e96565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612f1a8184602087016125e056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowlistUpdates\",\"inputs\":[{\"name\":\"allowlistConfigArgsItems\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.AllowlistConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forwardFromRouter\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowedSendersList\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"configuredAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExpectedNextSequenceNumber\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPoolBySourceToken\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPoolV1\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedTokens\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawFeeTokens\",\"inputs\":[{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdminSet\",\"inputs\":[{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListSendersAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"senders\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListSendersRemoved\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"senders\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigSet\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenWithdrawn\",\"inputs\":[{\"name\":\"feeAggregator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotSendZeroTokens\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAllowListRequest\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MustBeCalledByRouter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RouterMustSetOriginalSender\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]",
+ Bin: "0x6101006040523461055f57613c018038038061001a81610599565b92833981019080820390610140821261055f576080821261055f5761003d61057a565b90610047816105be565b82526020810151906001600160a01b038216820361055f5760208301918252610072604082016105d2565b926040810193845260a0610088606084016105d2565b6060830190815295607f19011261055f5760405160a081016001600160401b03811182821017610564576040526100c1608084016105d2565b81526100cf60a084016105e6565b602082019081526100e260c085016105d2565b91604081019283526100f660e086016105d2565b936060820194855261010b61010087016105d2565b6080830190815261012087015190966001600160401b03821161055f57018a601f8201121561055f578051906001600160401b0382116105645760209b8c6060610159828660051b01610599565b9e8f8681520194028301019181831161055f57602001925b8284106104f1575050505033156104e057600180546001600160a01b0319163317905580516001600160401b03161580156104ce575b80156104bc575b80156104aa575b61047d57516001600160401b0316608081905295516001600160a01b0390811660a08190529751811660c08190529851811660e08190528251909116158015610498575b801561048e575b61047d57815160028054855160ff60a01b90151560a01b166001600160a01b039384166001600160a81b0319909216919091171790558451600380549183166001600160a01b03199283161790558651600480549184169183169190911790558751600580549190931691161790557fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19861012098606061029f61057a565b8a8152602080820193845260408083019586529290910194855281519a8b5291516001600160a01b03908116928b019290925291518116918901919091529051811660608801529051811660808701529051151560a08601529051811660c08501529051811660e0840152905116610100820152a16000905b805182101561040b5761032b82826105f3565b51916001600160401b0361033f82846105f3565b5151169283156103f65760008481526006602090815260409182902081840151815494840151600160401b600160e81b03198616604883901b600160481b600160e81b031617901515851b68ff000000000000000016179182905583516001600160401b0390951685526001600160a01b031691840191909152811c60ff1615159082015291926001927fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef590606090a20190610318565b8363c35aa79d60e01b60005260045260246000fd5b6040516135e3908161061e82396080518181816103e301528181610b39015281816120c8015261286b015260a0518181816121010152818161261e01526128a4015260c051818181610efc0152818161213d01526128e0015260e0518181816121790152818161291c0152612edd0152f35b6306b7c75960e31b60005260046000fd5b5082511515610200565b5084516001600160a01b0316156101f9565b5088516001600160a01b0316156101b5565b5087516001600160a01b0316156101ae565b5086516001600160a01b0316156101a7565b639b15e16f60e01b60005260046000fd5b60608483031261055f5760405190606082016001600160401b0381118382101761056457604052610521856105be565b82526020850151906001600160a01b038216820361055f578260209283606095015261054f604088016105e6565b6040820152815201930192610171565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190608082016001600160401b0381118382101761056457604052565b6040519190601f01601f191682016001600160401b0381118382101761056457604052565b51906001600160401b038216820361055f57565b51906001600160a01b038216820361055f57565b5190811515820361055f57565b80518210156106075760209160051b010190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816306285c691461280557508063181f5a771461278657806320487ded146125425780632716072b1461229257806327e936f114611e8c57806348a98aa414611e095780635cb80c5d14611b215780636def4ce714611a925780637437ff9f1461195957806379ba5097146118745780638da5cb5b146118225780639041be3d14611775578063972b4612146116a7578063c9b146b3146112da578063df0aa9e91461022c578063f2fde38b1461013f5763fbca3b74146100dc57600080fd5b3461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57600490610116612af4565b507f9e7177c8000000000000000000000000000000000000000000000000000000008152fd5b80fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5773ffffffffffffffffffffffffffffffffffffffff61018c612b4a565b610194613280565b1633811461020457807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b503461013c5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57610264612af4565b67ffffffffffffffff602435116112d65760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc602435360301126112d6576102ab612b6d565b60025460ff8160a01c166112ae577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001760025567ffffffffffffffff8216835260066020526040832073ffffffffffffffffffffffffffffffffffffffff82161561128657805460ff8160401c16611218575b60481c73ffffffffffffffffffffffffffffffffffffffff1633036111f05773ffffffffffffffffffffffffffffffffffffffff6003541680611183575b50805467ffffffffffffffff811667ffffffffffffffff8114611156579067ffffffffffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009493011692839116179055604051906103d5826129db565b84825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602083015267ffffffffffffffff8416604083015260608201528360808201526104366024803501602435600401613060565b61044560046024350180613060565b610453606460243501612f97565b936104686044602435016024356004016130b1565b9490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06104ae61049887612b25565b966104a66040519889612a13565b808852612b25565b018a5b81811061113f575050604051968761012081011067ffffffffffffffff6101208a011117611112576101208801604052875273ffffffffffffffffffffffffffffffffffffffff8816602088015261051c939291610510913691613131565b60408701523691613131565b606084015273ffffffffffffffffffffffffffffffffffffffff6020926040516105468582612a13565b88815260808601521660a084015260443560c08401528560e084015261010083015261057c6044602435016024356004016130b1565b61058881969296612b25565b906105966040519283612a13565b8082528382018097368360061b8201116110895780915b8360061b820183106110d75750505050865b6105d36044602435016024356004016130b1565b9050811015610959576105e6818361301d565b516106006105f960046024350180613060565b3691613131565b90610609613105565b5085810151156109315773ffffffffffffffffffffffffffffffffffffffff61063481835116612e7e565b169182158015610887575b61084457908a6106ee949392888873ffffffffffffffffffffffffffffffffffffffff8d838701518280895116926040519761067a896129db565b885267ffffffffffffffff87890196168652816040890191168152606088019283526080880193845267ffffffffffffffff6040519d8e998a997f9a4575b9000000000000000000000000000000000000000000000000000000008b5260048b01525160a060248b015260c48a0190612ab1565b965116604488015251166064860152516084850152511660a4830152038183865af1938415610839578b94610783575b5061077c918484928980600198519301519101519160405193610740856129db565b84528a8401526040830152606082015260405161075d8982612a13565b8c8152608082015261010089015190610776838361301d565b5261301d565b50016105bf565b93503d91828c863e6107958386612a13565b878584810103126108355784519167ffffffffffffffff83116108315760408387018588010312610831576040516107cc816129f7565b8387015167ffffffffffffffff811161082d576107f09086890190868a0101613168565b81528984880101519467ffffffffffffffff861161082d578761077c96889661081f9360019b01920101613168565b8a820152955091509161071e565b8e80fd5b8c80fd5b8b80fd5b6040513d8d823e3d90fd5b60248b73ffffffffffffffffffffffffffffffffffffffff8451167fbf16aab6000000000000000000000000000000000000000000000000000000008252600452fd5b506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201528781602481875afa908115610926578c916108f1575b501561063f565b90508781813d831161091f575b6109088183612a13565b810103126108355761091990612c2c565b386108ea565b503d6108fe565b6040513d8e823e3d90fd5b60048a7f5cf04449000000000000000000000000000000000000000000000000000000008152fd5b50867f430d138c00000000000000000000000000000000000000000000000000000000839282979873ffffffffffffffffffffffffffffffffffffffff600254169187610a496109ad606460243501612f97565b610a198c61010073ffffffffffffffffffffffffffffffffffffffff6109dd608460243501602435600401613060565b92909301519467ffffffffffffffff6040519e8f9d8e521660048d01521660248b015260443560448b015260c060648b015260c48a0191612c89565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8883030160848901526131aa565b917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8684030160a48701525191828152019190855b8982821061109c575050505082809103915afa9586156110915785869087938899610f7f575b5060e087015215610e8d5750845b67ffffffffffffffff6080865101911690526080840152835b61010084015151811015610b015780610ae66001928861301d565b516080610af88361010089015161301d565b51015201610acb565b509092604051848101907f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015267ffffffffffffffff8416606082015230608082015260808152610b8360a082612a13565b51902073ffffffffffffffffffffffffffffffffffffffff602085015116845167ffffffffffffffff6080816060840151169201511673ffffffffffffffffffffffffffffffffffffffff60a08801511660c088015191604051938a850195865260408501526060840152608083015260a082015260a08152610c0760c082612a13565b51902060608501518681519101206040860151878151910120610100870151604051610c6d81610c418c8201948d865260408301906131aa565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612a13565b51902091608088015189815191012093604051958a870197885260408701526060860152608085015260a084015260c083015260e082015260e08152610cb561010082612a13565b51902082515267ffffffffffffffff60608351015116907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f3260405185815267ffffffffffffffff608086518051898501528289820151166040850152826040820151166060850152826060820151168285015201511660a082015273ffffffffffffffffffffffffffffffffffffffff60208601511660c082015280610e58610ddf610daa610d7560408a01516101a060e08701526101c0860190612ab1565b60608a01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086830301610100870152612ab1565b60808901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301610120860152612ab1565b73ffffffffffffffffffffffffffffffffffffffff60a08901511661014084015260c088015161016084015260e088015161018084015267ffffffffffffffff610100890151967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403016101a086015216956131aa565b0390a37fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002555151604051908152f35b73ffffffffffffffffffffffffffffffffffffffff604051917fea458c0c00000000000000000000000000000000000000000000000000000000835267ffffffffffffffff8516600484015216602482015283816044818973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115610f74578691610f32575b50610ab2565b90508381813d8311610f6d575b610f498183612a13565b81010312610f69575167ffffffffffffffff81168103610f695787610f2c565b8580fd5b503d610f3f565b6040513d88823e3d90fd5b9850505090503d908186883e610f958288612a13565b6080878381010312610f6957865196610faf858201612c2c565b97604082015167ffffffffffffffff811161108d57610fd390858401908401613168565b9160608101519467ffffffffffffffff861161108957808201601f87840101121561108957858201519161100683612b25565b966110146040519889612a13565b838852898801928083018b8660051b848601010111610831578a82840101935b8b8660051b84860101018510611054575050505050509790929789610aa4565b845167ffffffffffffffff811161082d578c809261107c829383878a0191898b010101613168565b8152019501949050611034565b8980fd5b8880fd5b6040513d87823e3d90fd5b8351805173ffffffffffffffffffffffffffffffffffffffff168652810151818601528c975088965060409094019390920191600101610a7e565b60408336031261110e578660409182516110f0816129f7565b6110f986612b90565b815282860135838201528152019201916105ad565b8a80fd5b60248b7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60209061114a613105565b82828a010152016104b1565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b803b156111ec578460405180927fe0a0e5060000000000000000000000000000000000000000000000000000000082528183816111c96024356004018b60048401612cc8565b03925af18015611091571561037357846111e591959295612a13565b9238610373565b8480fd5b6004847f1c0a3529000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526002830160205260409020546103355760248573ffffffffffffffffffffffffffffffffffffffff857fd0d2597600000000000000000000000000000000000000000000000000000000835216600452fd5b6004847fa4ec7479000000000000000000000000000000000000000000000000000000008152fd5b6004847f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5760043567ffffffffffffffff81116112d65761132a903690600401612bb1565b73ffffffffffffffffffffffffffffffffffffffff60015416330361165f575b919081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301915b8481101561165b578060051b820135838112156111ec578201916080833603126111ec57604051946113a686612990565b6113af84612b10565b86526113bd60208501612b3d565b9660208701978852604085013567ffffffffffffffff8111611657576113e69036908701612fb8565b9460408801958652606081013567ffffffffffffffff81116116535761140e91369101612fb8565b60608801908152875167ffffffffffffffff1683526006602052604080842099518a547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169015159182901b68ff000000000000000016178a5590959081515161152b575b5095976001019550815b855180518210156114bc57906114b573ffffffffffffffffffffffffffffffffffffffff6114ad8360019561301d565b511689613374565b500161147d565b505095909694506001929193519081516114dc575b505001939293611375565b61152167ffffffffffffffff7fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158692511692604051918291602083526020830190612be2565b0390a238806114d1565b9893959296919094979860001461161c57600184019591875b865180518210156115c15761156e8273ffffffffffffffffffffffffffffffffffffffff9261301d565b5116801561158a57906115836001928a6132e3565b5001611544565b60248a67ffffffffffffffff8e51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b50509692955090929796937f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc328161161267ffffffffffffffff8a51169251604051918291602083526020830190612be2565b0390a23880611473565b60248767ffffffffffffffff8b51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b8380fd5b8280fd5b8380f35b73ffffffffffffffffffffffffffffffffffffffff6005541633031561134a576004837f905d7d9b000000000000000000000000000000000000000000000000000000008152fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5767ffffffffffffffff6116e8612af4565b16808252600660205260ff604083205460401c16908252600660205260016040832001916040518093849160208254918281520191845260208420935b81811061175c57505061173a92500383612a13565b61175860405192839215158352604060208401526040830190612be2565b0390f35b8454835260019485019487945060209093019201611725565b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5767ffffffffffffffff6117b6612af4565b1681526006602052600167ffffffffffffffff604083205416019067ffffffffffffffff82116117f55760208267ffffffffffffffff60405191168152f35b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57805473ffffffffffffffffffffffffffffffffffffffff81163303611931577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c576080604051611996816129db565b828152826020820152826040820152826060820152015260a06040516119bb816129db565b60ff60025473ffffffffffffffffffffffffffffffffffffffff81168352831c161515602082015273ffffffffffffffffffffffffffffffffffffffff60035416604082015273ffffffffffffffffffffffffffffffffffffffff60045416606082015273ffffffffffffffffffffffffffffffffffffffff600554166080820152611a90604051809273ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565bf35b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57604060609167ffffffffffffffff611ad8612af4565b1681526006602052205473ffffffffffffffffffffffffffffffffffffffff6040519167ffffffffffffffff8116835260ff8160401c161515602084015260481c166040820152f35b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5760043567ffffffffffffffff81116112d657611b71903690600401612bb1565b9073ffffffffffffffffffffffffffffffffffffffff6004541690835b83811015611e055773ffffffffffffffffffffffffffffffffffffffff611bb98260051b8401612f97565b1690604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481845afa928315611dfa578793611dc3575b5082611c11575b506001915001611b8e565b8460405193611ccc60208601957fa9059cbb00000000000000000000000000000000000000000000000000000000875283602482015282604482015260448152611c5c606482612a13565b8a80604098895193611c6e8b86612a13565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082895af13d15611dbb573d90611caf82612a54565b91611cbc8a519384612a13565b82523d8d602084013e5b86613506565b805180611d08575b505060207f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e9160019651908152a338611c06565b81929495969350906020918101031261108d576020611d279101612c2c565b15611d385792919085903880611cd4565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b606090611cc6565b9092506020813d8211611df2575b81611dde60209383612a13565b81010312611dee57519138611bff565b8680fd5b3d9150611dd1565b6040513d89823e3d90fd5b8480f35b503461013c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57611e41612af4565b506024359073ffffffffffffffffffffffffffffffffffffffff8216820361013c576020611e6e83612e7e565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b503461013c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57604051611ec8816129db565b611ed0612b4a565b81526024358015158103611657576020820190815260443573ffffffffffffffffffffffffffffffffffffffff811681036116535760408301908152611f14612b6d565b90606084019182526084359273ffffffffffffffffffffffffffffffffffffffff84168403610f695760808501938452611f4c613280565b73ffffffffffffffffffffffffffffffffffffffff855116158015612273575b8015612269575b612241579273ffffffffffffffffffffffffffffffffffffffff859381809461012097827fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19a51167fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006002549260a01b1691161760025551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600354161760035551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600454161760045551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600554161760055561223d604051916120bd83612990565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016835273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602084015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604084015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660608401526121ed604051809473ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b608083019073ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565ba180f35b6004867f35be3ac8000000000000000000000000000000000000000000000000000000008152fd5b5080511515611f73565b5073ffffffffffffffffffffffffffffffffffffffff83511615611f6c565b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c576004359067ffffffffffffffff821161013c573660238301121561013c5781600401356122ee81612b25565b926122fc6040519485612a13565b818452602460606020860193028201019036821161165357602401915b81831061249a5750505061232b613280565b805b825181101561249657612340818461301d565b5167ffffffffffffffff612354838661301d565b51511690811561246a57907fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5606060019493838752600660205260ff6040882061242b604060208501519483547fffffff0000000000000000000000000000000000000000ffffffffffffffffff7cffffffffffffffffffffffffffffffffffffffff0000000000000000008860481b1691161784550151151582907fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff68ff0000000000000000835492151560401b169116179055565b5473ffffffffffffffffffffffffffffffffffffffff6040519367ffffffffffffffff8316855216602084015260401c1615156040820152a20161232d565b602484837fc35aa79d000000000000000000000000000000000000000000000000000000008252600452fd5b5080f35b606083360312611653576040516060810181811067ffffffffffffffff821117612515576040526124ca84612b10565b8152602084013573ffffffffffffffffffffffffffffffffffffffff81168103610f6957918160609360208094015261250560408701612b3d565b6040820152815201920191612319565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503461013c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5761257a612af4565b60243567ffffffffffffffff81116116575760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112611657576040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff000000000000000000000000000000008360801b16600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561277b578491612741575b5061270b576126ad9160209173ffffffffffffffffffffffffffffffffffffffff60025416906040518095819482937fd8694ccd0000000000000000000000000000000000000000000000000000000084526004019060048401612cc8565b03915afa9081156127005782916126ca575b602082604051908152f35b90506020813d6020116126f8575b816126e560209383612a13565b810103126112d6576020915051386126bf565b3d91506126d8565b6040513d84823e3d90fd5b60248367ffffffffffffffff847ffdbd6a7200000000000000000000000000000000000000000000000000000000835216600452fd5b90506020813d602011612773575b8161275c60209383612a13565b810103126116535761276d90612c2c565b3861264e565b3d915061274f565b6040513d86823e3d90fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57506117586040516127c7604082612a13565b601081527f4f6e52616d7020312e362e302d646576000000000000000000000000000000006020820152604051918291602083526020830190612ab1565b9050346112d657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126112d65780612841606092612990565b8281528260208201528260408201520152608060405161286081612990565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060820152611a90604051809273ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b6080810190811067ffffffffffffffff8211176129ac57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff8211176129ac57604052565b6040810190811067ffffffffffffffff8211176129ac57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176129ac57604052565b67ffffffffffffffff81116129ac57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110612aa15750506000910152565b8181015183820152602001612a91565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612aed81518092818752878088019101612a8e565b0116010190565b6004359067ffffffffffffffff82168203612b0b57565b600080fd5b359067ffffffffffffffff82168203612b0b57565b67ffffffffffffffff81116129ac5760051b60200190565b35908115158203612b0b57565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612b0b57565b6064359073ffffffffffffffffffffffffffffffffffffffff82168203612b0b57565b359073ffffffffffffffffffffffffffffffffffffffff82168203612b0b57565b9181601f84011215612b0b5782359167ffffffffffffffff8311612b0b576020808501948460051b010111612b0b57565b906020808351928381520192019060005b818110612c005750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612bf3565b51908115158203612b0b57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215612b0b57016020813591019167ffffffffffffffff8211612b0b578136038313612b0b57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9067ffffffffffffffff9093929316815260406020820152612d3e612d01612cf08580612c39565b60a0604086015260e0850191612c89565b612d0e6020860186612c39565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0858403016060860152612c89565b9060408401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811215612b0b5784016020813591019267ffffffffffffffff8211612b0b578160061b36038413612b0b578281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0016080840152818152602001929060005b818110612e3f57505050612e0c8473ffffffffffffffffffffffffffffffffffffffff612dfc6060612e3c979801612b90565b1660a08401526080810190612c39565b9160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082860301910152612c89565b90565b90919360408060019273ffffffffffffffffffffffffffffffffffffffff612e6689612b90565b16815260208881013590820152019501929101612dc9565b73ffffffffffffffffffffffffffffffffffffffff604051917fbbe4f6db00000000000000000000000000000000000000000000000000000000835216600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115612f8b57600091612f28575b5073ffffffffffffffffffffffffffffffffffffffff1690565b6020813d602011612f83575b81612f4160209383612a13565b810103126112d657519073ffffffffffffffffffffffffffffffffffffffff8216820361013c575073ffffffffffffffffffffffffffffffffffffffff612f0e565b3d9150612f34565b6040513d6000823e3d90fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612b0b5790565b9080601f83011215612b0b578135612fcf81612b25565b92612fdd6040519485612a13565b81845260208085019260051b820101928311612b0b57602001905b8282106130055750505090565b6020809161301284612b90565b815201910190612ff8565b80518210156130315760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612b0b570180359067ffffffffffffffff8211612b0b57602001918136038313612b0b57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612b0b570180359067ffffffffffffffff8211612b0b57602001918160061b36038313612b0b57565b60405190613112826129db565b6060608083600081528260208201528260408201526000838201520152565b92919261313d82612a54565b9161314b6040519384612a13565b829481845281830111612b0b578281602093846000960137010152565b81601f82011215612b0b57805161317e81612a54565b9261318c6040519485612a13565b81845260208284010111612b0b57612e3c9160208085019101612a8e565b9080602083519182815201916020808360051b8301019401926000915b8383106131d657505050505090565b9091929394602080613271837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301875289519073ffffffffffffffffffffffffffffffffffffffff825116815260806132566132448685015160a08886015260a0850190612ab1565b60408501518482036040860152612ab1565b92606081015160608401520151906080818403910152612ab1565b970193019301919392906131c7565b73ffffffffffffffffffffffffffffffffffffffff6001541633036132a157565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b80548210156130315760005260206000200190600090565b600082815260018201602052604090205461336d57805490680100000000000000008210156129ac57826133566133218460018096018555846132cb565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905580549260005201602052604060002055600190565b5050600090565b90600182019181600052826020526040600020548015156000146134fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116134ce578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116134ce57818103613497575b50505080548015613468577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061342982826132cb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6134b76134a761332193866132cb565b90549060031b1c928392866132cb565b9055600052836020526040600020553880806133f1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50505050600090565b91929015613581575081511561351a575090565b3b156135235790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156135945750805190602001fd5b6135d2906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612ab1565b0390fdfea164736f6c634300081a000a",
}
var OnRampABI = OnRampMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go
index 2184e5926d0..090d7d4cd11 100644
--- a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go
+++ b/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go
@@ -44,8 +44,8 @@ type ClientEVMTokenAmount struct {
}
var PingPongDemoMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"feeToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"name\":\"InvalidRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isOutOfOrder\",\"type\":\"bool\"}],\"name\":\"OutOfOrderExecutionChange\",\"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\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Ping\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pingPongCount\",\"type\":\"uint256\"}],\"name\":\"Pong\",\"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\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCounterpartChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOutOfOrderExecution\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"counterpartChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"counterpartAddress\",\"type\":\"address\"}],\"name\":\"setCounterpart\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setCounterpartAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"setCounterpartChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"outOfOrderExecution\",\"type\":\"bool\"}],\"name\":\"setOutOfOrderExecution\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pause\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startPingPong\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b50604051620014a8380380620014a88339810160408190526200003491620001ff565b336000836001600160a01b03811662000067576040516335fdcccd60e21b81526000600482015260240160405180910390fd5b6001600160a01b0390811660805282166200009557604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0384811691909117909155811615620000c857620000c8816200016c565b50506002805460ff60a01b19169055600380546001600160a01b0319166001600160a01b0383811691821790925560405163095ea7b360e01b8152918416600483015260001960248301529063095ea7b3906044016020604051808303816000875af11580156200013d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016391906200023e565b50505062000269565b336001600160a01b038216036200019657604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b0381168114620001fc57600080fd5b50565b600080604083850312156200021357600080fd5b82516200022081620001e6565b60208401519092506200023381620001e6565b809150509250929050565b6000602082840312156200025157600080fd5b815180151581146200026257600080fd5b9392505050565b6080516112156200029360003960008181610295015281816106520152610a5901526112156000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638da5cb5b116100b2578063b187bd2611610081578063bee518a411610066578063bee518a4146102ef578063ca709a251461032d578063f2fde38b1461034b57600080fd5b8063b187bd26146102b9578063b5a11011146102dc57600080fd5b80638da5cb5b1461023f5780639d2aede51461025d578063ae90de5514610270578063b0f479a11461029357600080fd5b80632874d8bf11610109578063665ed537116100ee578063665ed5371461021157806379ba50971461022457806385572ffb1461022c57600080fd5b80632874d8bf146101ca5780632b6e5d63146101d257600080fd5b806301ffc9a71461013b57806316c38b3c14610163578063181f5a77146101785780631892b906146101b7575b600080fd5b61014e610149366004610c29565b61035e565b60405190151581526020015b60405180910390f35b610176610171366004610c72565b6103f7565b005b604080518082018252601281527f50696e67506f6e6744656d6f20312e352e3000000000000000000000000000006020820152905161015a9190610cf8565b6101766101c5366004610d28565b610449565b6101766104a4565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015a565b61017661021f366004610c72565b6104e0565b61017661056c565b61017661023a366004610d43565b61063a565b60015473ffffffffffffffffffffffffffffffffffffffff166101ec565b61017661026b366004610da2565b6106c3565b60035474010000000000000000000000000000000000000000900460ff1661014e565b7f00000000000000000000000000000000000000000000000000000000000000006101ec565b60025474010000000000000000000000000000000000000000900460ff1661014e565b6101766102ea366004610dbd565b610712565b60015474010000000000000000000000000000000000000000900467ffffffffffffffff1660405167ffffffffffffffff909116815260200161015a565b60035473ffffffffffffffffffffffffffffffffffffffff166101ec565b610176610359366004610da2565b6107b4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb0000000000000000000000000000000000000000000000000000000014806103f157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6103ff6107c5565b6002805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6104516107c5565b6001805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6104ac6107c5565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556104de6001610816565b565b6104e86107c5565b6003805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd99061056190831515815260200190565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105bd576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106af576040517fd7f7333400000000000000000000000000000000000000000000000000000000815233600482015260240160405180910390fd5b6106c06106bb82610ff3565b610b0f565b50565b6106cb6107c5565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61071a6107c5565b6001805467ffffffffffffffff90931674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909316929092179091556002805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055565b6107bc6107c5565b6106c081610b65565b60015473ffffffffffffffffffffffffffffffffffffffff1633146104de576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600116600103610859576040518181527f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f9060200160405180910390a161088d565b6040518181527f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15259060200160405180910390a15b6040805160a0810190915260025473ffffffffffffffffffffffffffffffffffffffff1660c08201526000908060e081016040516020818303038152906040528152602001836040516020016108e591815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528152602001600060405190808252806020026020018201604052801561095f57816020015b60408051808201909152600080825260208201528152602001906001900390816109385790505b50815260035473ffffffffffffffffffffffffffffffffffffffff811660208084019190915260408051808201825262030d408082527401000000000000000000000000000000000000000090940460ff16151590830190815281516024810194909452511515604480850191909152815180850390910181526064909301815290820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf1000000000000000000000000000000000000000000000000000000000179052909101526001546040517f96f4e9f90000000000000000000000000000000000000000000000000000000081529192507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16916396f4e9f991610ac7917401000000000000000000000000000000000000000090910467ffffffffffffffff169085906004016110a0565b6020604051808303816000875af1158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a91906111b5565b505050565b60008160600151806020019051810190610b2991906111b5565b60025490915074010000000000000000000000000000000000000000900460ff16610b6157610b61610b5c8260016111ce565b610816565b5050565b3373ffffffffffffffffffffffffffffffffffffffff821603610bb4576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215610c3b57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c6b57600080fd5b9392505050565b600060208284031215610c8457600080fd5b81358015158114610c6b57600080fd5b6000815180845260005b81811015610cba57602081850181015186830182015201610c9e565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610c6b6020830184610c94565b803567ffffffffffffffff81168114610d2357600080fd5b919050565b600060208284031215610d3a57600080fd5b610c6b82610d0b565b600060208284031215610d5557600080fd5b813567ffffffffffffffff811115610d6c57600080fd5b820160a08185031215610c6b57600080fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114610d2357600080fd5b600060208284031215610db457600080fd5b610c6b82610d7e565b60008060408385031215610dd057600080fd5b610dd983610d0b565b9150610de760208401610d7e565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610e4257610e42610df0565b60405290565b60405160a0810167ffffffffffffffff81118282101715610e4257610e42610df0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610eb257610eb2610df0565b604052919050565b600082601f830112610ecb57600080fd5b813567ffffffffffffffff811115610ee557610ee5610df0565b610f1660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610e6b565b818152846020838601011115610f2b57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112610f5957600080fd5b8135602067ffffffffffffffff821115610f7557610f75610df0565b610f83818360051b01610e6b565b82815260069290921b84018101918181019086841115610fa257600080fd5b8286015b84811015610fe85760408189031215610fbf5760008081fd5b610fc7610e1f565b610fd082610d7e565b81528185013585820152835291830191604001610fa6565b509695505050505050565b600060a0823603121561100557600080fd5b61100d610e48565b8235815261101d60208401610d0b565b6020820152604083013567ffffffffffffffff8082111561103d57600080fd5b61104936838701610eba565b6040840152606085013591508082111561106257600080fd5b61106e36838701610eba565b6060840152608085013591508082111561108757600080fd5b5061109436828601610f48565b60808301525092915050565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526110cf60e0860182610c94565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08087840301606088015261110a8383610c94565b6040890151888203830160808a01528051808352908601945060009350908501905b8084101561116b578451805173ffffffffffffffffffffffffffffffffffffffff1683528601518683015293850193600193909301929086019061112c565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506111a78187610c94565b9a9950505050505050505050565b6000602082840312156111c757600080fd5b5051919050565b808201808211156103f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCounterpartAddress\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCounterpartChainSelector\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOutOfOrderExecution\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPaused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setCounterpart\",\"inputs\":[{\"name\":\"counterpartChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"counterpartAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCounterpartAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCounterpartChainSelector\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOutOfOrderExecution\",\"inputs\":[{\"name\":\"outOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPaused\",\"inputs\":[{\"name\":\"pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"startPingPong\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"OutOfOrderExecutionChange\",\"inputs\":[{\"name\":\"isOutOfOrder\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Ping\",\"inputs\":[{\"name\":\"pingPongCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Pong\",\"inputs\":[{\"name\":\"pingPongCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRouter\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]}]",
+ Bin: "0x60a0806040523461011f57604081611643803803809161001f828561015f565b83398101031261011f578051906001600160a01b0382169081830361011f57602001516001600160a01b038116929083900361011f57811561014957608052331561013857600180546001600160a01b031990811633179091556002805460ff60a01b19169055600380549091168317905560405163095ea7b360e01b81526004810191909152600019602482015290602090829060449082906000905af1801561012c576100ef575b6040516114aa908161019982396080518181816103df015281816105a00152610fd20152f35b6020813d602011610124575b816101086020938361015f565b8101031261011f57518015150361011f57386100c9565b600080fd5b3d91506100fb565b6040513d6000823e3d90fd5b639b15e16f60e01b60005260046000fd5b6335fdcccd60e21b600052600060045260246000fd5b601f909101601f19168101906001600160401b0382119082101761018257604052565b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146111e05750806316c38b3c14611152578063181f5a77146110d15780631892b906146110415780632874d8bf14610cf25780632b6e5d6314610ca0578063665ed53714610bea57806379ba509714610b0157806385572ffb1461051c5780638da5cb5b146104ca5780639d2aede514610447578063ae90de5514610403578063b0f479a114610394578063b187bd2614610350578063b5a1101114610275578063bee518a41461022c578063ca709a25146101da5763f2fde38b146100e557600080fd5b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55773ffffffffffffffffffffffffffffffffffffffff610131611312565b610139611452565b163381146101ab57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602067ffffffffffffffff60015460a01c16604051908152f35b346101d55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d5576102ac6112fb565b6024359073ffffffffffffffffffffffffffffffffffffffff82168092036101d5576102d6611452565b7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff00000000000000000000000000000000000000006001549260a01b169116176001557fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255600080f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602060ff60025460a01c166040519015158152f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602060ff60035460a01c166040519015158152f35b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55773ffffffffffffffffffffffffffffffffffffffff610493611312565b61049b611452565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255600080f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55760043567ffffffffffffffff81116101d55760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101d55773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803303610ad3576000916040516105d681611335565b81600401358152602482013567ffffffffffffffff81168103610acb576020820152604482013567ffffffffffffffff8111610acb5761061c90600436918501016113dd565b6040820152606482013567ffffffffffffffff8111610acb5761064590600436918501016113dd565b916060820192835260848101359067ffffffffffffffff8211610acf57019036602383011215610acb57600482013567ffffffffffffffff8111610a9e5760208160051b0192610698604051948561139c565b818452602060048186019360061b8301010190368211610a9a57602401915b818310610a44575050506080015251602081805181010312610a4057602001519060ff60025460a01c16156106ea578280f35b60018201809211610a13576001828116036109e4577f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f6020604051848152a15b73ffffffffffffffffffffffffffffffffffffffff60025416906040519160208301526020825261075c60408361139c565b6040519260208401526020835261077460408461139c565b604051602093610784858361139c565b85825290918585936003546040519061079c82611380565b62030d40825286820160ff8260a01c1615158152604051927f181dcf1000000000000000000000000000000000000000000000000000000000898501525160248401525115156044830152604482526107f660648361139c565b6040519761080389611335565b88528688019586526040880192835273ffffffffffffffffffffffffffffffffffffffff6060890191168152608088019182526108c567ffffffffffffffff60015460a01c16966108946040519a8b997f96f4e9f9000000000000000000000000000000000000000000000000000000008b5260048b0152604060248b01525160a060448b015260e48a019061129c565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8983030160648a015261129c565b9251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc878203016084880152878085519283815201940190855b8181106109a757505050859392849273ffffffffffffffffffffffffffffffffffffffff61095f93511660a4850152517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8483030160c485015261129c565b03925af1801561099c57610971578280f35b813d8311610995575b610984818361139c565b810103126109925781808280f35b80fd5b503d61097a565b6040513d85823e3d90fd5b8251805173ffffffffffffffffffffffffffffffffffffffff1687528a01518a8701528b998b99508d975060409096019590920191600101610900565b7f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15256020604051848152a161072a565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8280fd5b604083360312610a9a5760405190610a5b82611380565b83359073ffffffffffffffffffffffffffffffffffffffff82168203610a9657826020926040945282860135838201528152019201916106b7565b8980fd5b8780fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8480fd5b8580fd5b7fd7f73334000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55760005473ffffffffffffffffffffffffffffffffffffffff81163303610bc0577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d5576004358015158091036101d55760207f05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd991610c52611452565b6003547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000008360a01b16911617600355604051908152a1005b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557610d29611452565b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002557f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f602060405160018152a1600173ffffffffffffffffffffffffffffffffffffffff6002541660405190602082015260208152610daf60408261139c565b6040519082602083015260208252610dc860408361139c565b604051602092610dd8848361139c565b6000825260009461103c575b839060035460405190610df682611380565b62030d40825283820160ff8260a01c1615158152604051927f181dcf100000000000000000000000000000000000000000000000000000000086850152516024840152511515604483015260448252610e5060648361139c565b60405195610e5d87611335565b86528386019283526040860194855273ffffffffffffffffffffffffffffffffffffffff606087019116815260808601918252610f1f67ffffffffffffffff60015460a01c1693610eee6040519889967f96f4e9f90000000000000000000000000000000000000000000000000000000088526004880152604060248801525160a0604488015260e487019061129c565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc86830301606487015261129c565b9451947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc848203016084850152848087519283815201960190895b8181106110025750505093610fb89173ffffffffffffffffffffffffffffffffffffffff849596511660a4850152517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8483030160c485015261129c565b03818673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561099c57610971578280f35b8251805173ffffffffffffffffffffffffffffffffffffffff16895287015187890152604090970196899689965090920191600101610f5a565b610de4565b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d5576110786112fb565b611080611452565b7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff00000000000000000000000000000000000000006001549260a01b16911617600155600080f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55761114e6040805190611112818361139c565b601282527f50696e67506f6e6744656d6f20312e352e30000000000000000000000000000060208301525191829160208352602083019061129c565b0390f35b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d5576004358015158091036101d557611196611452565b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006002549260a01b16911617600255600080f35b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101d557817f85572ffb0000000000000000000000000000000000000000000000000000000060209314908115611272575b5015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148361126b565b919082519283825260005b8481106112e65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016112a7565b6004359067ffffffffffffffff821682036101d557565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101d557565b60a0810190811067ffffffffffffffff82111761135157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761135157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761135157604052565b81601f820112156101d55780359067ffffffffffffffff82116113515760405192611430601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018561139c565b828452602083830101116101d557816000926020809301838601378301015290565b73ffffffffffffffffffffffffffffffffffffffff60015416330361147357565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fdfea164736f6c634300081a000a",
}
var PingPongDemoABI = PingPongDemoMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/registry_module_owner_custom/registry_module_owner_custom.go b/core/gethwrappers/ccip/generated/registry_module_owner_custom/registry_module_owner_custom.go
index 315d75121b1..a93cb3b7ded 100644
--- a/core/gethwrappers/ccip/generated/registry_module_owner_custom/registry_module_owner_custom.go
+++ b/core/gethwrappers/ccip/generated/registry_module_owner_custom/registry_module_owner_custom.go
@@ -31,8 +31,8 @@ var (
)
var RegistryModuleOwnerCustomMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"CanOnlySelfRegister\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"msgSender\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"RequiredRoleNotFound\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"}],\"name\":\"AdministratorRegistered\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"registerAccessControlDefaultAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"registerAdminViaGetCCIPAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"registerAdminViaOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60a060405234801561001057600080fd5b5060405161064a38038061064a83398101604081905261002f91610067565b6001600160a01b03811661005657604051639fabe1c160e01b815260040160405180910390fd5b6001600160a01b0316608052610097565b60006020828403121561007957600080fd5b81516001600160a01b038116811461009057600080fd5b9392505050565b6080516105986100b260003960006103db01526105986000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063181f5a771461005157806369c0081e146100a357806396ea2f7a146100b8578063ff12c354146100cb575b600080fd5b61008d6040518060400160405280601f81526020017f52656769737472794d6f64756c654f776e6572437573746f6d20312e362e300081525081565b60405161009a9190610480565b60405180910390f35b6100b66100b136600461050f565b6100de565b005b6100b66100c636600461050f565b610255565b6100b66100d936600461050f565b6102d0565b60008173ffffffffffffffffffffffffffffffffffffffff1663a217fddf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561012b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061014f9190610533565b6040517f91d148540000000000000000000000000000000000000000000000000000000081526004810182905233602482015290915073ffffffffffffffffffffffffffffffffffffffff8316906391d1485490604401602060405180830381865afa1580156101c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e7919061054c565b610247576040517f86e0b3440000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff831660448201526064015b60405180910390fd5b610251823361031f565b5050565b6102cd818273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c8919061056e565b61031f565b50565b6102cd818273ffffffffffffffffffffffffffffffffffffffff16638fd6a6ac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102a4573d6000803e3d6000fd5b73ffffffffffffffffffffffffffffffffffffffff8116331461038e576040517fc454d18200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301528316602482015260440161023e565b6040517fe677ae3700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063e677ae3790604401600060405180830381600087803b15801561041f57600080fd5b505af1158015610433573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff8085169350851691507f09590fb70af4b833346363965e043a9339e8c7d378b8a2b903c75c277faec4f990600090a35050565b60006020808352835180602085015260005b818110156104ae57858101830151858201604001528201610492565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff811681146102cd57600080fd5b60006020828403121561052157600080fd5b813561052c816104ed565b9392505050565b60006020828403121561054557600080fd5b5051919050565b60006020828403121561055e57600080fd5b8151801515811461052c57600080fd5b60006020828403121561058057600080fd5b815161052c816104ed56fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAccessControlDefaultAdmin\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAdminViaGetCCIPAdmin\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAdminViaOwner\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdministratorRegistered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"administrator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CanOnlySelfRegister\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"RequiredRoleNotFound\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]",
+ Bin: "0x60a034607e57601f6106e938819003918201601f19168301916001600160401b03831184841017608357808492602094604052833981010312607e57516001600160a01b03811690819003607e578015606d5760805260405161064f908161009a82396080518161052b0152f35b639fabe1c160e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c908163181f5a77146103795750806369c0081e146101e557806396ea2f7a1461012a5763ff12c3541461004b57600080fd5b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043573ffffffffffffffffffffffffffffffffffffffff811690818103610125576020600492604051938480927f8fd6a6ac0000000000000000000000000000000000000000000000000000000082525afa908115610119576100e6926000926100e8575b506104f5565b005b61010b91925060203d602011610112575b6101038183610488565b8101906104c9565b90386100e0565b503d6100f9565b6040513d6000823e3d90fd5b600080fd5b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043573ffffffffffffffffffffffffffffffffffffffff811690818103610125576020600492604051938480927f8da5cb5b0000000000000000000000000000000000000000000000000000000082525afa908115610119576100e6926000926101c457506104f5565b6101de91925060203d602011610112576101038183610488565b90836100e0565b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043573ffffffffffffffffffffffffffffffffffffffff811690818103610125576040517fa217fddf000000000000000000000000000000000000000000000000000000008152602081600481865afa90811561011957600091610347575b506040517f91d14854000000000000000000000000000000000000000000000000000000008152816004820152336024820152602081604481875afa90811561011957600091610305575b50156102cf576100e633836104f5565b90507f86e0b344000000000000000000000000000000000000000000000000000000006000523360045260245260445260646000fd5b6020813d60201161033f575b8161031e60209383610488565b8101031261033b57519081151582036103385750846102bf565b80fd5b5080fd5b3d9150610311565b90506020813d602011610371575b8161036260209383610488565b81010312610125575183610274565b3d9150610355565b346101255760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610125576040810181811067ffffffffffffffff82111761045957604052601f81527f52656769737472794d6f64756c654f776e6572437573746f6d20312e362e3000602082015260405190602082528181519182602083015260005b8381106104415750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610401565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761045957604052565b90816020910312610125575173ffffffffffffffffffffffffffffffffffffffff811681036101255790565b9073ffffffffffffffffffffffffffffffffffffffff16903382036105fb5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690813b156101255773ffffffffffffffffffffffffffffffffffffffff906040519182917fe677ae3700000000000000000000000000000000000000000000000000000000835216928360048301528460248301528160446000948580945af180156105f05790827f09590fb70af4b833346363965e043a9339e8c7d378b8a2b903c75c277faec4f993926105e0575b9050a3565b6105e991610488565b38816105db565b6040513d84823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff917fc454d182000000000000000000000000000000000000000000000000000000006000526004521660245260446000fdfea164736f6c634300081a000a",
}
var RegistryModuleOwnerCustomABI = RegistryModuleOwnerCustomMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/report_codec/report_codec.go b/core/gethwrappers/ccip/generated/report_codec/report_codec.go
index 0a58d0a6b93..b3c7dfa61ee 100644
--- a/core/gethwrappers/ccip/generated/report_codec/report_codec.go
+++ b/core/gethwrappers/ccip/generated/report_codec/report_codec.go
@@ -98,8 +98,8 @@ type OffRampCommitReport struct {
}
var ReportCodecMetaData = &bind.MetaData{
- ABI: "[{\"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\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNRemote.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportDecoded\",\"type\":\"event\"},{\"anonymous\":false,\"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\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"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\"}],\"indexed\":false,\"internalType\":\"structInternal.ExecutionReport[]\",\"name\":\"report\",\"type\":\"tuple[]\"}],\"name\":\"ExecuteReportDecoded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"decodeCommitReport\",\"outputs\":[{\"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\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNRemote.Signature[]\",\"name\":\"rmnSignatures\",\"type\":\"tuple[]\"}],\"internalType\":\"structOffRamp.CommitReport\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"decodeExecuteReport\",\"outputs\":[{\"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\":\"address\",\"name\":\"destTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destGasAmount\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"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.ExecutionReport[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b506113c3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636fb349561461003b578063f816ec6014610064575b600080fd5b61004e610049366004610231565b610084565b60405161005b91906104ee565b60405180910390f35b610077610072366004610231565b6100a0565b60405161005b9190610833565b60608180602001905181019061009a9190610e6d565b92915050565b6040805160a08101825260608082018181526080830182905282526020808301829052928201528251909161009a918401810190840161122d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561012d5761012d6100db565b60405290565b60405160c0810167ffffffffffffffff8111828210171561012d5761012d6100db565b6040805190810167ffffffffffffffff8111828210171561012d5761012d6100db565b6040516060810167ffffffffffffffff8111828210171561012d5761012d6100db565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156101e3576101e36100db565b604052919050565b600067ffffffffffffffff821115610205576102056100db565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006020828403121561024357600080fd5b813567ffffffffffffffff81111561025a57600080fd5b8201601f8101841361026b57600080fd5b803561027e610279826101eb565b61019c565b81815285602083850101111561029357600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b838110156102cc5781810151838201526020016102b4565b50506000910152565b600081518084526102ed8160208601602086016102b1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b848110156103eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a08151818652610380828701826102d5565b91505073ffffffffffffffffffffffffffffffffffffffff868301511686860152604063ffffffff81840151168187015250606080830151868303828801526103c983826102d5565b608094850151979094019690965250509884019892509083019060010161033c565b5090979650505050505050565b6000828251808552602080860195506005818360051b8501018287016000805b868110156104a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe088850381018c5283518051808752908801908887019080891b88018a01865b8281101561048c57858a830301845261047a8286516102d5565b948c0194938c01939150600101610460565b509e8a019e97505050938701935050600101610418565b50919998505050505050505050565b60008151808452602080850194506020840160005b838110156104e3578151875295820195908201906001016104c7565b509495945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156106d6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452815160a0860167ffffffffffffffff8083511688528883015160a08a8a015282815180855260c08b01915060c08160051b8c010194508b8301925060005b8181101561067f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408c87030183528351805180518852868f820151168f890152866040820151166040890152866060820151166060890152866080820151166080890152508d81015161014060a08901526106026101408901826102d5565b9050604082015188820360c08a015261061b82826102d5565b915050606082015161064560e08a018273ffffffffffffffffffffffffffffffffffffffff169052565b50608082015161010089015260a0820151915087810361012089015261066b818361031f565b97505050928c0192918c0191600101610582565b50505050506040820151878203604089015261069b82826103f8565b915050606082015187820360608901526106b582826104b2565b60809384015198909301979097525094509285019290850190600101610515565b5092979650505050505050565b60008151808452602080850194506020840160005b838110156104e3578151805167ffffffffffffffff1688528301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1683880152604090960195908201906001016106f8565b600082825180855260208086019550808260051b84010181860160005b848110156103eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018952815160a067ffffffffffffffff8083511686528683015182888801526107bb838801826102d5565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101610764565b60008151808452602080850194506020840160005b838110156104e357815180518852830151838801526040909601959082019060010161080c565b602080825282516060838301528051604060808501819052815160c086018190526000949392840191859160e08801905b808410156108c1578451805173ffffffffffffffffffffffffffffffffffffffff1683528701517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1687830152938601936001939093019290820190610864565b50938501518785037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800160a0890152936108fb81866106e3565b9450505050508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08085830301604086015261093c8284610747565b925060408601519150808584030160608601525061095a82826107f7565b95945050505050565b600067ffffffffffffffff82111561097d5761097d6100db565b5060051b60200190565b805167ffffffffffffffff8116811461099f57600080fd5b919050565b600060a082840312156109b657600080fd5b6109be61010a565b9050815181526109d060208301610987565b60208201526109e160408301610987565b60408201526109f260608301610987565b6060820152610a0360808301610987565b608082015292915050565b600082601f830112610a1f57600080fd5b8151610a2d610279826101eb565b818152846020838601011115610a4257600080fd5b610a538260208301602087016102b1565b949350505050565b805173ffffffffffffffffffffffffffffffffffffffff8116811461099f57600080fd5b600082601f830112610a9057600080fd5b81516020610aa061027983610963565b82815260059290921b84018101918181019086841115610abf57600080fd5b8286015b84811015610bbb57805167ffffffffffffffff80821115610ae45760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610b1d5760008081fd5b610b2561010a565b8784015183811115610b375760008081fd5b610b458d8a83880101610a0e565b8252506040610b55818601610a5b565b8983015260608086015163ffffffff81168114610b725760008081fd5b808385015250608091508186015185811115610b8e5760008081fd5b610b9c8f8c838a0101610a0e565b9184019190915250919093015190830152508352918301918301610ac3565b509695505050505050565b600082601f830112610bd757600080fd5b81516020610be761027983610963565b82815260059290921b84018101918181019086841115610c0657600080fd5b8286015b84811015610bbb57805167ffffffffffffffff80821115610c2b5760008081fd5b8189019150610140807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d03011215610c655760008081fd5b610c6d610133565b610c798c8986016109a4565b815260c084015183811115610c8e5760008081fd5b610c9c8d8a83880101610a0e565b898301525060e084015183811115610cb45760008081fd5b610cc28d8a83880101610a0e565b604083015250610cd56101008501610a5b565b60608201526101208401516080820152908301519082821115610cf85760008081fd5b610d068c8984870101610a7f565b60a08201528652505050918301918301610c0a565b600082601f830112610d2c57600080fd5b81516020610d3c61027983610963565b82815260059290921b84018101918181019086841115610d5b57600080fd5b8286015b84811015610bbb57805167ffffffffffffffff80821115610d7f57600080fd5b818901915089603f830112610d9357600080fd5b85820151610da361027982610963565b81815260059190911b830160400190878101908c831115610dc357600080fd5b604085015b83811015610dfc57805185811115610ddf57600080fd5b610dee8f6040838a0101610a0e565b845250918901918901610dc8565b50875250505092840192508301610d5f565b600082601f830112610e1f57600080fd5b81516020610e2f61027983610963565b8083825260208201915060208460051b870101935086841115610e5157600080fd5b602086015b84811015610bbb5780518352918301918301610e56565b60006020808385031215610e8057600080fd5b825167ffffffffffffffff80821115610e9857600080fd5b818501915085601f830112610eac57600080fd5b8151610eba61027982610963565b81815260059190911b83018401908481019088831115610ed957600080fd5b8585015b83811015610fd357805185811115610ef457600080fd5b860160a0818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215610f295760008081fd5b610f3161010a565b610f3c898301610987565b815260408083015188811115610f525760008081fd5b610f608e8c83870101610bc6565b8b8401525060608084015189811115610f795760008081fd5b610f878f8d83880101610d1b565b8385015250608091508184015189811115610fa25760008081fd5b610fb08f8d83880101610e0e565b918401919091525060a09290920151918101919091528352918601918601610edd565b5098975050505050505050565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461099f57600080fd5b600082601f83011261101d57600080fd5b8151602061102d61027983610963565b82815260069290921b8401810191818101908684111561104c57600080fd5b8286015b84811015610bbb57604081890312156110695760008081fd5b611071610156565b61107a82610987565b8152611087858301610fe0565b81860152835291830191604001611050565b600082601f8301126110aa57600080fd5b815160206110ba61027983610963565b82815260059290921b840181019181810190868411156110d957600080fd5b8286015b84811015610bbb57805167ffffffffffffffff808211156110fe5760008081fd5b818901915060a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848d030112156111375760008081fd5b61113f61010a565b61114a888501610987565b8152604080850151848111156111605760008081fd5b61116e8e8b83890101610a0e565b8a8401525060609350611182848601610987565b908201526080611193858201610987565b938201939093529201519082015283529183019183016110dd565b600082601f8301126111bf57600080fd5b815160206111cf61027983610963565b82815260069290921b840181019181810190868411156111ee57600080fd5b8286015b84811015610bbb576040818903121561120b5760008081fd5b611213610156565b8151815284820151858201528352918301916040016111f2565b6000602080838503121561124057600080fd5b825167ffffffffffffffff8082111561125857600080fd5b908401906060828703121561126c57600080fd5b611274610179565b82518281111561128357600080fd5b8301604081890381131561129657600080fd5b61129e610156565b8251858111156112ad57600080fd5b8301601f81018b136112be57600080fd5b80516112cc61027982610963565b81815260069190911b8201890190898101908d8311156112eb57600080fd5b928a01925b828410156113395785848f0312156113085760008081fd5b611310610156565b61131985610a5b565b81526113268c8601610fe0565b818d0152825292850192908a01906112f0565b84525050508287015191508482111561135157600080fd5b61135d8a83850161100c565b8188015283525050828401518281111561137657600080fd5b61138288828601611099565b8583015250604083015193508184111561139b57600080fd5b6113a7878585016111ae565b6040820152969550505050505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"function\",\"name\":\"decodeCommitReport\",\"inputs\":[{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"decodeExecuteReport\",\"inputs\":[{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"CommitReportDecoded\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecuteReportDecoded\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false}]",
+ Bin: "0x60808060405234601557611604908161001b8239f35b600080fdfe6101c0604052600436101561001357600080fd5b60003560e01c80636fb34956146106355763f816ec601461003357600080fd5b3461051d5761004136611462565b6060604061004d6113a4565b6100556113c4565b838152836020820152815282602082015201528051810190602082019060208184031261051d5760208101519067ffffffffffffffff821161051d57019060608284031261051d576100a56113a4565b92602083015167ffffffffffffffff811161051d578301602081019060409083031261051d576100d36113c4565b90805167ffffffffffffffff811161051d57810184601f8201121561051d57805161010561010082611545565b6113e4565b9160208084848152019260061b8201019087821161051d57602001915b8183106105f657505050825260208101519067ffffffffffffffff821161051d570183601f8201121561051d57805161015d61010082611545565b9160208084848152019260061b8201019086821161051d57602001915b8183106105b75750505060208201528452604083015167ffffffffffffffff811161051d576020908401019282601f8501121561051d578351936101c061010086611545565b9460208087838152019160051b8301019185831161051d5760208101915b838310610522575050505060208501938452606081015167ffffffffffffffff811161051d5760209101019180601f8401121561051d5782519161022461010084611545565b9360208086868152019460061b82010192831161051d5793959493602001925b8284106104e45750505050604082019283526040519283926020845251916060602085015260c0840192805193604060808701528451809152602060e0870195019060005b81811061048b5750505060200151927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808582030160a08601526020808551928381520194019060005b81811061043e5750505051917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848203016040850152825180825260208201916020808360051b8301019501926000915b83831061039e57505050505051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08382030160608401526020808351928381520192019060005b818110610379575050500390f35b825180518552602090810151818601528695506040909401939092019160010161036b565b91939650919394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865289519067ffffffffffffffff82511681526080806103fd8585015160a08786015260a0850190611502565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff606082015116606085015201519101529801930193019092879695949293610323565b8251805167ffffffffffffffff1687526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681880152889750604090960195909201916001016102d2565b8251805173ffffffffffffffffffffffffffffffffffffffff1688526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168189015289985060409097019690920191600101610289565b6040602085849997989903011261051d5760206040916105026113c4565b86518152828701518382015281520193019295949395610244565b600080fd5b825167ffffffffffffffff811161051d57820160a08188031261051d57610547611384565b916105546020830161155d565b835260408201519267ffffffffffffffff841161051d5760a08361057f8c6020809881980101611572565b8584015261058f6060820161155d565b60408401526105a06080820161155d565b6060840152015160808201528152019201916101de565b60406020848803011261051d5760206040916105d16113c4565b6105da8661155d565b81526105e78387016115ce565b8382015281520192019161017a565b60406020848903011261051d5760206040916106106113c4565b610619866115ad565b81526106268387016115ce565b83820152815201920191610122565b3461051d5761064336611462565b61010052610100515161010051016101a0526020610100516101a051031261051d5760206101005101516101405267ffffffffffffffff610140511161051d5760206101a05101603f61014051610100510101121561051d5760206101405161010051010151610120526106bc61010061012051611545565b60c05260c051610180526101205160c05152602060c0510160c05260c0516101605260206101a051016020806101205160051b6101405161010051010101011161051d5760406101405161010051010160e0525b6020806101205160051b61014051610100510101010160e05110610adc5760405180602081016020825261018051518091526040820160408260051b8401019161016051916000905b82821061076857505050500390f35b91939092947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc090820301825284519060a081019167ffffffffffffffff815116825260208101519260a06020840152835180915260c08301602060c08360051b86010195019160005b81811061092c57505050506040810151928281036040840152835180825260208201906020808260051b85010196019260005b8281106108715750505050506060810151928281036060840152602080855192838152019401906000905b80821061085957505050600192602092608080859401519101529601920192018594939192610759565b9091946020806001928851815201960192019061082f565b90919293967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083829e9d9e0301855287519081519081815260208101906020808460051b8301019401926000915b8183106108e35750505050506020806001929e9d9e99019501910192919092610804565b909192939460208061091f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030189528951611502565b97019501930191906108bf565b909192957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40868203018452865167ffffffffffffffff6080825180518552826020820151166020860152826040820151166040860152826060820151166060860152015116608083015260a06109c76109b5602084015161014084870152610140860190611502565b604084015185820360c0870152611502565b9173ffffffffffffffffffffffffffffffffffffffff60608201511660e0850152608081015161010085015201519161012081830391015281519081815260208101906020808460051b8301019401926000915b818310610a3b5750505050506020806001929801940191019190916107d1565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08560019503018852885190608080610ac9610a89855160a0865260a0860190611502565b73ffffffffffffffffffffffffffffffffffffffff87870151168786015263ffffffff604087015116604086015260608601518582036060870152611502565b9301519101529701950193019190610a1b565b60e0515160a05267ffffffffffffffff60a0511161051d5760a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081835161014051610100510101016101a0510301011261051d57610b3b611384565b610b5560208060a05161014051610100510101010161155d565b81526040602060a0516101405161010051010101015160805267ffffffffffffffff6080511161051d5760206101a05101601f60206080518160a0516101405161010051010101010101121561051d5760206080518160a0516101405161010051010101010151610bc861010082611545565b90602082828152019060206101a0510160208260051b816080518160a0516101405161010051010101010101011161051d576020806080518160a0516101405161010051010101010101915b60208260051b816080518160a0516101405161010051010101010101018310610eff5750505060208201526060602060a0516101405161010051010101015167ffffffffffffffff811161051d5760206101a05101601f6020838160a0516101405161010051010101010101121561051d576020818160a051610140516101005101010101015190610ca861010083611545565b91602083828152019160206101a0510160208360051b81848160a0516101405161010051010101010101011161051d5760a051610140516101005101018101606001925b60208360051b81848160a0516101405161010051010101010101018410610dde5750505050604082015260a0805161014051610100510101015167ffffffffffffffff811161051d576020908160a0516101405161010051010101010160206101a05101601f8201121561051d57805190610d6961010083611545565b9160208084838152019160051b8301019160206101a05101831161051d57602001905b828210610dce57505050606082015260a06020815161014051610100510101010151608082015260c05152602060c0510160c052602060e0510160e052610710565b8151815260209182019101610d8c565b835167ffffffffffffffff811161051d5760206101a05101603f826020868160a051610140516101005101010101010101121561051d5760a051610140516101005101018301810160600151610e3661010082611545565b916020838381520160206101a051016020808560051b85828b8160a05161014051610100510101010101010101011161051d5760a0516101405161010051010186018201608001905b60a05161014051610100516080910190910188018401600586901b01018210610eb5575050509082525060209384019301610cec565b815167ffffffffffffffff811161051d576101a05160a051610140516101005160209586959094610ef4949087019360809301018d0189010101611572565b815201910190610e7f565b825167ffffffffffffffff811161051d5760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082826080518160a05161014051610100510101010101016101a05103010190610140821261051d576040519160c083019083821067ffffffffffffffff8311176113555760a0916040521261051d57610f8a611384565b602082816080518160a051610140516101005101010101010101518152610fca60408360206080518160a05161014051610100510101010101010161155d565b6020820152610ff260608360206080518160a05161014051610100510101010101010161155d565b6040820152611019608083602082518160a05161014051610100510101010101010161155d565b606082015261104060a083602060805181845161014051610100510101010101010161155d565b6080820152825260c08160206080518160a0516101405161010051010101010101015167ffffffffffffffff811161051d5761109d906020806101a051019184826080518160a05161014051610100510101010101010101611572565b602083015260e08160206080518160a0516101405161010051010101010101015167ffffffffffffffff811161051d576110f8906020806101a051019184826080518160a05161014051610100510101010101010101611572565b604083015261111f6101008260206080518160a051610140518651010101010101016115ad565b60608301526101208160206080518160a0516101405161010051010101010101015160808301526101408160206080518160a05185516101005101010101010101519067ffffffffffffffff821161051d5760206101a05101601f60208484826080518160a0516101405161010051010101010101010101121561051d5760208282826080518160a05161014051610100510101010101010101516111c661010082611545565b92602084838152019260206101a0510160208460051b818585826080518160a0516101405161010051010101010101010101011161051d576080805160a05161014051610100510101018201830101935b6080805160a051610140516101005101010183018401600586901b0101851061125257505050505060a0820152815260209283019201610c14565b845167ffffffffffffffff811161051d5760208484826080518160a051610140516101005101010101010101010160a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0836101a0510301011261051d576112ba611384565b91602082015167ffffffffffffffff811161051d576112e4906020806101a0510191850101611572565b83526112f2604083016115ad565b6020840152606082015163ffffffff8116810361051d57604084015260808201519267ffffffffffffffff841161051d5760a06020949361133e869586806101a0510191840101611572565b606084015201516080820152815201940193611217565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519060a0820182811067ffffffffffffffff82111761135557604052565b604051906060820182811067ffffffffffffffff82111761135557604052565b604051906040820182811067ffffffffffffffff82111761135557604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761135557604052565b67ffffffffffffffff811161135557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261051d5760043567ffffffffffffffff811161051d578160238201121561051d578060040135906114bb61010083611428565b928284526024838301011161051d5781600092602460209301838601378301015290565b60005b8381106114f25750506000910152565b81810151838201526020016114e2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361153e815180928187528780880191016114df565b0116010190565b67ffffffffffffffff81116113555760051b60200190565b519067ffffffffffffffff8216820361051d57565b81601f8201121561051d57805161158b61010082611428565b928184526020828401011161051d576115aa91602080850191016114df565b90565b519073ffffffffffffffffffffffffffffffffffffffff8216820361051d57565b51907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361051d5756fea164736f6c634300081a000a",
}
var ReportCodecABI = ReportCodecMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go b/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go
index 268b49b4f96..df8a92d0510 100644
--- a/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go
+++ b/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go
@@ -59,8 +59,8 @@ type RMNHomeVersionedConfig struct {
}
var RMNHomeMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"gotConfigDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"DigestNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateOffchainPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicatePeerId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoOpStateTransitionNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughObservers\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfBoundsNodesLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfBoundsObserverNodeIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RevokingZeroDigestNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ActiveConfigRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"CandidateConfigRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigPromoted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"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\":[],\"name\":\"getActiveDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"internalType\":\"structRMNHome.VersionedConfig\",\"name\":\"activeConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"internalType\":\"structRMNHome.VersionedConfig\",\"name\":\"candidateConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCandidateDigest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"internalType\":\"structRMNHome.VersionedConfig\",\"name\":\"versionedConfig\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"ok\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfigDigests\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"activeConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"digestToPromote\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"digestToRevoke\",\"type\":\"bytes32\"}],\"name\":\"promoteCandidateAndRevokeActive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"revokeCandidate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"peerId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"offchainPublicKey\",\"type\":\"bytes32\"}],\"internalType\":\"structRMNHome.Node[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"digestToOverwrite\",\"type\":\"bytes32\"}],\"name\":\"setCandidate\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"newConfigDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"observerNodesBitmap\",\"type\":\"uint256\"}],\"internalType\":\"structRMNHome.SourceChain[]\",\"name\":\"sourceChains\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structRMNHome.DynamicConfig\",\"name\":\"newDynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"currentDigest\",\"type\":\"bytes32\"}],\"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\"}]",
- Bin: "0x6080604052600e80546001600160401b03191690553480156200002157600080fd5b50336000816200004457604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0384811691909117909155811615620000775762000077816200007f565b5050620000f9565b336001600160a01b03821603620000a957604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6128cb80620001096000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80636dd5b69d1161008c5780638c76967f116100665780638c76967f146101d45780638da5cb5b146101e7578063f2fde38b1461020f578063fb4022d41461022257600080fd5b80636dd5b69d14610196578063736be802146101b757806379ba5097146101cc57600080fd5b80633567e6b4116100bd5780633567e6b41461015b57806338354c5c14610178578063635079561461018057600080fd5b8063118dbac5146100e4578063123e65db1461010a578063181f5a7714610112575b600080fd5b6100f76100f236600461186a565b610235565b6040519081526020015b60405180910390f35b6100f7610418565b61014e6040518060400160405280601181526020017f524d4e486f6d6520312e362e302d64657600000000000000000000000000000081525081565b6040516101019190611945565b610163610457565b60408051928352602083019190915201610101565b6100f76104d8565b6101886104f7565b604051610101929190611ab0565b6101a96101a4366004611ad5565b610a79565b604051610101929190611aee565b6101ca6101c5366004611b12565b610d5d565b005b6101ca610e79565b6101ca6101e2366004611b57565b610f47565b60015460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610101565b6101ca61021d366004611b79565b61115a565b6101ca610230366004611ad5565b61116e565b600061023f61128a565b61025961024b85611d2b565b61025485611e2c565b6112dd565b60006102636104d8565b90508281146102ad576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018490526044015b60405180910390fd5b80156102df5760405183907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a25b600e80546000919082906102f89063ffffffff16611f41565b91906101000a81548163ffffffff021916908363ffffffff160217905590506103408660405160200161032b91906120ec565b60405160208183030381529060405282611455565b600e54909350600090600290640100000000900463ffffffff1660011863ffffffff1660028110610373576103736120ff565b600602016001810185905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8416178155905086600282016103bd828261234c565b50869050600482016103cf828261254b565b905050837ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf08389896040516104069392919061278f565b60405180910390a25050509392505050565b60006002610434600e5463ffffffff6401000000009091041690565b63ffffffff166002811061044a5761044a6120ff565b6006020160010154905090565b6000806002610474600e5463ffffffff6401000000009091041690565b63ffffffff166002811061048a5761048a6120ff565b600602016001015460026104b2600e54600163ffffffff640100000000909204919091161890565b63ffffffff16600281106104c8576104c86120ff565b6006020160010154915091509091565b600e54600090600290640100000000900463ffffffff16600118610434565b6104ff6117ec565b6105076117ec565b60006002610523600e5463ffffffff6401000000009091041690565b63ffffffff1660028110610539576105396120ff565b6040805160808101825260069290920292909201805463ffffffff16825260018101546020808401919091528351600283018054606093810283018401875282870181815295969495948701949293919284929091849160009085015b828210156105dc57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610596565b5050505081526020016001820180546105f490612193565b80601f016020809104026020016040519081016040528092919081815260200182805461062090612193565b801561066d5780601f106106425761010080835404028352916020019161066d565b820191906000526020600020905b81548152906001019060200180831161065057829003601f168201915b50505050508152505081526020016004820160405180604001604052908160008201805480602002602001604051908101604052809291908181526020016000905b8282101561070f5760008481526020908190206040805160608101825260028602909201805467ffffffffffffffff80821685526801000000000000000090910416838501526001908101549183019190915290835290920191016106af565b50505050815260200160018201805461072790612193565b80601f016020809104026020016040519081016040528092919081815260200182805461075390612193565b80156107a05780601f10610775576101008083540402835291602001916107a0565b820191906000526020600020905b81548152906001019060200180831161078357829003601f168201915b505050919092525050509052506020810151909150156107be578092505b600e54600090600290640100000000900463ffffffff1660011863ffffffff16600281106107ee576107ee6120ff565b6040805160808101825260069290920292909201805463ffffffff16825260018101546020808401919091528351600283018054606093810283018401875282870181815295969495948701949293919284929091849160009085015b828210156108915783829060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508152602001906001019061084b565b5050505081526020016001820180546108a990612193565b80601f01602080910402602001604051908101604052809291908181526020018280546108d590612193565b80156109225780601f106108f757610100808354040283529160200191610922565b820191906000526020600020905b81548152906001019060200180831161090557829003601f168201915b50505050508152505081526020016004820160405180604001604052908160008201805480602002602001604051908101604052809291908181526020016000905b828210156109c45760008481526020908190206040805160608101825260028602909201805467ffffffffffffffff8082168552680100000000000000009091041683850152600190810154918301919091529083529092019101610964565b5050505081526020016001820180546109dc90612193565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0890612193565b8015610a555780601f10610a2a57610100808354040283529160200191610a55565b820191906000526020600020905b815481529060010190602001808311610a3857829003601f168201915b50505091909252505050905250602081015190915015610a73578092505b50509091565b610a816117ec565b6000805b6002811015610d52578360028260028110610aa257610aa26120ff565b6006020160010154148015610ab657508315155b15610d4a5760028160028110610ace57610ace6120ff565b6040805160808101825260069290920292909201805463ffffffff16825260018082015460208085019190915284516002840180546060938102830184018852828801818152959794969588958701948492849160009085015b82821015610b6e57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610b28565b505050508152602001600182018054610b8690612193565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb290612193565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b50505050508152505081526020016004820160405180604001604052908160008201805480602002602001604051908101604052809291908181526020016000905b82821015610ca15760008481526020908190206040805160608101825260028602909201805467ffffffffffffffff8082168552680100000000000000009091041683850152600190810154918301919091529083529092019101610c41565b505050508152602001600182018054610cb990612193565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce590612193565b8015610d325780601f10610d0757610100808354040283529160200191610d32565b820191906000526020600020905b815481529060010190602001808311610d1557829003601f168201915b50505091909252505050905250969095509350505050565b600101610a85565b509092600092509050565b610d6561128a565b60005b6002811015610e3f578160028260028110610d8557610d856120ff565b6006020160010154148015610d9957508115155b15610e3757610dd0610daa84611e2c565b60028360028110610dbd57610dbd6120ff565b600602016002016000018054905061155d565b8260028260028110610de457610de46120ff565b600602016004018181610df7919061254b565b905050817f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e629484604051610e2a91906127ca565b60405180910390a2505050565b600101610d68565b506040517fd0b2c031000000000000000000000000000000000000000000000000000000008152600481018290526024016102a4565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610eca576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f4f61128a565b81158015610f5b575080155b15610f92576040517f7b4d1e4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54600163ffffffff6401000000009092048216181682600282818110610fbc57610fbc6120ff565b6006020160010154146110225760028160028110610fdc57610fdc6120ff565b6006020160010154836040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016102a4929190918252602082015260400190565b6000600261103e600e5463ffffffff6401000000009091041690565b63ffffffff1660028110611054576110546120ff565b600602019050828160010154146110a75760018101546040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018490526044016102a4565b6000600180830191909155600e805463ffffffff6401000000008083048216909418169092027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117905582156111295760405183907f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b890600090a25b60405184907ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e90600090a250505050565b61116261128a565b61116b81611728565b50565b61117661128a565b806111ad576040517f0849d8cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54600163ffffffff64010000000090920482161816816002828181106111d7576111d76120ff565b60060201600101541461123d57600281600281106111f7576111f76120ff565b6006020160010154826040517f93df584c0000000000000000000000000000000000000000000000000000000081526004016102a4929190918252602082015260400190565b60405182907f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b90600090a26002816002811061127b5761127b6120ff565b60060201600101600090555050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112db576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b815151610100101561131b576040517faf26d5e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251518110156114455760006113358260016127dd565b90505b83515181101561143c578351805182908110611356576113566120ff565b60200260200101516000015184600001518381518110611378576113786120ff565b602002602001015160000151036113bb576040517f221a8ae800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83518051829081106113cf576113cf6120ff565b602002602001015160200151846000015183815181106113f1576113f16120ff565b60200260200101516020015103611434576040517fae00651d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101611338565b5060010161131e565b50610e758183600001515161155d565b604080517f45564d00000000000000000000000000000000000000000000000000000000006020820152469181019190915230606082015263ffffffff821660808201526000907dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526114fc9186906020016127f0565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120167e0b0000000000000000000000000000000000000000000000000000000000001790505b92915050565b81515160005b8181101561172257600084600001518281518110611583576115836120ff565b60200260200101519050600082600161159c91906127dd565b90505b8381101561161f5785518051829081106115bb576115bb6120ff565b60200260200101516000015167ffffffffffffffff16826000015167ffffffffffffffff1603611617576040517f3857f84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60010161159f565b506040810151806116328661010061281f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff901c82161461168e576040517f2847b60600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81156116b6576116a260018361281f565b909116906116af81612832565b9050611691565b60208301516116c690600261286a565b6116d1906001612896565b67ffffffffffffffff16811015611714576040517fa804bcb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050806001019050611563565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff821603611777576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6040518060800160405280600063ffffffff1681526020016000801916815260200161182b604051806040016040528060608152602001606081525090565b815260200161184d604051806040016040528060608152602001606081525090565b905290565b60006040828403121561186457600080fd5b50919050565b60008060006060848603121561187f57600080fd5b833567ffffffffffffffff8082111561189757600080fd5b6118a387838801611852565b945060208601359150808211156118b957600080fd5b506118c686828701611852565b925050604084013590509250925092565b60005b838110156118f25781810151838201526020016118da565b50506000910152565b600081518084526119138160208601602086016118d7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061195860208301846118fb565b9392505050565b8051604080845281518482018190526000926060916020918201918388019190865b828110156119bb578451805167ffffffffffffffff9081168652838201511683860152870151878501529381019392850192600101611981565b50808801519550888303818a015250506119d581856118fb565b979650505050505050565b63ffffffff81511682526000602080830151818501526040808401516080604087015260c0860181516040608089015281815180845260e08a0191508683019350600092505b80831015611a4f5783518051835287015187830152928601926001929092019190850190611a26565b50948301518886037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800160a08a015294611a8981876118fb565b9550505050505060608301518482036060860152611aa7828261195f565b95945050505050565b604081526000611ac360408301856119e0565b8281036020840152611aa781856119e0565b600060208284031215611ae757600080fd5b5035919050565b604081526000611b0160408301856119e0565b905082151560208301529392505050565b60008060408385031215611b2557600080fd5b823567ffffffffffffffff811115611b3c57600080fd5b611b4885828601611852565b95602094909401359450505050565b60008060408385031215611b6a57600080fd5b50508035926020909101359150565b600060208284031215611b8b57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461195857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611c0157611c01611baf565b60405290565b6040516060810167ffffffffffffffff81118282101715611c0157611c01611baf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611c7157611c71611baf565b604052919050565b600067ffffffffffffffff821115611c9357611c93611baf565b5060051b60200190565b600082601f830112611cae57600080fd5b813567ffffffffffffffff811115611cc857611cc8611baf565b611cf960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611c2a565b818152846020838601011115611d0e57600080fd5b816020850160208301376000918101602001919091529392505050565b60006040808336031215611d3e57600080fd5b611d46611bde565b833567ffffffffffffffff80821115611d5e57600080fd5b9085019036601f830112611d7157600080fd5b81356020611d86611d8183611c79565b611c2a565b82815260069290921b84018101918181019036841115611da557600080fd5b948201945b83861015611de557878636031215611dc25760008081fd5b611dca611bde565b86358152838701358482015282529487019490820190611daa565b86525087810135955082861115611dfb57600080fd5b611e0736878a01611c9d565b90850152509195945050505050565b67ffffffffffffffff8116811461116b57600080fd5b60006040808336031215611e3f57600080fd5b611e47611bde565b833567ffffffffffffffff80821115611e5f57600080fd5b9085019036601f830112611e7257600080fd5b81356020611e82611d8183611c79565b82815260609283028501820192828201919036851115611ea157600080fd5b958301955b84871015611efb57808736031215611ebe5760008081fd5b611ec6611c07565b8735611ed181611e16565b815287850135611ee081611e16565b81860152878a01358a82015283529586019591830191611ea6565b5086525087810135955082861115611dfb57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff808316818103611f5a57611f5a611f12565b6001019392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f9957600080fd5b830160208101925035905067ffffffffffffffff811115611fb957600080fd5b803603821315611fc857600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6000604080840183357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811261205157600080fd5b8401602081810191359067ffffffffffffffff82111561207057600080fd5b8160061b360383131561208257600080fd5b6040885292819052909160009190606088015b828410156120bb5784358152818501358282015293850193600193909301928501612095565b6120c86020890189611f64565b9650945088810360208a01526120df818787611fcf565b9998505050505050505050565b6020815260006119586020830184612018565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261216357600080fd5b83018035915067ffffffffffffffff82111561217e57600080fd5b602001915036819003821315611fc857600080fd5b600181811c908216806121a757607f821691505b602082108103611864577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561222c576000816000526020600020601f850160051c810160208610156122095750805b601f850160051c820191505b8181101561222857828155600101612215565b5050505b505050565b67ffffffffffffffff83111561224957612249611baf565b61225d836122578354612193565b836121e0565b6000601f8411600181146122af57600085156122795750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355612345565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156122fe57868501358255602094850194600190920191016122de565b5086821015612339577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301811261237e57600080fd5b8201803567ffffffffffffffff81111561239757600080fd5b6020820191508060061b36038213156123af57600080fd5b680100000000000000008111156123c8576123c8611baf565b8254818455808210156124555760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461240957612409611f12565b808416841461241a5761241a611f12565b5060008560005260206000208360011b81018560011b820191505b80821015612450578282558284830155600282019150612435565b505050505b5060008381526020902060005b8281101561248e5783358255602084013560018301556040939093019260029190910190600101612462565b5050505061249f602083018361212e565b611722818360018601612231565b81356124b881611e16565b67ffffffffffffffff811690508154817fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000821617835560208401356124fc81611e16565b6fffffffffffffffff00000000000000008160401b16837fffffffffffffffffffffffffffffffff00000000000000000000000000000000841617178455505050604082013560018201555050565b81357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301811261257d57600080fd5b8201803567ffffffffffffffff81111561259657600080fd5b602082019150606080820236038313156125af57600080fd5b680100000000000000008211156125c8576125c8611baf565b8354828555808310156126555760017f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808316831461260957612609611f12565b808516851461261a5761261a611f12565b5060008660005260206000208360011b81018660011b820191505b80821015612650578282558284830155600282019150612635565b505050505b5060008481526020902060005b838110156126875761267485836124ad565b9382019360029190910190600101612662565b505050505061249f602083018361212e565b6000604080840183357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18536030181126126d257600080fd5b8401602081810191359067ffffffffffffffff808311156126f257600080fd5b6060808402360385131561270557600080fd5b60408a529483905292936000939060608a015b8486101561275c57863561272b81611e16565b831681528684013561273c81611e16565b831681850152868801358882015295810195600195909501948101612718565b61276960208b018b611f64565b985096508a810360208c0152612780818989611fcf565b9b9a5050505050505050505050565b63ffffffff841681526060602082015260006127ae6060830185612018565b82810360408401526127c08185612699565b9695505050505050565b6020815260006119586020830184612699565b8082018082111561155757611557611f12565b600083516128028184602088016118d7565b8351908301906128168183602088016118d7565b01949350505050565b8181038181111561155757611557611f12565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361286357612863611f12565b5060010190565b67ffffffffffffffff81811683821602808216919082811461288e5761288e611f12565b505092915050565b67ffffffffffffffff8181168382160190808211156128b7576128b7611f12565b509291505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveDigest\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"activeConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"candidateConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCandidateDigest\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"versionedConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"ok\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfigDigests\",\"inputs\":[],\"outputs\":[{\"name\":\"activeConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"promoteCandidateAndRevokeActive\",\"inputs\":[{\"name\":\"digestToPromote\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestToRevoke\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeCandidate\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCandidate\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"digestToOverwrite\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"newConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"newDynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"currentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ActiveConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CandidateConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigPromoted\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"gotConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DigestNotFound\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DuplicateOffchainPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicatePeerId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateSourceChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoOpStateTransitionNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughObservers\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBoundsNodesLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBoundsObserverNodeIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RevokingZeroDigestNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x60808060405234604d573315603c57600180546001600160a01b03191633179055600e80546001600160401b031916905561262690816100538239f35b639b15e16f60e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063118dbac514610904578063123e65db146108ae578063181f5a77146108315780633567e6b4146107b757806338354c5c1461077657806363507956146106985780636dd5b69d1461063b578063736be802146105b457806379ba5097146104cb5780638c76967f146103255780638da5cb5b146102d3578063f2fde38b146101e05763fb4022d4146100ab57600080fd5b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576004356100e56123b4565b80156101b15763ffffffff610105600163ffffffff600e5460201c161890565b1660028110159081610152576006600391020191825481810361018157507f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b600080a26101525760009055005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f0849d8cc0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043573ffffffffffffffffffffffffffffffffffffffff81168091036101db576102386123b4565b3381146102a957807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576004356024356103626123b4565b8115806104c3575b6104995763ffffffff610388600163ffffffff600e5460201c161890565b1660028110156101525760060260030154828103610467575063ffffffff600e5460201c166002811015610152576006026003018054828103610467575060009055600e547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff67ffffffff00000000600163ffffffff8460201c161860201b16911617600e558061043c575b507ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e600080a2005b7f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8600080a281610414565b90507f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f7b4d1e4f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50801561036a565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760005473ffffffffffffffffffffffffffffffffffffffff8116330361058a577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043567ffffffffffffffff81116101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101db576106399061062d6123b4565b60243590600401611f4a565b005b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5761068c610678600435611eea565b6040519283926040845260408401906116d2565b90151560208301520390f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576106cf611ca0565b6106d7611ca0565b9063ffffffff600e5460201c1660028110156101525760066106fc9102600201611d92565b602081015161076e575b50600e5460201c63ffffffff166001186002811015610152576107549261073560066107629302600201611d92565b6020810151610766575b506040519384936040855260408501906116d2565b9083820360208501526116d2565b0390f35b90508461073f565b905082610706565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760206107af611c65565b604051908152f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5763ffffffff600e5460201c1660028110156101525760060260030154600e5460201c63ffffffff16600118906002821015610152576003600660409302015482519182526020820152f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576107626040805190610872818361162b565b601182527f524d4e486f6d6520312e362e302d64657600000000000000000000000000000060208301525191829160208352602083019061168f565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5763ffffffff600e5460201c1660028110156101525760036006602092020154604051908152f35b346101db5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043567ffffffffffffffff81116101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101db5767ffffffffffffffff602435116101db57602435360360407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101db576109b96123b4565b6040516000916109c8826115a8565b67ffffffffffffffff8460040135116115a4578360040135840190366023830112156115a0576109fb600483013561180a565b610a08604051918261162b565b6004830135808252602082019060061b84016024013681116112ad5760248501915b81831061156f575050508352602485013567ffffffffffffffff811161156b57610a5a9060043691880101611822565b6020840152610a6e366024356004016118ac565b94610100845151116115435790919484955b845151871015610b765760018701808811610b49575b85518051821015610b3c5788610aab916123ff565b5151610ab88288516123ff565b515114610b14576020610acc8988516123ff565b5101516020610adc8389516123ff565b51015114610aec57600101610a96565b6004877fae00651d000000000000000000000000000000000000000000000000000000008152fd5b6004877f221a8ae8000000000000000000000000000000000000000000000000000000008152fd5b5050600190960195610a80565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b949390610b8591515190612413565b610b8d611c65565b6044358103611513576114e7575b600e549363ffffffff85169463ffffffff86146114ba5763ffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000095969701169384911617600e557dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610ccc610cfa6020830160208152610c5784610c2b604082018a600401611a26565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810186528561162b565b602060405191818301957f45564d000000000000000000000000000000000000000000000000000000000087524660408501523060608501528a608085015260808452610ca560a08561162b565b604051958694610cbd858701998a925192839161166c565b8501915180938584019061166c565b0101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261162b565b519020167e0b0000000000000000000000000000000000000000000000000000000000001793610d35600163ffffffff600e5460201c161890565b600281101561148d576006029182600201866003850155857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055600483017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd85360301856004013512156112a95767ffffffffffffffff6004830135116112a957600482013560061b360360248301136112a9576801000000000000000060048301351161127c578054600483013580835581116113ff575b508752602087208790602483015b600484013583106113db575050505060058201610e246024850185600401611ad9565b9067ffffffffffffffff82116113ae578190610e408454611b2a565b601f811161135e575b508990601f83116001146112bc578a926112b1575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b60068201907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd6024356004013591018112156112ad57602435019060048201359167ffffffffffffffff83116112a95760240160608302360381136112a95768010000000000000000831161127c5781548383558084106111ca575b509087526020872087915b838310611150575050505060070191610f396024803501602435600401611ad9565b67ffffffffffffffff819592951161112357610f558254611b2a565b601f81116110de575b5090859392918760209890601f831160011461101a57907ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf096978361100f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b611004610ff160405193849384526060898501526060840190600401611a26565b8281036040840152602435600401611b92565b0390a2604051908152f35b013590508980610f9e565b96907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083168489528a8920985b8181106110c45750917ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf097989184600195941061108c575b505050811b019055610fd0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905589808061107f565b828401358a556001909901988a9850918b01918b01611047565b82885260208820601f830160051c81019160208410611119575b601f0160051c01905b81811061110e5750610f5e565b888155600101611101565b90915081906110f8565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600260608267ffffffffffffffff611169600195611b7d565b168554907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff00000000000000006111ab60208601611b7d565b60401b1692161717855560408101358486015501920192019190610f17565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116810361124f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416840361124f57828952602089209060011b8101908460011b015b81811061123d5750610f0c565b808a600292558a600182015501611230565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8780fd5b8680fd5b013590508980610e5e565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01691848b5260208b20928b5b818110611346575090846001959493921061130e575b505050811b019055610e90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055898080611301565b919360206001819287870135815501950192016112eb565b909150838a5260208a20601f840160051c810191602085106113a4575b90601f859493920160051c01905b8181106113965750610e49565b8b8155849350600101611389565b909150819061137b565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60016002604083600494358655602081013584870155019301930192919050610e01565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116810361124f5760048301357f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116900361124f57818952602089209060011b810190600484013560011b015b81811061147b5750610df3565b6002908a81558a60018201550161146e565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6044357f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b8480a2610b9b565b7f93df584c0000000000000000000000000000000000000000000000000000000084526004526044803560245283fd5b6004857faf26d5e3000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b6040833603126112a95760206040918251611589816115a8565b853581528286013583820152815201920191610a2a565b8380fd5b8280fd5b6040810190811067ffffffffffffffff8211176115c457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176115c457604052565b6080810190811067ffffffffffffffff8211176115c457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176115c457604052565b60005b83811061167f5750506000910152565b818101518382015260200161166f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936116cb8151809281875287808801910161166c565b0116010190565b91909163ffffffff81511683526020810151602084015260408101516080604085015260c0840190805191604060808701528251809152602060e0870193019060005b8181106117e85750505060609160206117599201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808783030160a088015261168f565b910151926060818303910152604081019083519160408252825180915260206060830193019060005b8181106117a65750505060206117a39394015190602081840391015261168f565b90565b909193602060606001926040885167ffffffffffffffff815116835267ffffffffffffffff858201511685840152015160408201520195019101919091611782565b8251805186526020908101518187015260409095019490920191600101611715565b67ffffffffffffffff81116115c45760051b60200190565b81601f820112156101db5780359067ffffffffffffffff82116115c45760405192611875601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018561162b565b828452602083830101116101db57816000926020809301838601378301015290565b359067ffffffffffffffff821682036101db57565b91906040838203126101db57604051906118c5826115a8565b8193803567ffffffffffffffff81116101db57810182601f820112156101db5780356118f08161180a565b916118fe604051938461162b565b818352602060608185019302820101908582116101db57602001915b81831061194d57505050835260208101359167ffffffffffffffff83116101db576020926119489201611822565b910152565b6060838703126101db576020606091604051611968816115f3565b61197186611897565b815261197e838701611897565b838201526040860135604082015281520192019161191a565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156101db57016020813591019167ffffffffffffffff82116101db5781360383136101db57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9190604081019083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156101db5784016020813591019267ffffffffffffffff82116101db578160061b360384136101db578190604084525260608201929060005b818110611ab957505050611aab8460206117a395960190611997565b9160208185039101526119e7565b823585526020808401359086015260409485019490920191600101611a8f565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101db570180359067ffffffffffffffff82116101db576020019181360383136101db57565b90600182811c92168015611b73575b6020831014611b4457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611b39565b3567ffffffffffffffff811681036101db5790565b9190604081019083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156101db5784016020813591019267ffffffffffffffff82116101db5760608202360384136101db578190604084525260608201929060005b818110611c1757505050611aab8460206117a395960190611997565b90919360608060019267ffffffffffffffff611c3289611897565b16815267ffffffffffffffff611c4a60208a01611897565b16602082015260408881013590820152019501929101611bfb565b600e5460201c63ffffffff166001186002811015610152576006026003015490565b60405190611c94826115a8565b60606020838281520152565b60405190611cad8261160f565b816000815260006020820152611cc1611c87565b60408201526060611948611c87565b9060405191826000825492611ce484611b2a565b8084529360018116908115611d525750600114611d0b575b50611d099250038361162b565b565b90506000929192526020600020906000915b818310611d36575050906020611d099282010138611cfc565b6020919350806001915483858901015201910190918492611d1d565b60209350611d099592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611cfc565b9060405191611da08361160f565b8263ffffffff8254168152600182015460208201526002820160405190611dc6826115a8565b8054611dd18161180a565b91611ddf604051938461162b565b818352602083019060005260206000206000915b838310611ebd57505050508152611e0c60038401611cd0565b60208201526040820152600482019160405192611e28846115a8565b8054611e338161180a565b91611e41604051938461162b565b818352602083019060005260206000206000915b838310611e7b5750505050600560609392611e7292865201611cd0565b60208401520152565b60026020600192604051611e8e816115f3565b67ffffffffffffffff8654818116835260401c1683820152848601546040820152815201920192019190611e55565b60026020600192604051611ed0816115a8565b855481528486015483820152815201920192019190611df3565b611ef2611ca0565b9060005b6002811015611f4257600060068202908360038301541480611f39575b611f21575050600101611ef6565b91509150611f33925050600201611d92565b90600190565b50831515611f13565b505090600090565b9060005b60028110156123865760006006820290836003830154148061237d575b611f79575050600101611f4e565b90915092919250611f976004820154611f9236856118ac565b612413565b6000906006810183357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156115a05784019081359167ffffffffffffffff831161156b57602001606083023603811361156b5768010000000000000000831161235057815483835580841061229e575b509084526020842084915b8383106122245750505050600701906120346020840184611ad9565b919067ffffffffffffffff83116121f75761204f8454611b2a565b601f81116121b2575b5081601f84116001146120ec57926120dc949281927f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e62949795926120e1575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b604051918291602083526020830190611b92565b0390a2565b013590503880612096565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841685845260208420935b81811061219a57509260019285927f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e629498966120dc989610612162575b505050811b0190556120c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080612155565b91936020600181928787013581550195019201612119565b84835260208320601f850160051c810191602086106121ed575b601f0160051c01905b8181106121e25750612058565b8381556001016121d5565b90915081906121cc565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600260608267ffffffffffffffff61223d600195611b7d565b168554907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff000000000000000061227f60208601611b7d565b60401b1692161717855560408101358486015501920192019190612018565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103612323577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416840361232357828652602086209060011b8101908460011b015b818110612311575061200d565b80876002925587600182015501612304565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50831515611f6b565b507fd0b2c0310000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff6001541633036123d557565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b80518210156101525760209160051b010190565b908151519160005b8381106124285750505050565b6124338183516123ff565b5160018201808311612508575b8581106125bf575060408101519084610100036101008111612508577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83911c81160361259557816000925b61253757506020015160011b6801fffffffffffffffe67fffffffffffffffe8216911681036125085760010167ffffffffffffffff81116125085767ffffffffffffffff16116124de5760010161241b565b7fa804bcb30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908082116125085716917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461250857600101918061248c565b7f2847b6060000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff82511667ffffffffffffffff6125df8387516123ff565b515116146125ef57600101612440565b7f3857f84d0000000000000000000000000000000000000000000000000000000060005260046000fdfea164736f6c634300081a000a",
}
var RMNHomeABI = RMNHomeMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/rmn_proxy_contract/rmn_proxy_contract.go b/core/gethwrappers/ccip/generated/rmn_proxy_contract/rmn_proxy_contract.go
index 18fd9898d81..6bf174bfef1 100644
--- a/core/gethwrappers/ccip/generated/rmn_proxy_contract/rmn_proxy_contract.go
+++ b/core/gethwrappers/ccip/generated/rmn_proxy_contract/rmn_proxy_contract.go
@@ -30,17 +30,17 @@ var (
_ = abi.ConvertType
)
-var RMNProxyContractMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"arm\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"arm\",\"type\":\"address\"}],\"name\":\"ARMSet\",\"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\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getARM\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"arm\",\"type\":\"address\"}],\"name\":\"setARM\",\"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: "0x608060405234801561001057600080fd5b5060405161084138038061084183398101604081905261002f91610255565b33806000816100855760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156100b5576100b5816100cd565b5050506100c78161017660201b60201c565b50610285565b336001600160a01b038216036101255760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161007c565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61017e6101f9565b6001600160a01b0381166101a5576040516342bcdf7f60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fef31f568d741a833c6a9dc85a6e1c65e06fa772740d5dc94d1da21827a4e0cab9060200160405180910390a150565b6000546001600160a01b031633146102535760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161007c565b565b60006020828403121561026757600080fd5b81516001600160a01b038116811461027e57600080fd5b9392505050565b6105ad806102946000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806379ba50971161005057806379ba5097146101615780638da5cb5b14610169578063f2fde38b1461018757610072565b8063181f5a77146100bb5780632e90aa211461010d578063458fec3b1461014c575b60025473ffffffffffffffffffffffffffffffffffffffff16803b61009657600080fd5b366000803760008036600080855af13d6000803e80156100b5573d6000f35b503d6000fd5b6100f76040518060400160405280600e81526020017f41524d50726f787920312e302e3000000000000000000000000000000000000081525081565b60405161010491906104f6565b60405180910390f35b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610104565b61015f61015a366004610563565b61019a565b005b61015f610268565b60005473ffffffffffffffffffffffffffffffffffffffff16610127565b61015f610195366004610563565b61036a565b6101a261037e565b73ffffffffffffffffffffffffffffffffffffffff81166101ef576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fef31f568d741a833c6a9dc85a6e1c65e06fa772740d5dc94d1da21827a4e0cab9060200160405180910390a150565b60015473ffffffffffffffffffffffffffffffffffffffff1633146102ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61037261037e565b61037b81610401565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016102e5565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016102e5565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006020808352835180602085015260005b8181101561052457858101830151858201604001528201610508565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60006020828403121561057557600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461059957600080fd5b939250505056fea164736f6c6343000818000a",
+var RMNProxyMetaData = &bind.MetaData{
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"arm\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getARM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setARM\",\"inputs\":[{\"name\":\"arm\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ARMSet\",\"inputs\":[{\"name\":\"arm\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x60803461012f5760009061079a3881900390601f8201601f191683016001600160401b0381118482101761011b579180849260209460405283398101031261011757516001600160a01b03811691908290036101145733156100cf5780546001600160a01b0319163317905580156100be57600280546001600160a01b031916821790556040519081527fef31f568d741a833c6a9dc85a6e1c65e06fa772740d5dc94d1da21827a4e0cab90602090a160405161066590816101358239f35b6342bcdf7f60e11b60005260046000fd5b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f00000000000000006044820152606490fd5b80fd5b5080fd5b634e487b7160e01b85526041600452602485fd5b600080fdfe6080604052600436101561001a575b3415610598575b600080fd5b60003560e01c8063181f5a771461007a5780632e90aa2114610075578063458fec3b1461007057806379ba50971461006b5780638da5cb5b146100665763f2fde38b0361000e5761049b565b610449565b6102ee565b61023b565b61019c565b346100155760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261001557604051604081019080821067ffffffffffffffff8311176101055761010191604052600e81527f41524d50726f787920312e302e30000000000000000000000000000000000000602082015260405191829182610134565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190916020815282519283602083015260005b8481106101865750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201610147565b346100155760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261001557602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60209101126100155760043573ffffffffffffffffffffffffffffffffffffffff811681036100155790565b346100155773ffffffffffffffffffffffffffffffffffffffff61025e366101ee565b6102666105d9565b1680156102c4576020817fef31f568d741a833c6a9dc85a6e1c65e06fa772740d5dc94d1da21827a4e0cab927fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255604051908152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100155760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100155773ffffffffffffffffffffffffffffffffffffffff6001541633036103eb5760005473ffffffffffffffffffffffffffffffffffffffff16600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556103ac7fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b73ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152fd5b346100155760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261001557602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346100155773ffffffffffffffffffffffffffffffffffffffff6104be366101ee565b6104c66105d9565b1633811461053a57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015573ffffffffffffffffffffffffffffffffffffffff8060005416167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152fd5b73ffffffffffffffffffffffffffffffffffffffff60025416803b15610015576000809136828037818036925af13d6000803e6105d4573d6000fd5b3d6000f35b73ffffffffffffffffffffffffffffffffffffffff6000541633036105fa57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152fdfea164736f6c634300081a000a",
}
-var RMNProxyContractABI = RMNProxyContractMetaData.ABI
+var RMNProxyABI = RMNProxyMetaData.ABI
-var RMNProxyContractBin = RMNProxyContractMetaData.Bin
+var RMNProxyBin = RMNProxyMetaData.Bin
-func DeployRMNProxyContract(auth *bind.TransactOpts, backend bind.ContractBackend, arm common.Address) (common.Address, *types.Transaction, *RMNProxyContract, error) {
- parsed, err := RMNProxyContractMetaData.GetAbi()
+func DeployRMNProxy(auth *bind.TransactOpts, backend bind.ContractBackend, arm common.Address) (common.Address, *types.Transaction, *RMNProxy, error) {
+ parsed, err := RMNProxyMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -48,132 +48,132 @@ func DeployRMNProxyContract(auth *bind.TransactOpts, backend bind.ContractBacken
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RMNProxyContractBin), backend, arm)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RMNProxyBin), backend, arm)
if err != nil {
return common.Address{}, nil, nil, err
}
- return address, tx, &RMNProxyContract{address: address, abi: *parsed, RMNProxyContractCaller: RMNProxyContractCaller{contract: contract}, RMNProxyContractTransactor: RMNProxyContractTransactor{contract: contract}, RMNProxyContractFilterer: RMNProxyContractFilterer{contract: contract}}, nil
+ return address, tx, &RMNProxy{address: address, abi: *parsed, RMNProxyCaller: RMNProxyCaller{contract: contract}, RMNProxyTransactor: RMNProxyTransactor{contract: contract}, RMNProxyFilterer: RMNProxyFilterer{contract: contract}}, nil
}
-type RMNProxyContract struct {
+type RMNProxy struct {
address common.Address
abi abi.ABI
- RMNProxyContractCaller
- RMNProxyContractTransactor
- RMNProxyContractFilterer
+ RMNProxyCaller
+ RMNProxyTransactor
+ RMNProxyFilterer
}
-type RMNProxyContractCaller struct {
+type RMNProxyCaller struct {
contract *bind.BoundContract
}
-type RMNProxyContractTransactor struct {
+type RMNProxyTransactor struct {
contract *bind.BoundContract
}
-type RMNProxyContractFilterer struct {
+type RMNProxyFilterer struct {
contract *bind.BoundContract
}
-type RMNProxyContractSession struct {
- Contract *RMNProxyContract
+type RMNProxySession struct {
+ Contract *RMNProxy
CallOpts bind.CallOpts
TransactOpts bind.TransactOpts
}
-type RMNProxyContractCallerSession struct {
- Contract *RMNProxyContractCaller
+type RMNProxyCallerSession struct {
+ Contract *RMNProxyCaller
CallOpts bind.CallOpts
}
-type RMNProxyContractTransactorSession struct {
- Contract *RMNProxyContractTransactor
+type RMNProxyTransactorSession struct {
+ Contract *RMNProxyTransactor
TransactOpts bind.TransactOpts
}
-type RMNProxyContractRaw struct {
- Contract *RMNProxyContract
+type RMNProxyRaw struct {
+ Contract *RMNProxy
}
-type RMNProxyContractCallerRaw struct {
- Contract *RMNProxyContractCaller
+type RMNProxyCallerRaw struct {
+ Contract *RMNProxyCaller
}
-type RMNProxyContractTransactorRaw struct {
- Contract *RMNProxyContractTransactor
+type RMNProxyTransactorRaw struct {
+ Contract *RMNProxyTransactor
}
-func NewRMNProxyContract(address common.Address, backend bind.ContractBackend) (*RMNProxyContract, error) {
- abi, err := abi.JSON(strings.NewReader(RMNProxyContractABI))
+func NewRMNProxy(address common.Address, backend bind.ContractBackend) (*RMNProxy, error) {
+ abi, err := abi.JSON(strings.NewReader(RMNProxyABI))
if err != nil {
return nil, err
}
- contract, err := bindRMNProxyContract(address, backend, backend, backend)
+ contract, err := bindRMNProxy(address, backend, backend, backend)
if err != nil {
return nil, err
}
- return &RMNProxyContract{address: address, abi: abi, RMNProxyContractCaller: RMNProxyContractCaller{contract: contract}, RMNProxyContractTransactor: RMNProxyContractTransactor{contract: contract}, RMNProxyContractFilterer: RMNProxyContractFilterer{contract: contract}}, nil
+ return &RMNProxy{address: address, abi: abi, RMNProxyCaller: RMNProxyCaller{contract: contract}, RMNProxyTransactor: RMNProxyTransactor{contract: contract}, RMNProxyFilterer: RMNProxyFilterer{contract: contract}}, nil
}
-func NewRMNProxyContractCaller(address common.Address, caller bind.ContractCaller) (*RMNProxyContractCaller, error) {
- contract, err := bindRMNProxyContract(address, caller, nil, nil)
+func NewRMNProxyCaller(address common.Address, caller bind.ContractCaller) (*RMNProxyCaller, error) {
+ contract, err := bindRMNProxy(address, caller, nil, nil)
if err != nil {
return nil, err
}
- return &RMNProxyContractCaller{contract: contract}, nil
+ return &RMNProxyCaller{contract: contract}, nil
}
-func NewRMNProxyContractTransactor(address common.Address, transactor bind.ContractTransactor) (*RMNProxyContractTransactor, error) {
- contract, err := bindRMNProxyContract(address, nil, transactor, nil)
+func NewRMNProxyTransactor(address common.Address, transactor bind.ContractTransactor) (*RMNProxyTransactor, error) {
+ contract, err := bindRMNProxy(address, nil, transactor, nil)
if err != nil {
return nil, err
}
- return &RMNProxyContractTransactor{contract: contract}, nil
+ return &RMNProxyTransactor{contract: contract}, nil
}
-func NewRMNProxyContractFilterer(address common.Address, filterer bind.ContractFilterer) (*RMNProxyContractFilterer, error) {
- contract, err := bindRMNProxyContract(address, nil, nil, filterer)
+func NewRMNProxyFilterer(address common.Address, filterer bind.ContractFilterer) (*RMNProxyFilterer, error) {
+ contract, err := bindRMNProxy(address, nil, nil, filterer)
if err != nil {
return nil, err
}
- return &RMNProxyContractFilterer{contract: contract}, nil
+ return &RMNProxyFilterer{contract: contract}, nil
}
-func bindRMNProxyContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := RMNProxyContractMetaData.GetAbi()
+func bindRMNProxy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := RMNProxyMetaData.GetAbi()
if err != nil {
return nil, err
}
return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
}
-func (_RMNProxyContract *RMNProxyContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _RMNProxyContract.Contract.RMNProxyContractCaller.contract.Call(opts, result, method, params...)
+func (_RMNProxy *RMNProxyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _RMNProxy.Contract.RMNProxyCaller.contract.Call(opts, result, method, params...)
}
-func (_RMNProxyContract *RMNProxyContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.RMNProxyContractTransactor.contract.Transfer(opts)
+func (_RMNProxy *RMNProxyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _RMNProxy.Contract.RMNProxyTransactor.contract.Transfer(opts)
}
-func (_RMNProxyContract *RMNProxyContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.RMNProxyContractTransactor.contract.Transact(opts, method, params...)
+func (_RMNProxy *RMNProxyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _RMNProxy.Contract.RMNProxyTransactor.contract.Transact(opts, method, params...)
}
-func (_RMNProxyContract *RMNProxyContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _RMNProxyContract.Contract.contract.Call(opts, result, method, params...)
+func (_RMNProxy *RMNProxyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _RMNProxy.Contract.contract.Call(opts, result, method, params...)
}
-func (_RMNProxyContract *RMNProxyContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.contract.Transfer(opts)
+func (_RMNProxy *RMNProxyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _RMNProxy.Contract.contract.Transfer(opts)
}
-func (_RMNProxyContract *RMNProxyContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.contract.Transact(opts, method, params...)
+func (_RMNProxy *RMNProxyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _RMNProxy.Contract.contract.Transact(opts, method, params...)
}
-func (_RMNProxyContract *RMNProxyContractCaller) GetARM(opts *bind.CallOpts) (common.Address, error) {
+func (_RMNProxy *RMNProxyCaller) GetARM(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
- err := _RMNProxyContract.contract.Call(opts, &out, "getARM")
+ err := _RMNProxy.contract.Call(opts, &out, "getARM")
if err != nil {
return *new(common.Address), err
@@ -185,17 +185,17 @@ func (_RMNProxyContract *RMNProxyContractCaller) GetARM(opts *bind.CallOpts) (co
}
-func (_RMNProxyContract *RMNProxyContractSession) GetARM() (common.Address, error) {
- return _RMNProxyContract.Contract.GetARM(&_RMNProxyContract.CallOpts)
+func (_RMNProxy *RMNProxySession) GetARM() (common.Address, error) {
+ return _RMNProxy.Contract.GetARM(&_RMNProxy.CallOpts)
}
-func (_RMNProxyContract *RMNProxyContractCallerSession) GetARM() (common.Address, error) {
- return _RMNProxyContract.Contract.GetARM(&_RMNProxyContract.CallOpts)
+func (_RMNProxy *RMNProxyCallerSession) GetARM() (common.Address, error) {
+ return _RMNProxy.Contract.GetARM(&_RMNProxy.CallOpts)
}
-func (_RMNProxyContract *RMNProxyContractCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+func (_RMNProxy *RMNProxyCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
- err := _RMNProxyContract.contract.Call(opts, &out, "owner")
+ err := _RMNProxy.contract.Call(opts, &out, "owner")
if err != nil {
return *new(common.Address), err
@@ -207,17 +207,17 @@ func (_RMNProxyContract *RMNProxyContractCaller) Owner(opts *bind.CallOpts) (com
}
-func (_RMNProxyContract *RMNProxyContractSession) Owner() (common.Address, error) {
- return _RMNProxyContract.Contract.Owner(&_RMNProxyContract.CallOpts)
+func (_RMNProxy *RMNProxySession) Owner() (common.Address, error) {
+ return _RMNProxy.Contract.Owner(&_RMNProxy.CallOpts)
}
-func (_RMNProxyContract *RMNProxyContractCallerSession) Owner() (common.Address, error) {
- return _RMNProxyContract.Contract.Owner(&_RMNProxyContract.CallOpts)
+func (_RMNProxy *RMNProxyCallerSession) Owner() (common.Address, error) {
+ return _RMNProxy.Contract.Owner(&_RMNProxy.CallOpts)
}
-func (_RMNProxyContract *RMNProxyContractCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+func (_RMNProxy *RMNProxyCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
var out []interface{}
- err := _RMNProxyContract.contract.Call(opts, &out, "typeAndVersion")
+ err := _RMNProxy.contract.Call(opts, &out, "typeAndVersion")
if err != nil {
return *new(string), err
@@ -229,64 +229,64 @@ func (_RMNProxyContract *RMNProxyContractCaller) TypeAndVersion(opts *bind.CallO
}
-func (_RMNProxyContract *RMNProxyContractSession) TypeAndVersion() (string, error) {
- return _RMNProxyContract.Contract.TypeAndVersion(&_RMNProxyContract.CallOpts)
+func (_RMNProxy *RMNProxySession) TypeAndVersion() (string, error) {
+ return _RMNProxy.Contract.TypeAndVersion(&_RMNProxy.CallOpts)
}
-func (_RMNProxyContract *RMNProxyContractCallerSession) TypeAndVersion() (string, error) {
- return _RMNProxyContract.Contract.TypeAndVersion(&_RMNProxyContract.CallOpts)
+func (_RMNProxy *RMNProxyCallerSession) TypeAndVersion() (string, error) {
+ return _RMNProxy.Contract.TypeAndVersion(&_RMNProxy.CallOpts)
}
-func (_RMNProxyContract *RMNProxyContractTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _RMNProxyContract.contract.Transact(opts, "acceptOwnership")
+func (_RMNProxy *RMNProxyTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _RMNProxy.contract.Transact(opts, "acceptOwnership")
}
-func (_RMNProxyContract *RMNProxyContractSession) AcceptOwnership() (*types.Transaction, error) {
- return _RMNProxyContract.Contract.AcceptOwnership(&_RMNProxyContract.TransactOpts)
+func (_RMNProxy *RMNProxySession) AcceptOwnership() (*types.Transaction, error) {
+ return _RMNProxy.Contract.AcceptOwnership(&_RMNProxy.TransactOpts)
}
-func (_RMNProxyContract *RMNProxyContractTransactorSession) AcceptOwnership() (*types.Transaction, error) {
- return _RMNProxyContract.Contract.AcceptOwnership(&_RMNProxyContract.TransactOpts)
+func (_RMNProxy *RMNProxyTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _RMNProxy.Contract.AcceptOwnership(&_RMNProxy.TransactOpts)
}
-func (_RMNProxyContract *RMNProxyContractTransactor) SetARM(opts *bind.TransactOpts, arm common.Address) (*types.Transaction, error) {
- return _RMNProxyContract.contract.Transact(opts, "setARM", arm)
+func (_RMNProxy *RMNProxyTransactor) SetARM(opts *bind.TransactOpts, arm common.Address) (*types.Transaction, error) {
+ return _RMNProxy.contract.Transact(opts, "setARM", arm)
}
-func (_RMNProxyContract *RMNProxyContractSession) SetARM(arm common.Address) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.SetARM(&_RMNProxyContract.TransactOpts, arm)
+func (_RMNProxy *RMNProxySession) SetARM(arm common.Address) (*types.Transaction, error) {
+ return _RMNProxy.Contract.SetARM(&_RMNProxy.TransactOpts, arm)
}
-func (_RMNProxyContract *RMNProxyContractTransactorSession) SetARM(arm common.Address) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.SetARM(&_RMNProxyContract.TransactOpts, arm)
+func (_RMNProxy *RMNProxyTransactorSession) SetARM(arm common.Address) (*types.Transaction, error) {
+ return _RMNProxy.Contract.SetARM(&_RMNProxy.TransactOpts, arm)
}
-func (_RMNProxyContract *RMNProxyContractTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
- return _RMNProxyContract.contract.Transact(opts, "transferOwnership", to)
+func (_RMNProxy *RMNProxyTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _RMNProxy.contract.Transact(opts, "transferOwnership", to)
}
-func (_RMNProxyContract *RMNProxyContractSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.TransferOwnership(&_RMNProxyContract.TransactOpts, to)
+func (_RMNProxy *RMNProxySession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _RMNProxy.Contract.TransferOwnership(&_RMNProxy.TransactOpts, to)
}
-func (_RMNProxyContract *RMNProxyContractTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.TransferOwnership(&_RMNProxyContract.TransactOpts, to)
+func (_RMNProxy *RMNProxyTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _RMNProxy.Contract.TransferOwnership(&_RMNProxy.TransactOpts, to)
}
-func (_RMNProxyContract *RMNProxyContractTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) {
- return _RMNProxyContract.contract.RawTransact(opts, calldata)
+func (_RMNProxy *RMNProxyTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) {
+ return _RMNProxy.contract.RawTransact(opts, calldata)
}
-func (_RMNProxyContract *RMNProxyContractSession) Fallback(calldata []byte) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.Fallback(&_RMNProxyContract.TransactOpts, calldata)
+func (_RMNProxy *RMNProxySession) Fallback(calldata []byte) (*types.Transaction, error) {
+ return _RMNProxy.Contract.Fallback(&_RMNProxy.TransactOpts, calldata)
}
-func (_RMNProxyContract *RMNProxyContractTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) {
- return _RMNProxyContract.Contract.Fallback(&_RMNProxyContract.TransactOpts, calldata)
+func (_RMNProxy *RMNProxyTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) {
+ return _RMNProxy.Contract.Fallback(&_RMNProxy.TransactOpts, calldata)
}
-type RMNProxyContractARMSetIterator struct {
- Event *RMNProxyContractARMSet
+type RMNProxyARMSetIterator struct {
+ Event *RMNProxyARMSet
contract *bind.BoundContract
event string
@@ -297,7 +297,7 @@ type RMNProxyContractARMSetIterator struct {
fail error
}
-func (it *RMNProxyContractARMSetIterator) Next() bool {
+func (it *RMNProxyARMSetIterator) Next() bool {
if it.fail != nil {
return false
@@ -306,7 +306,7 @@ func (it *RMNProxyContractARMSetIterator) Next() bool {
if it.done {
select {
case log := <-it.logs:
- it.Event = new(RMNProxyContractARMSet)
+ it.Event = new(RMNProxyARMSet)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -321,7 +321,7 @@ func (it *RMNProxyContractARMSetIterator) Next() bool {
select {
case log := <-it.logs:
- it.Event = new(RMNProxyContractARMSet)
+ it.Event = new(RMNProxyARMSet)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -336,32 +336,32 @@ func (it *RMNProxyContractARMSetIterator) Next() bool {
}
}
-func (it *RMNProxyContractARMSetIterator) Error() error {
+func (it *RMNProxyARMSetIterator) Error() error {
return it.fail
}
-func (it *RMNProxyContractARMSetIterator) Close() error {
+func (it *RMNProxyARMSetIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
-type RMNProxyContractARMSet struct {
+type RMNProxyARMSet struct {
Arm common.Address
Raw types.Log
}
-func (_RMNProxyContract *RMNProxyContractFilterer) FilterARMSet(opts *bind.FilterOpts) (*RMNProxyContractARMSetIterator, error) {
+func (_RMNProxy *RMNProxyFilterer) FilterARMSet(opts *bind.FilterOpts) (*RMNProxyARMSetIterator, error) {
- logs, sub, err := _RMNProxyContract.contract.FilterLogs(opts, "ARMSet")
+ logs, sub, err := _RMNProxy.contract.FilterLogs(opts, "ARMSet")
if err != nil {
return nil, err
}
- return &RMNProxyContractARMSetIterator{contract: _RMNProxyContract.contract, event: "ARMSet", logs: logs, sub: sub}, nil
+ return &RMNProxyARMSetIterator{contract: _RMNProxy.contract, event: "ARMSet", logs: logs, sub: sub}, nil
}
-func (_RMNProxyContract *RMNProxyContractFilterer) WatchARMSet(opts *bind.WatchOpts, sink chan<- *RMNProxyContractARMSet) (event.Subscription, error) {
+func (_RMNProxy *RMNProxyFilterer) WatchARMSet(opts *bind.WatchOpts, sink chan<- *RMNProxyARMSet) (event.Subscription, error) {
- logs, sub, err := _RMNProxyContract.contract.WatchLogs(opts, "ARMSet")
+ logs, sub, err := _RMNProxy.contract.WatchLogs(opts, "ARMSet")
if err != nil {
return nil, err
}
@@ -371,8 +371,8 @@ func (_RMNProxyContract *RMNProxyContractFilterer) WatchARMSet(opts *bind.WatchO
select {
case log := <-logs:
- event := new(RMNProxyContractARMSet)
- if err := _RMNProxyContract.contract.UnpackLog(event, "ARMSet", log); err != nil {
+ event := new(RMNProxyARMSet)
+ if err := _RMNProxy.contract.UnpackLog(event, "ARMSet", log); err != nil {
return err
}
event.Raw = log
@@ -393,17 +393,17 @@ func (_RMNProxyContract *RMNProxyContractFilterer) WatchARMSet(opts *bind.WatchO
}), nil
}
-func (_RMNProxyContract *RMNProxyContractFilterer) ParseARMSet(log types.Log) (*RMNProxyContractARMSet, error) {
- event := new(RMNProxyContractARMSet)
- if err := _RMNProxyContract.contract.UnpackLog(event, "ARMSet", log); err != nil {
+func (_RMNProxy *RMNProxyFilterer) ParseARMSet(log types.Log) (*RMNProxyARMSet, error) {
+ event := new(RMNProxyARMSet)
+ if err := _RMNProxy.contract.UnpackLog(event, "ARMSet", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
-type RMNProxyContractOwnershipTransferRequestedIterator struct {
- Event *RMNProxyContractOwnershipTransferRequested
+type RMNProxyOwnershipTransferRequestedIterator struct {
+ Event *RMNProxyOwnershipTransferRequested
contract *bind.BoundContract
event string
@@ -414,7 +414,7 @@ type RMNProxyContractOwnershipTransferRequestedIterator struct {
fail error
}
-func (it *RMNProxyContractOwnershipTransferRequestedIterator) Next() bool {
+func (it *RMNProxyOwnershipTransferRequestedIterator) Next() bool {
if it.fail != nil {
return false
@@ -423,7 +423,7 @@ func (it *RMNProxyContractOwnershipTransferRequestedIterator) Next() bool {
if it.done {
select {
case log := <-it.logs:
- it.Event = new(RMNProxyContractOwnershipTransferRequested)
+ it.Event = new(RMNProxyOwnershipTransferRequested)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -438,7 +438,7 @@ func (it *RMNProxyContractOwnershipTransferRequestedIterator) Next() bool {
select {
case log := <-it.logs:
- it.Event = new(RMNProxyContractOwnershipTransferRequested)
+ it.Event = new(RMNProxyOwnershipTransferRequested)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -453,22 +453,22 @@ func (it *RMNProxyContractOwnershipTransferRequestedIterator) Next() bool {
}
}
-func (it *RMNProxyContractOwnershipTransferRequestedIterator) Error() error {
+func (it *RMNProxyOwnershipTransferRequestedIterator) Error() error {
return it.fail
}
-func (it *RMNProxyContractOwnershipTransferRequestedIterator) Close() error {
+func (it *RMNProxyOwnershipTransferRequestedIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
-type RMNProxyContractOwnershipTransferRequested struct {
+type RMNProxyOwnershipTransferRequested struct {
From common.Address
To common.Address
Raw types.Log
}
-func (_RMNProxyContract *RMNProxyContractFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyContractOwnershipTransferRequestedIterator, error) {
+func (_RMNProxy *RMNProxyFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyOwnershipTransferRequestedIterator, error) {
var fromRule []interface{}
for _, fromItem := range from {
@@ -479,14 +479,14 @@ func (_RMNProxyContract *RMNProxyContractFilterer) FilterOwnershipTransferReques
toRule = append(toRule, toItem)
}
- logs, sub, err := _RMNProxyContract.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ logs, sub, err := _RMNProxy.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
if err != nil {
return nil, err
}
- return &RMNProxyContractOwnershipTransferRequestedIterator{contract: _RMNProxyContract.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+ return &RMNProxyOwnershipTransferRequestedIterator{contract: _RMNProxy.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
}
-func (_RMNProxyContract *RMNProxyContractFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNProxyContractOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
+func (_RMNProxy *RMNProxyFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNProxyOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
var fromRule []interface{}
for _, fromItem := range from {
@@ -497,7 +497,7 @@ func (_RMNProxyContract *RMNProxyContractFilterer) WatchOwnershipTransferRequest
toRule = append(toRule, toItem)
}
- logs, sub, err := _RMNProxyContract.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ logs, sub, err := _RMNProxy.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
if err != nil {
return nil, err
}
@@ -507,8 +507,8 @@ func (_RMNProxyContract *RMNProxyContractFilterer) WatchOwnershipTransferRequest
select {
case log := <-logs:
- event := new(RMNProxyContractOwnershipTransferRequested)
- if err := _RMNProxyContract.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ event := new(RMNProxyOwnershipTransferRequested)
+ if err := _RMNProxy.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
return err
}
event.Raw = log
@@ -529,17 +529,17 @@ func (_RMNProxyContract *RMNProxyContractFilterer) WatchOwnershipTransferRequest
}), nil
}
-func (_RMNProxyContract *RMNProxyContractFilterer) ParseOwnershipTransferRequested(log types.Log) (*RMNProxyContractOwnershipTransferRequested, error) {
- event := new(RMNProxyContractOwnershipTransferRequested)
- if err := _RMNProxyContract.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+func (_RMNProxy *RMNProxyFilterer) ParseOwnershipTransferRequested(log types.Log) (*RMNProxyOwnershipTransferRequested, error) {
+ event := new(RMNProxyOwnershipTransferRequested)
+ if err := _RMNProxy.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
-type RMNProxyContractOwnershipTransferredIterator struct {
- Event *RMNProxyContractOwnershipTransferred
+type RMNProxyOwnershipTransferredIterator struct {
+ Event *RMNProxyOwnershipTransferred
contract *bind.BoundContract
event string
@@ -550,7 +550,7 @@ type RMNProxyContractOwnershipTransferredIterator struct {
fail error
}
-func (it *RMNProxyContractOwnershipTransferredIterator) Next() bool {
+func (it *RMNProxyOwnershipTransferredIterator) Next() bool {
if it.fail != nil {
return false
@@ -559,7 +559,7 @@ func (it *RMNProxyContractOwnershipTransferredIterator) Next() bool {
if it.done {
select {
case log := <-it.logs:
- it.Event = new(RMNProxyContractOwnershipTransferred)
+ it.Event = new(RMNProxyOwnershipTransferred)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -574,7 +574,7 @@ func (it *RMNProxyContractOwnershipTransferredIterator) Next() bool {
select {
case log := <-it.logs:
- it.Event = new(RMNProxyContractOwnershipTransferred)
+ it.Event = new(RMNProxyOwnershipTransferred)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
@@ -589,22 +589,22 @@ func (it *RMNProxyContractOwnershipTransferredIterator) Next() bool {
}
}
-func (it *RMNProxyContractOwnershipTransferredIterator) Error() error {
+func (it *RMNProxyOwnershipTransferredIterator) Error() error {
return it.fail
}
-func (it *RMNProxyContractOwnershipTransferredIterator) Close() error {
+func (it *RMNProxyOwnershipTransferredIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
-type RMNProxyContractOwnershipTransferred struct {
+type RMNProxyOwnershipTransferred struct {
From common.Address
To common.Address
Raw types.Log
}
-func (_RMNProxyContract *RMNProxyContractFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyContractOwnershipTransferredIterator, error) {
+func (_RMNProxy *RMNProxyFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyOwnershipTransferredIterator, error) {
var fromRule []interface{}
for _, fromItem := range from {
@@ -615,14 +615,14 @@ func (_RMNProxyContract *RMNProxyContractFilterer) FilterOwnershipTransferred(op
toRule = append(toRule, toItem)
}
- logs, sub, err := _RMNProxyContract.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ logs, sub, err := _RMNProxy.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
if err != nil {
return nil, err
}
- return &RMNProxyContractOwnershipTransferredIterator{contract: _RMNProxyContract.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+ return &RMNProxyOwnershipTransferredIterator{contract: _RMNProxy.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
}
-func (_RMNProxyContract *RMNProxyContractFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNProxyContractOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
+func (_RMNProxy *RMNProxyFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNProxyOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
var fromRule []interface{}
for _, fromItem := range from {
@@ -633,7 +633,7 @@ func (_RMNProxyContract *RMNProxyContractFilterer) WatchOwnershipTransferred(opt
toRule = append(toRule, toItem)
}
- logs, sub, err := _RMNProxyContract.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ logs, sub, err := _RMNProxy.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
if err != nil {
return nil, err
}
@@ -643,8 +643,8 @@ func (_RMNProxyContract *RMNProxyContractFilterer) WatchOwnershipTransferred(opt
select {
case log := <-logs:
- event := new(RMNProxyContractOwnershipTransferred)
- if err := _RMNProxyContract.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ event := new(RMNProxyOwnershipTransferred)
+ if err := _RMNProxy.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
return err
}
event.Raw = log
@@ -665,46 +665,46 @@ func (_RMNProxyContract *RMNProxyContractFilterer) WatchOwnershipTransferred(opt
}), nil
}
-func (_RMNProxyContract *RMNProxyContractFilterer) ParseOwnershipTransferred(log types.Log) (*RMNProxyContractOwnershipTransferred, error) {
- event := new(RMNProxyContractOwnershipTransferred)
- if err := _RMNProxyContract.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+func (_RMNProxy *RMNProxyFilterer) ParseOwnershipTransferred(log types.Log) (*RMNProxyOwnershipTransferred, error) {
+ event := new(RMNProxyOwnershipTransferred)
+ if err := _RMNProxy.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
-func (_RMNProxyContract *RMNProxyContract) ParseLog(log types.Log) (generated.AbigenLog, error) {
+func (_RMNProxy *RMNProxy) ParseLog(log types.Log) (generated.AbigenLog, error) {
switch log.Topics[0] {
- case _RMNProxyContract.abi.Events["ARMSet"].ID:
- return _RMNProxyContract.ParseARMSet(log)
- case _RMNProxyContract.abi.Events["OwnershipTransferRequested"].ID:
- return _RMNProxyContract.ParseOwnershipTransferRequested(log)
- case _RMNProxyContract.abi.Events["OwnershipTransferred"].ID:
- return _RMNProxyContract.ParseOwnershipTransferred(log)
+ case _RMNProxy.abi.Events["ARMSet"].ID:
+ return _RMNProxy.ParseARMSet(log)
+ case _RMNProxy.abi.Events["OwnershipTransferRequested"].ID:
+ return _RMNProxy.ParseOwnershipTransferRequested(log)
+ case _RMNProxy.abi.Events["OwnershipTransferred"].ID:
+ return _RMNProxy.ParseOwnershipTransferred(log)
default:
return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
}
}
-func (RMNProxyContractARMSet) Topic() common.Hash {
+func (RMNProxyARMSet) Topic() common.Hash {
return common.HexToHash("0xef31f568d741a833c6a9dc85a6e1c65e06fa772740d5dc94d1da21827a4e0cab")
}
-func (RMNProxyContractOwnershipTransferRequested) Topic() common.Hash {
+func (RMNProxyOwnershipTransferRequested) Topic() common.Hash {
return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
}
-func (RMNProxyContractOwnershipTransferred) Topic() common.Hash {
+func (RMNProxyOwnershipTransferred) Topic() common.Hash {
return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
}
-func (_RMNProxyContract *RMNProxyContract) Address() common.Address {
- return _RMNProxyContract.address
+func (_RMNProxy *RMNProxy) Address() common.Address {
+ return _RMNProxy.address
}
-type RMNProxyContractInterface interface {
+type RMNProxyInterface interface {
GetARM(opts *bind.CallOpts) (common.Address, error)
Owner(opts *bind.CallOpts) (common.Address, error)
@@ -719,23 +719,23 @@ type RMNProxyContractInterface interface {
Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error)
- FilterARMSet(opts *bind.FilterOpts) (*RMNProxyContractARMSetIterator, error)
+ FilterARMSet(opts *bind.FilterOpts) (*RMNProxyARMSetIterator, error)
- WatchARMSet(opts *bind.WatchOpts, sink chan<- *RMNProxyContractARMSet) (event.Subscription, error)
+ WatchARMSet(opts *bind.WatchOpts, sink chan<- *RMNProxyARMSet) (event.Subscription, error)
- ParseARMSet(log types.Log) (*RMNProxyContractARMSet, error)
+ ParseARMSet(log types.Log) (*RMNProxyARMSet, error)
- FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyContractOwnershipTransferRequestedIterator, error)
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyOwnershipTransferRequestedIterator, error)
- WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNProxyContractOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNProxyOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
- ParseOwnershipTransferRequested(log types.Log) (*RMNProxyContractOwnershipTransferRequested, error)
+ ParseOwnershipTransferRequested(log types.Log) (*RMNProxyOwnershipTransferRequested, error)
- FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyContractOwnershipTransferredIterator, error)
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyOwnershipTransferredIterator, error)
- WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNProxyContractOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNProxyOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
- ParseOwnershipTransferred(log types.Log) (*RMNProxyContractOwnershipTransferred, error)
+ ParseOwnershipTransferred(log types.Log) (*RMNProxyOwnershipTransferred, error)
ParseLog(log types.Log) (generated.AbigenLog, error)
diff --git a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go b/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go
index 2c7c367ab1f..29dbaa0b361 100644
--- a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go
+++ b/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go
@@ -60,8 +60,8 @@ type RMNRemoteSigner struct {
}
var RMNRemoteMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"localChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMN\",\"name\":\"legacyRMN\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"AlreadyCursed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateOnchainPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignerOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IsBlessedNotAvailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"NotCursed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OutOfOrderSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThresholdNotMet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValueNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"}],\"indexed\":false,\"internalType\":\"structRMNRemote.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"name\":\"Cursed\",\"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\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"name\":\"Uncursed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"curse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"name\":\"curse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCursedSubjects\",\"outputs\":[{\"internalType\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLocalChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"localChainSelector\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getReportDigestHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"digestHeader\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVersionedConfig\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMN.TaggedRoot\",\"name\":\"taggedRoot\",\"type\":\"tuple\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"isCursed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCursed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"onchainPublicKey\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"nodeIndex\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Signer[]\",\"name\":\"signers\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"f\",\"type\":\"uint64\"}],\"internalType\":\"structRMNRemote.Config\",\"name\":\"newConfig\",\"type\":\"tuple\"}],\"name\":\"setConfig\",\"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\":\"bytes16\",\"name\":\"subject\",\"type\":\"bytes16\"}],\"name\":\"uncurse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes16[]\",\"name\":\"subjects\",\"type\":\"bytes16[]\"}],\"name\":\"uncurse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"offrampAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structIRMNRemote.Signature[]\",\"name\":\"signatures\",\"type\":\"tuple[]\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60c06040523480156200001157600080fd5b506040516200230438038062002304833981016040819052620000349162000150565b336000816200005657604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b038481169190911790915581161562000089576200008981620000d6565b5050816001600160401b0316600003620000b65760405163273e150360e21b815260040160405180910390fd5b6001600160401b039091166080526001600160a01b031660a052620001a5565b336001600160a01b038216036200010057604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080604083850312156200016457600080fd5b82516001600160401b03811681146200017c57600080fd5b60208401519092506001600160a01b03811681146200019a57600080fd5b809150509250929050565b60805160a05161212b620001d9600039600081816108c5015261096d0152600081816102a80152610b7c015261212b6000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80636d2d3993116100b25780639a19b32911610081578063eaa83ddd11610066578063eaa83ddd1461029a578063f2fde38b146102d2578063f8bb876e146102e557600080fd5b80639a19b32914610272578063d881e0921461028557600080fd5b80636d2d39931461021c57806370a9089e1461022f57806379ba5097146102425780638da5cb5b1461024a57600080fd5b8063397796f7116100ee578063397796f7146101c05780634d616771146101c857806362eed415146101db5780636509a954146101ee57600080fd5b8063181f5a7714610120578063198f0f77146101725780631add205f146101875780632cbc26bb1461019d575b600080fd5b61015c6040518060400160405280601381526020017f524d4e52656d6f746520312e362e302d6465760000000000000000000000000081525081565b60405161016991906114d9565b60405180910390f35b6101856101803660046114ec565b6102f8565b005b61018f6106f2565b604051610169929190611527565b6101b06101ab366004611605565b6107ea565b6040519015158152602001610169565b6101b0610847565b6101b06101d6366004611620565b6108c1565b6101856101e9366004611605565b6109e3565b6040517f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538152602001610169565b61018561022a366004611605565b610a57565b61018561023d3660046116a6565b610ac7565b610185610e22565b60015460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610169565b610185610280366004611825565b610ef0565b61028d610ff6565b60405161016991906118c2565b60405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610169565b6101856102e0366004611928565b611002565b6101856102f3366004611825565b611016565b610300611108565b8035610338576040517f9cf8540c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015b6103486020830183611945565b90508110156104185761035e6020830183611945565b8281811061036e5761036e6119ad565b905060400201602001602081019061038691906119fd565b67ffffffffffffffff1661039d6020840184611945565b6103a8600185611a49565b8181106103b7576103b76119ad565b90506040020160200160208101906103cf91906119fd565b67ffffffffffffffff1610610410576040517f4485151700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60010161033b565b5061042960608201604083016119fd565b610434906002611a5c565b61043f906001611a88565b67ffffffffffffffff166104566020830183611945565b90501015610490576040517f014c502000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003545b8015610522576008600060036104ab600185611a49565b815481106104bb576104bb6119ad565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561051b81611aa9565b9050610494565b5060005b6105336020830183611945565b9050811015610668576008600061054d6020850185611945565b8481811061055d5761055d6119ad565b6105739260206040909202019081019150611928565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff16156105d4576040517f28cae27d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600860006105e76020860186611945565b858181106105f7576105f76119ad565b61060d9260206040909202019081019150611928565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610526565b508060026106768282611b97565b5050600580546000919082906106919063ffffffff16611cd2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508063ffffffff167f7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c836040516106e69190611cf5565b60405180910390a25050565b6040805160608082018352600080835260208301919091529181018290526005546040805160608101825260028054825260038054845160208281028201810190965281815263ffffffff9096169592948593818601939092909160009084015b828210156107c1576000848152602090819020604080518082019091529084015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900467ffffffffffffffff1681830152825260019092019101610753565b505050908252506002919091015467ffffffffffffffff16602090910152919491935090915050565b60006107f6600661115b565b60000361080557506000919050565b610810600683611165565b80610841575061084160067f0100000000000000000000000000000100000000000000000000000000000000611165565b92915050565b6000610853600661115b565b6000036108605750600090565b61088b60067f0100000000000000000000000000000000000000000000000000000000000000611165565b806108bc57506108bc60067f0100000000000000000000000000000100000000000000000000000000000000611165565b905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610930576040517f0a7c4edd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4d61677100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634d616771906109a2908590600401611dff565b602060405180830381865afa1580156109bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108419190611e38565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110610a1957610a196119ad565b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921660209283029190910190910152610a5381611016565b5050565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110610a8d57610a8d6119ad565b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921660209283029190910190910152610a5381610ef0565b60055463ffffffff16600003610b09576040517face124bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454610b219067ffffffffffffffff166001611a88565b67ffffffffffffffff16811015610b64576040517f59fa4a9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160c08101825246815267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020820152309181019190915273ffffffffffffffffffffffffffffffffffffffff8616606082015260025460808201526000907f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf539060a08101610c008789611e5a565b9052604051610c13929190602001611fba565b60405160208183030381529060405280519060200120905060008060005b84811015610e1757600184601b888885818110610c5057610c506119ad565b90506040020160000135898986818110610c6c57610c6c6119ad565b9050604002016020013560405160008152602001604052604051610cac949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610cce573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015192505073ffffffffffffffffffffffffffffffffffffffff8216610d46576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1610610dab576040517fbbe15e7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff16610e0a576040517faaaa914100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9091508190600101610c31565b505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e73576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ef8611108565b60005b8151811015610fbb57610f31828281518110610f1957610f196119ad565b602002602001015160066111a390919063ffffffff16565b610fb357818181518110610f4757610f476119ad565b60200260200101516040517f73281fa1000000000000000000000000000000000000000000000000000000008152600401610faa91907fffffffffffffffffffffffffffffffff0000000000000000000000000000000091909116815260200190565b60405180910390fd5b600101610efb565b507f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba181604051610feb91906118c2565b60405180910390a150565b60606108bc60066111d1565b61100a611108565b611013816111de565b50565b61101e611108565b60005b81518110156110d85761105782828151811061103f5761103f6119ad565b602002602001015160066112a290919063ffffffff16565b6110d05781818151811061106d5761106d6119ad565b60200260200101516040517f19d5c79b000000000000000000000000000000000000000000000000000000008152600401610faa91907fffffffffffffffffffffffffffffffff0000000000000000000000000000000091909116815260200190565b600101611021565b507f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7481604051610feb91906118c2565b60015473ffffffffffffffffffffffffffffffffffffffff163314611159576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000610841825490565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008116600090815260018301602052604081205415155b9392505050565b600061119c837fffffffffffffffffffffffffffffffff0000000000000000000000000000000084166112d0565b6060600061119c836113ca565b3373ffffffffffffffffffffffffffffffffffffffff82160361122d576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061119c837fffffffffffffffffffffffffffffffff000000000000000000000000000000008416611426565b600081815260018301602052604081205480156113b95760006112f4600183611a49565b855490915060009061130890600190611a49565b905080821461136d576000866000018281548110611328576113286119ad565b906000526020600020015490508087600001848154811061134b5761134b6119ad565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061137e5761137e6120ef565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610841565b6000915050610841565b5092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561141a57602002820191906000526020600020905b815481526020019060010190808311611406575b50505050509050919050565b600081815260018301602052604081205461146d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610841565b506000610841565b6000815180845260005b8181101561149b5760208185018101518683018201520161147f565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061119c6020830184611475565b6000602082840312156114fe57600080fd5b813567ffffffffffffffff81111561151557600080fd5b82016060818503121561119c57600080fd5b63ffffffff831681526040602080830182905283518383015283810151606080850152805160a085018190526000939291820190849060c08701905b808310156115ac578351805173ffffffffffffffffffffffffffffffffffffffff16835285015167ffffffffffffffff1685830152928401926001929092019190850190611563565b50604088015167ffffffffffffffff81166080890152945098975050505050505050565b80357fffffffffffffffffffffffffffffffff000000000000000000000000000000008116811461160057600080fd5b919050565b60006020828403121561161757600080fd5b61119c826115d0565b60006040828403121561163257600080fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461101357600080fd5b60008083601f84011261166c57600080fd5b50813567ffffffffffffffff81111561168457600080fd5b6020830191508360208260061b850101111561169f57600080fd5b9250929050565b6000806000806000606086880312156116be57600080fd5b85356116c981611638565b9450602086013567ffffffffffffffff808211156116e657600080fd5b818801915088601f8301126116fa57600080fd5b81358181111561170957600080fd5b8960208260051b850101111561171e57600080fd5b60208301965080955050604088013591508082111561173c57600080fd5b506117498882890161165a565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156117ac576117ac61175a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117f9576117f961175a565b604052919050565b600067ffffffffffffffff82111561181b5761181b61175a565b5060051b60200190565b6000602080838503121561183857600080fd5b823567ffffffffffffffff81111561184f57600080fd5b8301601f8101851361186057600080fd5b803561187361186e82611801565b6117b2565b81815260059190911b8201830190838101908783111561189257600080fd5b928401925b828410156118b7576118a8846115d0565b82529284019290840190611897565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561191c5783517fffffffffffffffffffffffffffffffff0000000000000000000000000000000016835292840192918401916001016118de565b50909695505050505050565b60006020828403121561193a57600080fd5b813561119c81611638565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261197a57600080fd5b83018035915067ffffffffffffffff82111561199557600080fd5b6020019150600681901b360382131561169f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b67ffffffffffffffff8116811461101357600080fd5b8035611600816119dc565b600060208284031215611a0f57600080fd5b813561119c816119dc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561084157610841611a1a565b67ffffffffffffffff818116838216028082169190828114611a8057611a80611a1a565b505092915050565b67ffffffffffffffff8181168382160190808211156113c3576113c3611a1a565b600081611ab857611ab8611a1a565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008135610841816119dc565b8135611af681611638565b73ffffffffffffffffffffffffffffffffffffffff811690508154817fffffffffffffffffffffffff000000000000000000000000000000000000000082161783556020840135611b46816119dc565b7bffffffffffffffff00000000000000000000000000000000000000008160a01b16837fffffffff000000000000000000000000000000000000000000000000000000008416171784555050505050565b81358155600180820160208401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112611bd557600080fd5b8401803567ffffffffffffffff811115611bee57600080fd5b6020820191508060061b3603821315611c0657600080fd5b68010000000000000000811115611c1f57611c1f61175a565b825481845580821015611c54576000848152602081208381019083015b80821015611c505782825590870190611c3c565b5050505b50600092835260208320925b81811015611c8457611c728385611aeb565b92840192604092909201918401611c60565b5050505050610a53611c9860408401611ade565b6002830167ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161781555050565b600063ffffffff808316818103611ceb57611ceb611a1a565b6001019392505050565b6000602080835260808301843582850152818501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112611d3a57600080fd5b8501828101903567ffffffffffffffff80821115611d5757600080fd5b8160061b3603831315611d6957600080fd5b6040606060408901528483865260a089019050849550600094505b83851015611dd4578535611d9781611638565b73ffffffffffffffffffffffffffffffffffffffff16815285870135611dbc816119dc565b83168188015294810194600194909401938101611d84565b611de060408b016119f2565b67ffffffffffffffff811660608b015296509998505050505050505050565b604081018235611e0e81611638565b73ffffffffffffffffffffffffffffffffffffffff81168352506020830135602083015292915050565b600060208284031215611e4a57600080fd5b8151801515811461119c57600080fd5b6000611e6861186e84611801565b80848252602080830192508560051b850136811115611e8657600080fd5b855b81811015611fae57803567ffffffffffffffff80821115611ea95760008081fd5b818901915060a08236031215611ebf5760008081fd5b611ec7611789565b8235611ed2816119dc565b81528286013582811115611ee65760008081fd5b8301601f3681830112611ef95760008081fd5b813584811115611f0b57611f0b61175a565b611f3a897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084840116016117b2565b94508085523689828501011115611f5357600091508182fd5b808984018a8701376000898287010152505050818682015260409150611f7a8284016119f2565b8282015260609150611f8d8284016119f2565b91810191909152608091820135918101919091528552938201938201611e88565b50919695505050505050565b60006040848352602060408185015261010084018551604086015281860151606067ffffffffffffffff808316606089015260408901519250608073ffffffffffffffffffffffffffffffffffffffff80851660808b015260608b0151945060a081861660a08c015260808c015160c08c015260a08c0151955060c060e08c015286915085518088526101209750878c019250878160051b8d01019750888701965060005b818110156120dc577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee08d8a030184528751868151168a528a810151848c8c01526120ab858c0182611475565b828e015189168c8f01528983015189168a8d0152918701519a87019a909a529850968901969289019260010161205f565b50969d9c50505050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"localChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"legacyRMN\",\"type\":\"address\",\"internalType\":\"contractIRMN\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"curse\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"curse\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCursedSubjects\",\"inputs\":[],\"outputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLocalChainSelector\",\"inputs\":[],\"outputs\":[{\"name\":\"localChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReportDigestHeader\",\"inputs\":[],\"outputs\":[{\"name\":\"digestHeader\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getVersionedConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isBlessed\",\"inputs\":[{\"name\":\"taggedRoot\",\"type\":\"tuple\",\"internalType\":\"structIRMN.TaggedRoot\",\"components\":[{\"name\":\"commitStore\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isCursed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setConfig\",\"inputs\":[{\"name\":\"newConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"uncurse\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"uncurse\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verify\",\"inputs\":[{\"name\":\"offRampAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"signatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"f\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Cursed\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"indexed\":false,\"internalType\":\"bytes16[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Uncursed\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"indexed\":false,\"internalType\":\"bytes16[]\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateOnchainPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignerOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IsBlessedNotAvailable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}]},{\"type\":\"error\",\"name\":\"NotEnoughSigners\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfOrderSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThresholdNotMet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroValueNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x60c0346100d357601f6121f938819003918201601f19168301916001600160401b038311848410176100d85780849260409485528339810103126100d35780516001600160401b038116918282036100d35760200151916001600160a01b03831683036100d35733156100c257600180546001600160a01b03191633179055156100b15760805260a05260405161210a90816100ef82396080518181816102fe0152610712015260a05181610f7d0152f35b63273e150360e21b60005260046000fd5b639b15e16f60e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063181f5a77146119ce578063198f0f77146112df5780631add205f146111145780632cbc26bb146110d3578063397796f7146110905780634d61677114610f3557806362eed41514610e155780636509a95414610dbc5780636d2d399314610c9c57806370a9089e146105f057806379ba5097146105075780638da5cb5b146104b55780639a19b329146103c7578063d881e09214610322578063eaa83ddd146102bf578063f2fde38b146101cf5763f8bb876e146100d757600080fd5b346101ca576100e536611b71565b6100ed611ec2565b60005b81518110156101955761012e7fffffffffffffffffffffffffffffffff000000000000000000000000000000006101278385611eae565b51166120a3565b1561013b576001016100f0565b610166907fffffffffffffffffffffffffffffffff0000000000000000000000000000000092611eae565b51167f19d5c79b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040517f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7490806101c58582611c38565b0390a1005b600080fd5b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5773ffffffffffffffffffffffffffffffffffffffff61021b611b36565b610223611ec2565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760405180602060065491828152019060066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9060005b8181106103b1576103ad856103a181870382611a67565b60405191829182611c38565b0390f35b825484526020909301926001928301920161038a565b346101ca576103d536611b71565b6103dd611ec2565b60005b81518110156104855761041e7fffffffffffffffffffffffffffffffff000000000000000000000000000000006104178385611eae565b5116611f0d565b1561042b576001016103e0565b610456907fffffffffffffffffffffffffffffffff0000000000000000000000000000000092611eae565b51167f73281fa10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040517f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba190806101c58582611c38565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760005473ffffffffffffffffffffffffffffffffffffffff811633036105c6577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610627611b36565b67ffffffffffffffff602435116101ca573660236024350112156101ca57602435600401359067ffffffffffffffff82116101ca573660248360051b81350101116101ca576044359067ffffffffffffffff82116101ca57366023830112156101ca5767ffffffffffffffff8260040135116101ca57366024836004013560061b840101116101ca5763ffffffff6005541615610c725767ffffffffffffffff6106d48160045416611d3c565b16826004013510610c485760025460405160c0810181811067ffffffffffffffff821117610c1957604052468152602081019267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168452604082019230845273ffffffffffffffffffffffffffffffffffffffff60608401921682526080830190815261076987611b59565b916107776040519384611a67565b8783526000976024803501602085015b60248360051b813501018210610a61575050509073ffffffffffffffffffffffffffffffffffffffff8095939260a0860193845260405196879567ffffffffffffffff602088019a7f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538c526040808a01526101208901995160608a015251166080880152511660a0860152511660c08401525160e08301525160c0610100830152805180935261014082019260206101408260051b85010192019388905b8282106109c8575050506108809250037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611a67565b5190208290815b83600401358310610896578480f35b60208560806108ad86886004013560248a01611ce8565b35836108c1888a6004013560248c01611ce8565b013560405191878352601b868401526040830152606082015282805260015afa156109bd5784519073ffffffffffffffffffffffffffffffffffffffff82169081156109955773ffffffffffffffffffffffffffffffffffffffff829116101561096d578552600860205260ff604086205416156109455760019290920191610887565b6004857faaaa9141000000000000000000000000000000000000000000000000000000008152fd5b6004867fbbe15e7f000000000000000000000000000000000000000000000000000000008152fd5b6004877f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d86823e3d90fd5b91936020847ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec08293600195970301855287519067ffffffffffffffff8251168152608080610a238585015160a08786015260a0850190611aa8565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff606082015116606085015201519101529601920192018593919492610845565b81359067ffffffffffffffff8211610c155760a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc836024350136030112610c15576040519060a0820182811067ffffffffffffffff821117610be457604052610ad060248481350101611d95565b82526044836024350101359167ffffffffffffffff8311610c115736604360243586018501011215610c115767ffffffffffffffff6024848682350101013511610be457908d9160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6024878982350101013501160193610b576040519586611a67565b60248035870182019081013580875236910160440111610be057602495602095869560a49387908a90813586018101808301359060440186850137858235010101358301015285840152610bb060648289350101611d95565b6040840152610bc460848289350101611d95565b6060840152863501013560808201528152019201919050610787565b8380fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8d80fd5b8b80fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f59fa4a930000000000000000000000000000000000000000000000000000000060005260046000fd5b7face124bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610cd3611b07565b604090815190610ce38383611a67565b600182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083013660208401377fffffffffffffffffffffffffffffffff00000000000000000000000000000000610d3a83611ea1565b91169052610d46611ec2565b60005b8151811015610d8d57610d807fffffffffffffffffffffffffffffffff000000000000000000000000000000006104178385611eae565b1561042b57600101610d49565b82517f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba190806101c58582611c38565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206040517f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538152f35b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610e4c611b07565b604090815190610e5c8383611a67565b600182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083013660208401377fffffffffffffffffffffffffffffffff00000000000000000000000000000000610eb383611ea1565b91169052610ebf611ec2565b60005b8151811015610f0657610ef97fffffffffffffffffffffffffffffffff000000000000000000000000000000006101278385611eae565b1561013b57600101610ec2565b82517f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7490806101c58582611c38565b346101ca5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611068576020604491604051928380927f4d61677100000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff610fef611b36565b16600483015260243560248301525afa90811561105d57829161101a575b6020826040519015158152f35b90506020813d602011611055575b8161103560209383611a67565b810103126110515751801515810361105157602091508261100d565b5080fd5b3d9150611028565b6040513d84823e3d90fd5b6004827f0a7c4edd000000000000000000000000000000000000000000000000000000008152fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206110c9611e44565b6040519015158152f35b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206110c961110f611b07565b611daa565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760006040805161115281611a4b565b82815260606020820152015263ffffffff600554166040519061117482611a4b565b60025482526003549161118683611b59565b926111946040519485611a67565b808452600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9190602086015b82821061128057505050506020810192835267ffffffffffffffff6004541692604082019384526040519283526040602084015260a083019151604084015251906060808401528151809152602060c0840192019060005b81811061123e5750505067ffffffffffffffff8293511660808301520390f35b8251805173ffffffffffffffffffffffffffffffffffffffff16855260209081015167ffffffffffffffff16818601526040909401939092019160010161121e565b6040516040810181811067ffffffffffffffff821117610c1957600192839260209260405267ffffffffffffffff885473ffffffffffffffffffffffffffffffffffffffff8116835260a01c16838201528152019401910190926111c6565b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760043567ffffffffffffffff81116101ca57806004018136039160607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8401126101ca5761135a611ec2565b81359081156119a457909260248201919060015b6113788486611c94565b90508110156114595761138b8486611c94565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83019183831161142a576113cc926020926113c692611ce8565b01611d27565b67ffffffffffffffff806113ef60206113c6866113e98b8d611c94565b90611ce8565b16911610156114005760010161136e565b7f448515170000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b508390856114678584611c94565b60448601915061147682611d27565b60011b6801fffffffffffffffe67fffffffffffffffe82169116810361142a576114a867ffffffffffffffff91611d3c565b161161197a57600354805b611877575060005b6114c58786611c94565b905081101561159e5773ffffffffffffffffffffffffffffffffffffffff6114f96114f4836113e98b8a611c94565b611d74565b16600052600860205260ff60406000205416611574578073ffffffffffffffffffffffffffffffffffffffff6115386114f46001946113e98c8b611c94565b1660005260086020526040600020827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055016114bb565b7f28cae27d0000000000000000000000000000000000000000000000000000000060005260046000fd5b50846115b08780959685600255611c94565b90680100000000000000008211610c195760035482600355808310611831575b50600360005260206000206000915b838310611783575050505067ffffffffffffffff6115fc83611d27565b167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060045416176004556005549463ffffffff86169563ffffffff871461142a5763ffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000098011696879116176005557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd6040519560208752608087019560208801523591018112156101ca57016024600482013591019267ffffffffffffffff82116101ca578160061b360384136101ca578190606060408701525260a0840192906000905b80821061173057867f7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c87808867ffffffffffffffff6117258a611d95565b1660608301520390a2005b90919384359073ffffffffffffffffffffffffffffffffffffffff82168092036101ca5760408160019382935267ffffffffffffffff61177260208a01611d95565b1660208201520195019201906116e7565b600160408273ffffffffffffffffffffffffffffffffffffffff6117a78495611d74565b167fffffffffffffffffffffffff00000000000000000000000000000000000000008654161785556117db60208201611d27565b7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff000000000000000000000000000000000000000087549260a01b169116178555019201920191906115df565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9081019083015b81811061186b57506115d0565b6000815560010161185e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161142a57600090600354111561194d57600390527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85a81015473ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055801561142a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01806114b3565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b7f014c50200000000000000000000000000000000000000000000000000000000060005260046000fd5b7f9cf8540c0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca576103ad6040805190611a0f8183611a67565b601382527f524d4e52656d6f746520312e362e302d64657600000000000000000000000000602083015251918291602083526020830190611aa8565b6060810190811067ffffffffffffffff821117610c1957604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610c1957604052565b919082519283825260005b848110611af25750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611ab3565b600435907fffffffffffffffffffffffffffffffff00000000000000000000000000000000821682036101ca57565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101ca57565b67ffffffffffffffff8111610c195760051b60200190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101ca576004359067ffffffffffffffff82116101ca57806023830112156101ca57816004013590611bc882611b59565b92611bd66040519485611a67565b8284526024602085019360051b8201019182116101ca57602401915b818310611bff5750505090565b82357fffffffffffffffffffffffffffffffff00000000000000000000000000000000811681036101ca57815260209283019201611bf2565b602060408183019282815284518094520192019060005b818110611c5c5750505090565b82517fffffffffffffffffffffffffffffffff0000000000000000000000000000000016845260209384019390920191600101611c4f565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101ca570180359067ffffffffffffffff82116101ca57602001918160061b360383136101ca57565b9190811015611cf85760061b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff811681036101ca5790565b67ffffffffffffffff60019116019067ffffffffffffffff821161142a57565b8054821015611cf85760005260206000200190600090565b3573ffffffffffffffffffffffffffffffffffffffff811681036101ca5790565b359067ffffffffffffffff821682036101ca57565b60065415611e3e577fffffffffffffffffffffffffffffffff0000000000000000000000000000000016600052600760205260406000205415801590611ded5790565b507f010000000000000000000000000000010000000000000000000000000000000060005260076020527f70b766b11586b6b505ed3893938b0cc6c6c98bd6f65e969ac311168d34e4f9e254151590565b50600090565b60065415611e9c577f010000000000000000000000000000010000000000000000000000000000000060005260076020527f70b766b11586b6b505ed3893938b0cc6c6c98bd6f65e969ac311168d34e4f9e254151590565b600090565b805115611cf85760200190565b8051821015611cf85760209160051b010190565b73ffffffffffffffffffffffffffffffffffffffff600154163303611ee357565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b600081815260076020526040902054801561209c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161142a57600654907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161142a5781810361202d575b5050506006548015611ffe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611fbb816006611d5c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600655600052600760205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61208461203e61204f936006611d5c565b90549060031b1c9283926006611d5c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526007602052604060002055388080611f82565b5050600090565b80600052600760205260406000205415600014611e3e5760065468010000000000000000811015610c19576120e461204f8260018594016006556006611d5c565b905560065490600052600760205260406000205560019056fea164736f6c634300081a000a",
}
var RMNRemoteABI = RMNRemoteMetaData.ABI
@@ -406,9 +406,9 @@ func (_RMNRemote *RMNRemoteCallerSession) TypeAndVersion() (string, error) {
return _RMNRemote.Contract.TypeAndVersion(&_RMNRemote.CallOpts)
}
-func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error {
+func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, offRampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error {
var out []interface{}
- err := _RMNRemote.contract.Call(opts, &out, "verify", offrampAddress, merkleRoots, signatures)
+ err := _RMNRemote.contract.Call(opts, &out, "verify", offRampAddress, merkleRoots, signatures)
if err != nil {
return err
@@ -418,12 +418,12 @@ func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, offrampAddress co
}
-func (_RMNRemote *RMNRemoteSession) Verify(offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error {
- return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offrampAddress, merkleRoots, signatures)
+func (_RMNRemote *RMNRemoteSession) Verify(offRampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error {
+ return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offRampAddress, merkleRoots, signatures)
}
-func (_RMNRemote *RMNRemoteCallerSession) Verify(offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error {
- return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offrampAddress, merkleRoots, signatures)
+func (_RMNRemote *RMNRemoteCallerSession) Verify(offRampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error {
+ return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offRampAddress, merkleRoots, signatures)
}
func (_RMNRemote *RMNRemoteTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
@@ -1212,7 +1212,7 @@ type RMNRemoteInterface interface {
TypeAndVersion(opts *bind.CallOpts) (string, error)
- Verify(opts *bind.CallOpts, offrampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error
+ Verify(opts *bind.CallOpts, offRampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error
AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generated/router/router.go b/core/gethwrappers/ccip/generated/router/router.go
index 9a0d4a40559..24f65d1796e 100644
--- a/core/gethwrappers/ccip/generated/router/router.go
+++ b/core/gethwrappers/ccip/generated/router/router.go
@@ -62,8 +62,8 @@ type RouterOnRamp struct {
}
var RouterMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"InvalidRecipientAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyOffRamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"UnsupportedDestinationChain\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"calldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"name\":\"OnRampSet\",\"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\":\"MAX_RET_BYTES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OnRamp[]\",\"name\":\"onRampUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampRemoves\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyRampUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"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\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getArmProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"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\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOffRamps\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWrappedNative\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"isChainSupported\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverTokens\",\"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\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"routeMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"retData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"}],\"name\":\"setWrappedNative\",\"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: "0x60a06040523480156200001157600080fd5b5060405162002d2838038062002d288339810160408190526200003491620001af565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000e7565b5050600280546001600160a01b0319166001600160a01b039485161790555016608052620001e7565b336001600160a01b03821603620001415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114620001aa57600080fd5b919050565b60008060408385031215620001c357600080fd5b620001ce8362000192565b9150620001de6020840162000192565b90509250929050565b608051612b1762000211600039600081816101f9015281816105e10152610af20152612b176000f3fe6080604052600436106101295760003560e01c80638da5cb5b116100a5578063a8d87a3b11610074578063e861e90711610059578063e861e90714610409578063f2fde38b14610434578063fbca3b741461045457600080fd5b8063a8d87a3b1461039c578063da5fcac8146103e957600080fd5b80638da5cb5b146102ed57806396f4e9f914610318578063a40e69c71461032b578063a48a90581461034d57600080fd5b806352cb60ca116100fc578063787350e3116100e1578063787350e31461028057806379ba5097146102a857806383826b2b146102bd57600080fd5b806352cb60ca1461023e5780635f3e849f1461026057600080fd5b8063181f5a771461012e57806320487ded1461018d5780633cf97983146101bb5780635246492f146101ea575b600080fd5b34801561013a57600080fd5b506101776040518060400160405280600c81526020017f526f7574657220312e322e30000000000000000000000000000000000000000081525081565b6040516101849190611f3c565b60405180910390f35b34801561019957600080fd5b506101ad6101a83660046121ad565b610481565b604051908152602001610184565b3480156101c757600080fd5b506101db6101d63660046122aa565b6105d9565b60405161018493929190612322565b3480156101f657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b34801561024a57600080fd5b5061025e61025936600461234d565b610836565b005b34801561026c57600080fd5b5061025e61027b36600461236a565b610885565b34801561028c57600080fd5b50610295608481565b60405161ffff9091168152602001610184565b3480156102b457600080fd5b5061025e6109d3565b3480156102c957600080fd5b506102dd6102d83660046123ab565b610ad0565b6040519015158152602001610184565b3480156102f957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610219565b6101ad6103263660046121ad565b610aee565b34801561033757600080fd5b50610340611087565b60405161018491906123e2565b34801561035957600080fd5b506102dd610368366004612451565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b3480156103a857600080fd5b506102196103b7366004612451565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b3480156103f557600080fd5b5061025e6104043660046124b8565b61118b565b34801561041557600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610219565b34801561044057600080fd5b5061025e61044f36600461234d565b611490565b34801561046057600080fd5b5061047461046f366004612451565b6114a4565b6040516101849190612552565b606081015160009073ffffffffffffffffffffffffffffffffffffffff166104c25760025473ffffffffffffffffffffffffffffffffffffffff1660608301525b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff168061053a576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024015b60405180910390fd5b6040517f20487ded00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906320487ded9061058e9087908790600401612689565b602060405180830381865afa1580156105ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cf91906126ac565b9150505b92915050565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e91906126c5565b156106a5576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106be6106b86040890160208a01612451565b33610ad0565b6106f4576040517fd2316ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006385572ffb60e01b8860405160240161070f91906127f4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061079c8186888a60846115c4565b919550935091507f9b877de93ea9895756e337442c657f95a34fc68e7eb988bdfa693d5be83016b688356107d660408b0160208c01612451565b83516020850120604051610823939291339193845267ffffffffffffffff92909216602084015273ffffffffffffffffffffffffffffffffffffffff166040830152606082015260800190565b60405180910390a1509450945094915050565b61083e6116ea565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61088d6116ea565b73ffffffffffffffffffffffffffffffffffffffff82166108f2576040517f26a78f8f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610531565b73ffffffffffffffffffffffffffffffffffffffff83166109ad5760008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610967576040519150601f19603f3d011682016040523d82523d6000602084013e61096c565b606091505b50509050806109a7576040517fe417b80b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6109ce73ffffffffffffffffffffffffffffffffffffffff8416838361176d565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610531565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000610ae7610adf8484611841565b600490611885565b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f91906126c5565b15610bb6576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610c29576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610531565b606083015160009073ffffffffffffffffffffffffffffffffffffffff16610dbb5760025473ffffffffffffffffffffffffffffffffffffffff90811660608601526040517f20487ded000000000000000000000000000000000000000000000000000000008152908316906320487ded90610cab9088908890600401612689565b602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec91906126ac565b905080341015610d28576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050836060015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505050506060850151610db6915073ffffffffffffffffffffffffffffffffffffffff16838361176d565b610eb2565b3415610df3576040517f1841b4e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f20487ded00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906320487ded90610e479088908890600401612689565b602060405180830381865afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906126ac565b6060850151909150610eb29073ffffffffffffffffffffffffffffffffffffffff1633848461189d565b60005b846040015151811015610fe257600085604001518281518110610eda57610eda612900565b6020908102919091010151516040517f48a98aa400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015273ffffffffffffffffffffffffffffffffffffffff8083166024830152919250610fd9913391908716906348a98aa490604401602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061292f565b88604001518581518110610fa657610fa6612900565b6020026020010151602001518473ffffffffffffffffffffffffffffffffffffffff1661189d909392919063ffffffff16565b50600101610eb5565b506040517fdf0aa9e900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063df0aa9e99061103b90889088908690339060040161294c565b6020604051808303816000875af115801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e91906126ac565b95945050505050565b6060600061109560046118fb565b90506000815167ffffffffffffffff8111156110b3576110b3611f6c565b6040519080825280602002602001820160405280156110f857816020015b60408051808201909152600080825260208201528152602001906001900390816110d15790505b50905060005b825181101561118457600083828151811061111b5761111b612900565b60200260200101519050604051806040016040528060a083901c67ffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681525083838151811061117057611170612900565b6020908102919091010152506001016110fe565b5092915050565b6111936116ea565b60005b8581101561126f5760008787838181106111b2576111b2612900565b9050604002018036038101906111c8919061299c565b60208181018051835167ffffffffffffffff90811660009081526003855260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055855193519051921682529394509216917f1f7d0ec248b80e5c0dde0ee531c4fc8fdb6ce9a2b3d90f560c74acd6a7202f23910160405180910390a250600101611196565b5060005b838110156113a757600085858381811061128f5761128f612900565b6112a59260206040909202019081019150612451565b905060008686848181106112bb576112bb612900565b90506040020160200160208101906112d3919061234d565b90506112ea6112e28383611841565b600490611908565b611348576040517f4964779000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152604401610531565b60405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa823809efda3ba66c873364eec120fa0923d9fabda73bc97dd5663341e2d9bcb9060200160405180910390a25050600101611273565b5060005b818110156114875760008383838181106113c7576113c7612900565b6113dd9260206040909202019081019150612451565b905060008484848181106113f3576113f3612900565b905060400201602001602081019061140b919061234d565b905061142261141a8383611841565b600490611914565b1561147d5760405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa4bdf64ebdf3316320601a081916a75aa144bcef6c4beeb0e9fb1982cacc6b949060200160405180910390a25b50506001016113ab565b50505050505050565b6114986116ea565b6114a181611920565b50565b60606114de8267ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b6114f8576040805160008082526020820190925290611184565b67ffffffffffffffff8216600081815260036020526040908190205490517ffbca3b74000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169063fbca3b7490602401600060405180830381865afa15801561157e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d391908101906129db565b6000606060008361ffff1667ffffffffffffffff8111156115e7576115e7611f6c565b6040519080825280601f01601f191660200182016040528015611611576020820181803683370190505b509150863b611644577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015611677577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106116b0577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156116d35750835b808352806000602085013e50955095509592505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610531565b565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109ce9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a15565b6000610ae773ffffffffffffffffffffffffffffffffffffffff83167bffffffffffffffff000000000000000000000000000000000000000060a086901b16612a99565b60008181526001830160205260408120541515610ae7565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109a79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016117bf565b60606000610ae783611b21565b6000610ae78383611b7d565b6000610ae78383611c70565b3373ffffffffffffffffffffffffffffffffffffffff82160361199f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610531565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611a77826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611cbf9092919063ffffffff16565b8051909150156109ce5780806020019051810190611a9591906126c5565b6109ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610531565b606081600001805480602002602001604051908101604052809291908181526020018280548015611b7157602002820191906000526020600020905b815481526020019060010190808311611b5d575b50505050509050919050565b60008181526001830160205260408120548015611c66576000611ba1600183612aac565b8554909150600090611bb590600190612aac565b9050808214611c1a576000866000018281548110611bd557611bd5612900565b9060005260206000200154905080876000018481548110611bf857611bf8612900565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c2b57611c2b612abf565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105d3565b60009150506105d3565b6000818152600183016020526040812054611cb7575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105d3565b5060006105d3565b6060611cce8484600085611cd6565b949350505050565b606082471015611d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610531565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611d919190612aee565b60006040518083038185875af1925050503d8060008114611dce576040519150601f19603f3d011682016040523d82523d6000602084013e611dd3565b606091505b5091509150611de487838387611def565b979650505050505050565b60608315611e85578251600003611e7e5773ffffffffffffffffffffffffffffffffffffffff85163b611e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610531565b5081611cce565b611cce8383815115611e9a5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105319190611f3c565b60005b83811015611ee9578181015183820152602001611ed1565b50506000910152565b60008151808452611f0a816020860160208601611ece565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ae76020830184611ef2565b803567ffffffffffffffff81168114611f6757600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611fbe57611fbe611f6c565b60405290565b60405160a0810167ffffffffffffffff81118282101715611fbe57611fbe611f6c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561202e5761202e611f6c565b604052919050565b600082601f83011261204757600080fd5b813567ffffffffffffffff81111561206157612061611f6c565b61209260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611fe7565b8181528460208386010111156120a757600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff8211156120de576120de611f6c565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146114a157600080fd5b8035611f67816120e8565b600082601f83011261212657600080fd5b8135602061213b612136836120c4565b611fe7565b82815260069290921b8401810191818101908684111561215a57600080fd5b8286015b848110156121a257604081890312156121775760008081fd5b61217f611f9b565b813561218a816120e8565b8152818501358582015283529183019160400161215e565b509695505050505050565b600080604083850312156121c057600080fd5b6121c983611f4f565b9150602083013567ffffffffffffffff808211156121e657600080fd5b9084019060a082870312156121fa57600080fd5b612202611fc4565b82358281111561221157600080fd5b61221d88828601612036565b82525060208301358281111561223257600080fd5b61223e88828601612036565b60208301525060408301358281111561225657600080fd5b61226288828601612115565b6040830152506122746060840161210a565b606082015260808301358281111561228b57600080fd5b61229788828601612036565b6080830152508093505050509250929050565b600080600080608085870312156122c057600080fd5b843567ffffffffffffffff8111156122d757600080fd5b850160a081880312156122e957600080fd5b9350602085013561ffff8116811461230057600080fd5b9250604085013591506060850135612317816120e8565b939692955090935050565b831515815260606020820152600061233d6060830185611ef2565b9050826040830152949350505050565b60006020828403121561235f57600080fd5b8135610ae7816120e8565b60008060006060848603121561237f57600080fd5b833561238a816120e8565b9250602084013561239a816120e8565b929592945050506040919091013590565b600080604083850312156123be57600080fd5b6123c783611f4f565b915060208301356123d7816120e8565b809150509250929050565b602080825282518282018190526000919060409081850190868401855b82811015612444578151805167ffffffffffffffff16855286015173ffffffffffffffffffffffffffffffffffffffff168685015292840192908501906001016123ff565b5091979650505050505050565b60006020828403121561246357600080fd5b610ae782611f4f565b60008083601f84011261247e57600080fd5b50813567ffffffffffffffff81111561249657600080fd5b6020830191508360208260061b85010111156124b157600080fd5b9250929050565b600080600080600080606087890312156124d157600080fd5b863567ffffffffffffffff808211156124e957600080fd5b6124f58a838b0161246c565b9098509650602089013591508082111561250e57600080fd5b61251a8a838b0161246c565b9096509450604089013591508082111561253357600080fd5b5061254089828a0161246c565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b818110156125a057835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161256e565b50909695505050505050565b6000815160a084526125c160a0850182611ef2565b9050602080840151858303828701526125da8382611ef2565b60408681015188830389830152805180845290850195509092506000918401905b8083101561263a578551805173ffffffffffffffffffffffffffffffffffffffff168352850151858301529484019460019290920191908301906125fb565b5060608701519450612664606089018673ffffffffffffffffffffffffffffffffffffffff169052565b60808701519450878103608089015261267d8186611ef2565b98975050505050505050565b67ffffffffffffffff83168152604060208201526000611cce60408301846125ac565b6000602082840312156126be57600080fd5b5051919050565b6000602082840312156126d757600080fd5b81518015158114610ae757600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261271c57600080fd5b830160208101925035905067ffffffffffffffff81111561273c57600080fd5b8036038213156124b157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156127e95781356127b7816120e8565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016127a4565b509495945050505050565b6020815281356020820152600061280d60208401611f4f565b67ffffffffffffffff808216604085015261282b60408601866126e7565b925060a0606086015261284260c08601848361274b565b92505061285260608601866126e7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261288885838561274b565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126128c157600080fd5b602092880192830192359150838211156128da57600080fd5b8160061b36038313156128ec57600080fd5b8685030160a0870152611de4848284612794565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561294157600080fd5b8151610ae7816120e8565b67ffffffffffffffff8516815260806020820152600061296f60808301866125ac565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b6000604082840312156129ae57600080fd5b6129b6611f9b565b6129bf83611f4f565b815260208301356129cf816120e8565b60208201529392505050565b600060208083850312156129ee57600080fd5b825167ffffffffffffffff811115612a0557600080fd5b8301601f81018513612a1657600080fd5b8051612a24612136826120c4565b81815260059190911b82018301908381019087831115612a4357600080fd5b928401925b82841015611de4578351612a5b816120e8565b82529284019290840190612a48565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105d3576105d3612a6a565b818103818111156105d3576105d3612a6a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612b00818460208701611ece565b919091019291505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"wrappedNative\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"armProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_RET_BYTES\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyRampUpdates\",\"inputs\":[{\"name\":\"onRampUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structRouter.OnRamp[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"offRampRemoves\",\"type\":\"tuple[]\",\"internalType\":\"structRouter.OffRamp[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"offRampAdds\",\"type\":\"tuple[]\",\"internalType\":\"structRouter.OffRamp[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipSend\",\"inputs\":[{\"name\":\"destinationChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getArmProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"destinationChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOffRamps\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structRouter.OffRamp[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOnRamp\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedTokens\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWrappedNative\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isChainSupported\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOffRamp\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"routeMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"retData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWrappedNative\",\"inputs\":[{\"name\":\"wrappedNative\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"MessageExecuted\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"calldataHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OffRampAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OffRampRemoved\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OnRampSet\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BadARMSignal\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedToSendValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFeeTokenAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMsgValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRecipientAddress\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OffRampMismatch\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyOffRamp\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnsupportedDestinationChain\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]",
+ Bin: "0x60a0346100f557601f612b2e38819003918201601f19168301916001600160401b038311848410176100fa5780849260409485528339810103126100f557610052602061004b83610110565b9201610110565b9033156100b057600080546001600160a01b03199081163317909155600280549091166001600160a01b0392909216919091179055608052604051612a099081610125823960805181818161084e01528181610bfb0152611d290152f35b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f00000000000000006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100f55756fe6080604052600436101561001257600080fd5b60003560e01c8063181f5a771461013757806320487ded146101325780633cf979831461012d5780635246492f1461012857806352cb60ca146101235780635f3e849f1461011e578063787350e31461011957806379ba50971461011457806383826b2b1461010f5780638da5cb5b1461010a57806396f4e9f914610105578063a40e69c714610100578063a48a9058146100fb578063a8d87a3b146100f6578063da5fcac8146100f1578063e861e907146100ec578063f2fde38b146100e75763fbca3b74146100e257600080fd5b611922565b6117de565b61178c565b611413565b61136f565b6112fc565b6111ab565b610baf565b610b5d565b610aeb565b610990565b610956565b6108f9565b610872565b610803565b610758565b61057d565b6102aa565b600091031261014757565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761019757604052565b61014c565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761019757604052565b604051906101ec60a08361019c565b565b604051906101ec60408361019c565b67ffffffffffffffff811161019757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b8481106102815750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610242565b9060206102a7928181520190610237565b90565b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475761032760408051906102eb818361019c565b600c82527f526f7574657220312e322e300000000000000000000000000000000000000000602083015251918291602083526020830190610237565b0390f35b67ffffffffffffffff81160361014757565b81601f8201121561014757803590610354826101fd565b92610362604051948561019c565b8284526020838301011161014757816000926020809301838601378301015290565b67ffffffffffffffff81116101975760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361014757565b35906101ec8261039c565b81601f82011215610147578035906103dc82610384565b926103ea604051948561019c565b82845260208085019360061b8301019181831161014757602001925b828410610414575050505090565b604084830312610147576020604091825161042e8161017b565b86356104398161039c565b81528287013583820152815201930192610406565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112610147576004356104858161032b565b9160243567ffffffffffffffff81116101475760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8284030112610147576104cc6101dd565b91816004013567ffffffffffffffff8111610147578160046104f09285010161033d565b8352602482013567ffffffffffffffff8111610147578160046105159285010161033d565b6020840152604482013567ffffffffffffffff81116101475781600461053d928501016103c5565b604084015261054e606483016103ba565b606084015260848201359167ffffffffffffffff831161014757610575920160040161033d565b608082015290565b346101475761058b3661044e565b6060810173ffffffffffffffffffffffffffffffffffffffff6105c2825173ffffffffffffffffffffffffffffffffffffffff1690565b16156106f1575b5073ffffffffffffffffffffffffffffffffffffffff61061a6106008467ffffffffffffffff166000526003602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1680156106b9579060209161065e936040518095819482937f20487ded00000000000000000000000000000000000000000000000000000000845260048401611a98565b03915afa80156106b45761032791600091610685575b506040519081529081906020820190565b6106a7915060203d6020116106ad575b61069f818361019c565b8101906119c0565b38610674565b503d610695565b611ab9565b7fae236d9c0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff831660045260246000fd5b61072e9061071460025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff169052565b386105c9565b9392916107539060409215158652606060208701526060860190610237565b930152565b346101475760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475760043567ffffffffffffffff81116101475760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101475760243561ffff8116810361014757610327916107f49160443590606435926107ec8461039c565b600401611ce2565b60409391935193849384610734565b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475773ffffffffffffffffffffffffffffffffffffffff6004356108c28161039c565b6108ca6123fe565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255600080f35b346101475760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610147576109546004356109378161039c565b6024356109438161039c565b6044359161094f6123fe565b611ef4565b005b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014757602060405160848152f35b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475773ffffffffffffffffffffffffffffffffffffffff600154163303610a8d5760005473ffffffffffffffffffffffffffffffffffffffff16600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055610a4e7fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b73ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152fd5b346101475760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610147576020610b53610b40600435610b2e8161032b565b60243590610b3b8261039c565b61250e565b6000526005602052604060002054151590565b6040519015158152f35b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014757602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b610bb83661044e565b6040517f397796f700000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156106b457600091611116575b506110ec57610c526106008367ffffffffffffffff166000526003602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff811680156110b4576060830191610cae610c95845173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b610fe157610cee610cd460025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff168452565b6040517f20487ded00000000000000000000000000000000000000000000000000000000815260208180610d26888a60048401611a98565b0381865afa9081156106b457600091610fc2575b503410610f98573492610d67610c95610c95835173ffffffffffffffffffffffffffffffffffffffff1690565b91823b15610147576000600493604051948580927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af19283156106b457610dda93610f7d575b50610dd5610c9534935173ffffffffffffffffffffffffffffffffffffffff1690565b61247d565b9190915b604082019160005b83518051821015610ef557610c95610e0183610e1c93611fdc565b515173ffffffffffffffffffffffffffffffffffffffff1690565b6040517f48a98aa400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8816600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152909190602081604481885afa80156106b457600193610ebf92600092610ec5575b5073ffffffffffffffffffffffffffffffffffffffff6020610eb2868b51611fdc565b5101519216903390612558565b01610de6565b610ee791925060203d8111610eee575b610edf818361019c565b810190611ff5565b9038610e8f565b503d610ed5565b610f386020888689600088604051968795869485937fdf0aa9e900000000000000000000000000000000000000000000000000000000855233926004860161200a565b03925af180156106b45761032791600091610f5e57506040519081529081906020820190565b610f77915060203d6020116106ad5761069f818361019c565b82610674565b80610f8c6000610f929361019c565b8061013c565b38610db2565b7f07da6ee60000000000000000000000000000000000000000000000000000000060005260046000fd5b610fdb915060203d6020116106ad5761069f818361019c565b38610d3a565b3461108a57604051907f20487ded0000000000000000000000000000000000000000000000000000000082526020828061101f888a60048401611a98565b0381865afa9081156106b45761106192600092611069575b5061105a610c9583965173ffffffffffffffffffffffffffffffffffffffff1690565b3390612558565b919091610dde565b61108391925060203d6020116106ad5761069f818361019c565b9038611037565b7f1841b4e10000000000000000000000000000000000000000000000000000000060005260046000fd5b7fae236d9c0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff841660045260246000fd5b7fc14837150000000000000000000000000000000000000000000000000000000060005260046000fd5b611138915060203d60201161113e575b611130818361019c565b810190611ac5565b38610c2c565b503d611126565b602060408183019282815284518094520192019060005b8181106111695750505090565b8251805167ffffffffffffffff16855260209081015173ffffffffffffffffffffffffffffffffffffffff16818601526040909401939092019160010161115c565b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475760405180816020600454928381520160046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9260005b8181106112e35750506112289250038261019c565b6112328151612052565b9060005b81518110156112d5578061124c60019284611fdc565b516112b973ffffffffffffffffffffffffffffffffffffffff61127f6112728460a01c90565b67ffffffffffffffff1690565b9261129b61128b6101ee565b67ffffffffffffffff9095168552565b1673ffffffffffffffffffffffffffffffffffffffff166020830152565b6112c38286611fdc565b526112ce8185611fdc565b5001611236565b604051806103278582611145565b8454835260019485019486945060209093019201611213565b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610147576020610b5360043561133c8161032b565b67ffffffffffffffff16600052600360205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475767ffffffffffffffff6004356113b38161032b565b166000526003602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b9181601f840112156101475782359167ffffffffffffffff8311610147576020808501948460061b01011161014757565b346101475760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475760043567ffffffffffffffff8111610147576114629036906004016113e2565b60243567ffffffffffffffff8111610147576114829036906004016113e2565b60443567ffffffffffffffff8111610147576114a29036906004016113e2565b9490936114ad6123fe565b60005b81811061165d5750505060005b8181106115755750505060005b8281106114d357005b806114e96114e460019386866120cd565b611add565b6114ff60206114f98488886120cd565b01612116565b9061151261150d838361250e565b6128a3565b61151f575b5050016114ca565b60405173ffffffffffffffffffffffffffffffffffffffff92909216825267ffffffffffffffff16907fa4bdf64ebdf3316320601a081916a75aa144bcef6c4beeb0e9fb1982cacc6b9490602090a23880611517565b6115836114e48284866120cd565b61159360206114f98486886120cd565b906115ad6115a96115a4848461250e565b6127bf565b1590565b61160d5760405173ffffffffffffffffffffffffffffffffffffffff9290921682526001929167ffffffffffffffff91909116907fa823809efda3ba66c873364eec120fa0923d9fabda73bc97dd5663341e2d9bcb90602090a2016114bd565b7f496477900000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045273ffffffffffffffffffffffffffffffffffffffff1660245260446000fd5b8061167361166e60019385876120cd565b6120dd565b7f1f7d0ec248b80e5c0dde0ee531c4fc8fdb6ce9a2b3d90f560c74acd6a7202f2367ffffffffffffffff61176161174660208501946117386116c9875173ffffffffffffffffffffffffffffffffffffffff1690565b6116f86116de845167ffffffffffffffff1690565b67ffffffffffffffff166000526003602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b5167ffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff919091168152921691602090a2016114b0565b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014757602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475773ffffffffffffffffffffffffffffffffffffffff60043561182e8161039c565b6118366123fe565b163381146118c457807fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015573ffffffffffffffffffffffffffffffffffffffff61189c60005473ffffffffffffffffffffffffffffffffffffffff1690565b167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152fd5b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610147576119656004356119608161032b565b6121a4565b60405180916020820160208352815180915260206040840192019060005b818110611991575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611983565b90816020910312610147575190565b91906119f96119e7845160a0845260a0840190610237565b60208501518382036020850152610237565b9060408401519181810360408301526020808451928381520193019060005b818110611a6057505050608084611a5060606102a796970151606085019073ffffffffffffffffffffffffffffffffffffffff169052565b0151906080818403910152610237565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101518187015260409095019490920191600101611a18565b60409067ffffffffffffffff6102a7949316815281602082015201906119cf565b6040513d6000823e3d90fd5b90816020910312610147575180151581036101475790565b356102a78161032b565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561014757016020813591019167ffffffffffffffff821161014757813603831361014757565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9160209082815201919060005b818110611b905750505090565b90919260408060019273ffffffffffffffffffffffffffffffffffffffff8735611bb98161039c565b16815260208781013590820152019401929101611b83565b90602082528035602083015267ffffffffffffffff6020820135611bf48161032b565b166040830152611c5b611c1e611c0d6040840184611ae7565b60a0606087015260c0860191611b37565b611c2b6060840184611ae7565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403016080870152611b37565b9060808101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215610147570160208135910167ffffffffffffffff8211610147578160061b36038113610147578360a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102a796860301910152611b76565b939190926040517f397796f700000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156106b457600091611ea5575b506110ec5760208501611d7b610b408235611d748161032b565b339061250e565b15611e7b57611deb611e73611e1d7f85572ffb0000000000000000000000000000000000000000000000000000000097611e29967f9b877de93ea9895756e337442c657f95a34fc68e7eb988bdfa693d5be83016b696611e178c604051978891602083019e8f5260248301611bd1565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810188528761019c565b856122d8565b98919690993594611add565b925190206040519384933391859094939273ffffffffffffffffffffffffffffffffffffffff9067ffffffffffffffff606094608085019885521660208401521660408201520152565b0390a1929190565b7fd2316ede0000000000000000000000000000000000000000000000000000000060005260046000fd5b611ebe915060203d60201161113e57611130818361019c565b38611d5a565b3d15611eef573d90611ed5826101fd565b91611ee3604051938461019c565b82523d6000602084013e565b606090565b91909173ffffffffffffffffffffffffffffffffffffffff83168015611f80575073ffffffffffffffffffffffffffffffffffffffff16918215611f3b576101ec9261247d565b6000809350809281925af1611f4e611ec4565b5015611f5657565b7fe417b80b0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f26a78f8f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051821015611ff05760209160051b010190565b611fad565b9081602091031261014757516102a78161039c565b92949361204660609367ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff941686526080602087015260808601906119cf565b95604085015216910152565b9061205c82610384565b612069604051918261019c565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06120978294610384565b019060005b8281106120a857505050565b6020906040516120b78161017b565b600081526000838201528282850101520161209c565b9190811015611ff05760061b0190565b604081360312610147576020604051916120f68361017b565b80356121018161032b565b8352013561210e8161039c565b602082015290565b356102a78161039c565b6020818303126101475780519067ffffffffffffffff821161014757019080601f8301121561014757815161215481610384565b92612162604051948561019c565b81845260208085019260051b82010192831161014757602001905b82821061218a5750505090565b6020809183516121998161039c565b81520191019061217d565b6121db8167ffffffffffffffff16600052600360205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b156122985760006122659167ffffffffffffffff811682526003602052612220610c95610c956040852073ffffffffffffffffffffffffffffffffffffffff90541690565b60405180809581947ffbca3b740000000000000000000000000000000000000000000000000000000083526004830191909167ffffffffffffffff6020820193169052565b03915afa9081156106b45760009161227b575090565b6102a791503d806000833e612290818361019c565b810190612120565b5060405160206122a8818361019c565b600082527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810190369083013790565b9391936122e560846101fd565b946122f3604051968761019c565b6084865261230160846101fd565b947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602088019601368737833b156123d4575a908082106123aa578291038060061c90031115612380576000918291825a9560208451940192f1905a9003923d9060848211612377575b6000908287523e929190565b6084915061236b565b7f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b7fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361241f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152fd5b6101ec9273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb0000000000000000000000000000000000000000000000000000000060208601521660248401526044830152604482526124da60648361019c565b6125bf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7bffffffffffffffff000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9160a01b16911681018091116125535790565b6124df565b90919273ffffffffffffffffffffffffffffffffffffffff6101ec9481604051957f23b872dd0000000000000000000000000000000000000000000000000000000060208801521660248601521660448401526064830152606482526124da60848361019c565b73ffffffffffffffffffffffffffffffffffffffff61262f9116916040926000808551936125ed878661019c565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af1612629611ec4565b91612934565b8051908161263c57505050565b60208061264d938301019101611ac5565b156126555750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b8054821015611ff05760005260206000200190600090565b91612728918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b80548015612790577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061276182826126d8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008181526005602052604090205490811561289c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019082821161255357600454927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff840193841161255357838360009561285b9503612861575b50505061284a600461272c565b600590600052602052604060002090565b55600190565b61284a61288d916128836128796128939560046126d8565b90549060031b1c90565b92839160046126d8565b906126f0565b5538808061283d565b5050600090565b60008181526005602052604090205461292e5760045468010000000000000000811015610197576129156128e082600185940160045560046126d8565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600454906000526005602052604060002055600190565b50600090565b919290156129af5750815115612948575090565b3b156129515790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156129c25750805190602001fd5b6129f8906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301610296565b0390fdfea164736f6c634300081a000a",
}
var RouterABI = RouterMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/token_admin_registry/token_admin_registry.go b/core/gethwrappers/ccip/generated/token_admin_registry/token_admin_registry.go
index 4e1a15ce60f..d9883e72250 100644
--- a/core/gethwrappers/ccip/generated/token_admin_registry/token_admin_registry.go
+++ b/core/gethwrappers/ccip/generated/token_admin_registry/token_admin_registry.go
@@ -37,8 +37,8 @@ type TokenAdminRegistryTokenConfig struct {
}
var TokenAdminRegistryMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"AlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidTokenPoolToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"OnlyAdministrator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"OnlyPendingAdministrator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"OnlyRegistryModuleOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"currentAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdministratorTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdministratorTransferred\",\"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\":true,\"internalType\":\"address\",\"name\":\"previousPool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\"}],\"name\":\"PoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"RegistryModuleAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"RegistryModuleRemoved\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"name\":\"acceptAdminRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"addRegistryModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"startIndex\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxCount\",\"type\":\"uint64\"}],\"name\":\"getAllConfiguredTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPool\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getPools\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pendingAdministrator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenPool\",\"type\":\"address\"}],\"internalType\":\"structTokenAdminRegistry.TokenConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"}],\"name\":\"isAdministrator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"isRegistryModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"}],\"name\":\"proposeAdministrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"removeRegistryModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"setPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"transferAdminRole\",\"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: "0x608060405234801561001057600080fd5b503360008161003257604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156100625761006281610069565b50506100e2565b336001600160a01b0382160361009257604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6113b9806100f16000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80637d3f255211610097578063cb67e3b111610066578063cb67e3b1146102bc578063ddadfa8e14610374578063e677ae3714610387578063f2fde38b1461039a57600080fd5b80637d3f2552146101e05780638da5cb5b14610203578063bbe4f6db14610242578063c1af6e031461027f57600080fd5b80634e847fc7116100d35780634e847fc7146101925780635e63547a146101a557806372d64a81146101c557806379ba5097146101d857600080fd5b806310cbcf1814610105578063156194da1461011a578063181f5a771461012d5780633dc457721461017f575b600080fd5b6101186101133660046110dc565b6103ad565b005b6101186101283660046110dc565b61040a565b6101696040518060400160405280601881526020017f546f6b656e41646d696e526567697374727920312e352e30000000000000000081525081565b60405161017691906110f7565b60405180910390f35b61011861018d3660046110dc565b61050f565b6101186101a0366004611164565b610573565b6101b86101b3366004611197565b6107d3565b604051610176919061120c565b6101b86101d336600461127e565b6108cc565b6101186109e2565b6101f36101ee3660046110dc565b610ab0565b6040519015158152602001610176565b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610176565b61021d6102503660046110dc565b73ffffffffffffffffffffffffffffffffffffffff908116600090815260026020819052604090912001541690565b6101f361028d366004611164565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020526040902054821691161490565b6103356102ca3660046110dc565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff948516815260028084529084902084519283018552805486168352600181015486169383019390935291909101549092169082015290565b60408051825173ffffffffffffffffffffffffffffffffffffffff90811682526020808501518216908301529282015190921690820152606001610176565b610118610382366004611164565b610abd565b610118610395366004611164565b610bc7565b6101186103a83660046110dc565b610d8f565b6103b5610da0565b6103c0600582610df3565b156104075760405173ffffffffffffffffffffffffffffffffffffffff8216907f93eaa26dcb9275e56bacb1d33fdbf402262da6f0f4baf2a6e2cd154b73f387f890600090a25b50565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902060018101549091163314610493576040517f3edffe7500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201526044015b60405180910390fd5b8054337fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117835560018301805490921690915560405173ffffffffffffffffffffffffffffffffffffffff8416907f399b55200f7f639a63d76efe3dcfa9156ce367058d6b673041b84a628885f5a790600090a35050565b610517610da0565b610522600582610e1c565b156104075760405173ffffffffffffffffffffffffffffffffffffffff821681527f3cabf004338366bfeaeb610ad827cb58d16b588017c509501f2c97c83caae7b29060200160405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff80831660009081526002602052604090205483911633146105f3576040517fed5d85b500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8216602482015260440161048a565b73ffffffffffffffffffffffffffffffffffffffff8216158015906106a557506040517f240028e800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015283169063240028e890602401602060405180830381865afa15801561067f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a391906112a8565b155b156106f4576040517f962b60e600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161048a565b73ffffffffffffffffffffffffffffffffffffffff808416600090815260026020819052604090912090810180548584167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559192919091169081146107cc578373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f754449ec3aff3bd528bfce43ae9319c4a381b67fcd1d20097b3b24dacaecc35d60405160405180910390a45b5050505050565b606060008267ffffffffffffffff8111156107f0576107f06112ca565b604051908082528060200260200182016040528015610819578160200160208202803683370190505b50905060005b838110156108c2576002600086868481811061083d5761083d6112f9565b905060200201602081019061085291906110dc565b73ffffffffffffffffffffffffffffffffffffffff90811682526020820192909252604001600020600201548351911690839083908110610895576108956112f9565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161081f565b5090505b92915050565b606060006108da6003610e3e565b9050808467ffffffffffffffff16106108f357506108c6565b67ffffffffffffffff80841690829061090e90871683611357565b111561092b5761092867ffffffffffffffff86168361136a565b90505b8067ffffffffffffffff811115610944576109446112ca565b60405190808252806020026020018201604052801561096d578160200160208202803683370190505b50925060005b818110156109d95761099a6109928267ffffffffffffffff8916611357565b600390610e48565b8482815181106109ac576109ac6112f9565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101610973565b50505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a33576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006108c6600583610e54565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600260205260409020548391163314610b3d576040517fed5d85b500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8216602482015260440161048a565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600260205260408082206001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001695881695861790559051909392339290917fc54c3051ff16e63bb9203214432372aca006c589e3653619b577a3265675b7169190a450505050565b610bd033610ab0565b158015610bf5575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15610c2e576040517f51ca1ec300000000000000000000000000000000000000000000000000000000815233600482015260240161048a565b73ffffffffffffffffffffffffffffffffffffffff8116610c7b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600260205260409020805490911615610cf5576040517f45ed80e900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161048a565b6001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055610d42600384610e1c565b5060405173ffffffffffffffffffffffffffffffffffffffff808416916000918616907fc54c3051ff16e63bb9203214432372aca006c589e3653619b577a3265675b716908390a4505050565b610d97610da0565b61040781610e83565b60015473ffffffffffffffffffffffffffffffffffffffff163314610df1576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000610e158373ffffffffffffffffffffffffffffffffffffffff8416610f47565b9392505050565b6000610e158373ffffffffffffffffffffffffffffffffffffffff841661103a565b60006108c6825490565b6000610e158383611089565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610e15565b3373ffffffffffffffffffffffffffffffffffffffff821603610ed2576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120548015611030576000610f6b60018361136a565b8554909150600090610f7f9060019061136a565b9050808214610fe4576000866000018281548110610f9f57610f9f6112f9565b9060005260206000200154905080876000018481548110610fc257610fc26112f9565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ff557610ff561137d565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108c6565b60009150506108c6565b6000818152600183016020526040812054611081575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108c6565b5060006108c6565b60008260000182815481106110a0576110a06112f9565b9060005260206000200154905092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146110d757600080fd5b919050565b6000602082840312156110ee57600080fd5b610e15826110b3565b60006020808352835180602085015260005b8181101561112557858101830151858201604001528201611109565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b6000806040838503121561117757600080fd5b611180836110b3565b915061118e602084016110b3565b90509250929050565b600080602083850312156111aa57600080fd5b823567ffffffffffffffff808211156111c257600080fd5b818501915085601f8301126111d657600080fd5b8135818111156111e557600080fd5b8660208260051b85010111156111fa57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b8181101561125a57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611228565b50909695505050505050565b803567ffffffffffffffff811681146110d757600080fd5b6000806040838503121561129157600080fd5b61129a83611266565b915061118e60208401611266565b6000602082840312156112ba57600080fd5b81518015158114610e1557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156108c6576108c6611328565b818103818111156108c6576108c6611328565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"function\",\"name\":\"acceptAdminRole\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRegistryModule\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllConfiguredTokens\",\"inputs\":[{\"name\":\"startIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPool\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPools\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenConfig\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTokenAdminRegistry.TokenConfig\",\"components\":[{\"name\":\"administrator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdministrator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPool\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdministrator\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"administrator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRegistryModule\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeAdministrator\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"administrator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRegistryModule\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPool\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pool\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferAdminRole\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdministratorTransferRequested\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdministratorTransferred\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PoolSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousPool\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPool\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RegistryModuleAdded\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RegistryModuleRemoved\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyRegistered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenPoolToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAdministrator\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPendingAdministrator\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyRegistryModuleOrOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]",
+ Bin: "0x60808060405234603d573315602c57600180546001600160a01b031916331790556114a790816100438239f35b639b15e16f60e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806310cbcf1814610e82578063156194da14610d45578063181f5a7714610c335780633dc4577214610ba25780634e847fc7146109b65780635e63547a146108be57806372d64a811461084957806379ba5097146107605780637d3f2552146106f15780638da5cb5b1461069f578063bbe4f6db14610621578063c1af6e0314610587578063cb67e3b1146104b5578063ddadfa8e14610385578063e677ae37146101c15763f2fde38b146100cc57600080fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610118610f0d565b6101206111e7565b1633811461019257807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc576101f8610f0d565b610200610f30565b610217336000526006602052604060002054151590565b1580610363575b6103355773ffffffffffffffffffffffffffffffffffffffff1690811561030b5773ffffffffffffffffffffffffffffffffffffffff16806000526002602052604060002073ffffffffffffffffffffffffffffffffffffffff8154166102dd5760010180547fffffffffffffffffffffffff000000000000000000000000000000000000000016831790556000906102b681611440565b507fc54c3051ff16e63bb9203214432372aca006c589e3653619b577a3265675b7168280a4005b507f45ed80e90000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fd92e233d0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f51ca1ec3000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b5073ffffffffffffffffffffffffffffffffffffffff6001541633141561021e565b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc576103bc610f0d565b73ffffffffffffffffffffffffffffffffffffffff6103d9610f30565b91169081600052600260205273ffffffffffffffffffffffffffffffffffffffff6040600020541633036104835773ffffffffffffffffffffffffffffffffffffffff9082600052600260205260016040600020018282167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055169033907fc54c3051ff16e63bb9203214432372aca006c589e3653619b577a3265675b716600080a4005b507fed5d85b5000000000000000000000000000000000000000000000000000000006000523360045260245260446000fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610501610f0d565b60006040805161051081610f53565b82815282602082015201521660005260026020526060604060002073ffffffffffffffffffffffffffffffffffffffff60405161054c81610f53565b818084541693848352604082600281600185015416936020870194855201541693019283526040519485525116602084015251166040820152f35b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5760206105c0610f0d565b73ffffffffffffffffffffffffffffffffffffffff6105dd610f30565b91166000526002825273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff6040519216148152f35b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff61066d610f0d565b166000526002602052602073ffffffffffffffffffffffffffffffffffffffff60026040600020015416604051908152f35b346101bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc57602061075673ffffffffffffffffffffffffffffffffffffffff610742610f0d565b166000526006602052604060002054151590565b6040519015158152f35b346101bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5760005473ffffffffffffffffffffffffffffffffffffffff8116330361081f577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5760043567ffffffffffffffff811681036101bc576024359067ffffffffffffffff821682036101bc576108ba916108ae916110e6565b60405191829182610fb0565b0390f35b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5760043567ffffffffffffffff81116101bc57366023820112156101bc57806004013567ffffffffffffffff81116101bc573660248260051b840101116101bc5761093681611018565b60005b828110156109a857600060248260051b8601013573ffffffffffffffffffffffffffffffffffffffff81168091036109a457600260408373ffffffffffffffffffffffffffffffffffffffff936001969552826020522001541661099d8285611067565b5201610939565b5080fd5b604051806108ba8482610fb0565b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc576109ed610f0d565b73ffffffffffffffffffffffffffffffffffffffff610a0a610f30565b91169081600052600260205273ffffffffffffffffffffffffffffffffffffffff6040600020541633036104835773ffffffffffffffffffffffffffffffffffffffff169081151580610b0c575b610adf5780600052600260205260026040600020019073ffffffffffffffffffffffffffffffffffffffff82541691837fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055828203610ab857005b7f754449ec3aff3bd528bfce43ae9319c4a381b67fcd1d20097b3b24dacaecc35d600080a4005b7f962b60e60000000000000000000000000000000000000000000000000000000060005260045260246000fd5b506040517f240028e8000000000000000000000000000000000000000000000000000000008152816004820152602081602481865afa908115610b9657600091610b58575b5015610a58565b6020813d602011610b8e575b81610b7160209383610f6f565b810103126109a45751908115158203610b8b575083610b51565b80fd5b3d9150610b64565b6040513d6000823e3d90fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610bee610f0d565b610bf66111e7565b16610c00816113e0565b610c0657005b60207f3cabf004338366bfeaeb610ad827cb58d16b588017c509501f2c97c83caae7b291604051908152a1005b346101bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc576040516040810181811067ffffffffffffffff821117610d1657604052601881527f546f6b656e41646d696e526567697374727920312e352e300000000000000000602082015260405190602082528181519182602083015260005b838110610cfe5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610cbe565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610d91610f0d565b168060005260026020526040600020600181019073ffffffffffffffffffffffffffffffffffffffff8254163303610e505773ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fffffffffffffffffffffffff0000000000000000000000000000000000000000815416905533907f399b55200f7f639a63d76efe3dcfa9156ce367058d6b673041b84a628885f5a7600080a3005b827f3edffe75000000000000000000000000000000000000000000000000000000006000523360045260245260446000fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610ece610f0d565b610ed66111e7565b16610ee08161124a565b610ee657005b7f93eaa26dcb9275e56bacb1d33fdbf402262da6f0f4baf2a6e2cd154b73f387f8600080a2005b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101bc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101bc57565b6060810190811067ffffffffffffffff821117610d1657604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d1657604052565b602060408183019282815284518094520192019060005b818110610fd45750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101610fc7565b67ffffffffffffffff8111610d165760051b60200190565b9061102282611000565b61102f6040519182610f6f565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061105d8294611000565b0190602036910137565b805182101561107b5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919082018092116110b757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff600354911691818310156111df5767ffffffffffffffff16908061111384846110aa565b116111ce575b509061112482611018565b91600091600354925b82811061113b575050505090565b61114581836110aa565b6000858210156111a157600390527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01546001919073ffffffffffffffffffffffffffffffffffffffff1661119a8288611067565b520161112d565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b828103915081116110b75738611119565b505050606090565b73ffffffffffffffffffffffffffffffffffffffff60015416330361120857565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b805482101561107b5760005260206000200190600090565b60008181526006602052604090205480156113d9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116110b757600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116110b75781810361136a575b505050600554801561133b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016112f8816005611232565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6113c161137b61138c936005611232565b90549060031b1c9283926005611232565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260066020526040600020553880806112bf565b5050600090565b8060005260066020526040600020541560001461143a5760055468010000000000000000811015610d165761142161138c8260018594016005556005611232565b9055600554906000526006602052604060002055600190565b50600090565b8060005260046020526040600020541560001461143a5760035468010000000000000000811015610d165761148161138c8260018594016003556003611232565b905560035490600052600460205260406000205560019056fea164736f6c634300081a000a",
}
var TokenAdminRegistryABI = TokenAdminRegistryMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/token_pool/token_pool.go b/core/gethwrappers/ccip/generated/token_pool/token_pool.go
index c7c947d8636..587f4ebb84b 100644
--- a/core/gethwrappers/ccip/generated/token_pool/token_pool.go
+++ b/core/gethwrappers/ccip/generated/token_pool/token_pool.go
@@ -81,7 +81,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\":[],\"name\":\"CannotTransferToSelf\",\"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\":[{\"internalType\":\"uint8\",\"name\":\"expected\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"actual\",\"type\":\"uint8\"}],\"name\":\"InvalidDecimalArgs\",\"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\":\"sourcePoolData\",\"type\":\"bytes\"}],\"name\":\"InvalidRemoteChainDecimals\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidRemotePoolForChain\",\"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\":\"MismatchedArrayLengths\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"remoteDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"localDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"remoteAmount\",\"type\":\"uint256\"}],\"name\":\"OverflowDetected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"PoolAlreadyAdded\",\"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\":false,\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"RateLimitAdminSet\",\"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\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolRemoved\",\"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\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"addRemotePool\",\"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\":[{\"internalType\":\"uint64[]\",\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes[]\",\"name\":\"remotePoolAddresses\",\"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\":\"chainsToAdd\",\"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\":\"getRemotePools\",\"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\":\"getTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"isRemotePool\",\"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\":\"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\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"removeRemotePool\",\"outputs\":[],\"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\":\"remoteChainSelectors\",\"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\":\"outboundConfigs\",\"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\":\"inboundConfigs\",\"type\":\"tuple[]\"}],\"name\":\"setChainRateLimiterConfigs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"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: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"lockOrBurnOut\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
}
var TokenPoolABI = TokenPoolMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/usdc_reader_tester/usdc_reader_tester.go b/core/gethwrappers/ccip/generated/usdc_reader_tester/usdc_reader_tester.go
index f9bd3b56efa..ab8002c05eb 100644
--- a/core/gethwrappers/ccip/generated/usdc_reader_tester/usdc_reader_tester.go
+++ b/core/gethwrappers/ccip/generated/usdc_reader_tester/usdc_reader_tester.go
@@ -31,8 +31,8 @@ var (
)
var USDCReaderTesterMetaData = &bind.MetaData{
- ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"MessageSent\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"sourceDomain\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destinationDomain\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"recipient\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"destinationCaller\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"messageBody\",\"type\":\"bytes\"}],\"name\":\"emitMessageSent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b5061032c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806362826f1814610030575b600080fd5b61004361003e366004610129565b610045565b005b600061008d8a8a8a87898c8c8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506100d292505050565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036816040516100be9190610228565b60405180910390a150505050505050505050565b606088888888888888886040516020016100f3989796959493929190610279565b604051602081830303815290604052905098975050505050505050565b803563ffffffff8116811461012457600080fd5b919050565b60008060008060008060008060006101008a8c03121561014857600080fd5b6101518a610110565b985061015f60208b01610110565b975061016d60408b01610110565b965060608a0135955060808a0135945060a08a0135935060c08a013567ffffffffffffffff80821682146101a057600080fd5b90935060e08b013590808211156101b657600080fd5b818c0191508c601f8301126101ca57600080fd5b8135818111156101d957600080fd5b8d60208285010111156101eb57600080fd5b6020830194508093505050509295985092959850929598565b60005b8381101561021f578181015183820152602001610207565b50506000910152565b6020815260008251806020840152610247816040850160208701610204565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60007fffffffff00000000000000000000000000000000000000000000000000000000808b60e01b168352808a60e01b166004840152808960e01b166008840152507fffffffffffffffff0000000000000000000000000000000000000000000000008760c01b16600c830152856014830152846034830152836054830152825161030b816074850160208701610204565b91909101607401999850505050505050505056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"function\",\"name\":\"emitMessageSent\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceDomain\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destinationDomain\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"recipient\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageBody\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false}]",
+ Bin: "0x6080806040523460155761034b908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c6362826f181461002857600080fd5b346102a6576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a65760043563ffffffff811681036102a65760243563ffffffff811681036102a6576044359063ffffffff821682036102a65760c4359367ffffffffffffffff851685036102a65760e4359067ffffffffffffffff82116102a657366023830112156102a65781600401359567ffffffffffffffff87116102a65736602488850101116102a657600087601f8299017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200161011490856102ab565b8084528060208501956024018637830160200152604051948594602086019760e01b7fffffffff0000000000000000000000000000000000000000000000000000000016885260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602486015260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602885015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016602c84015260a435603484015260643560548401526084356074840152519081609484016102009261031b565b8101036094017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101825261023590826102ab565b60405191829160208352519081602084015281604084016102559261031b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101036040017f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03691a180f35b600080fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102ec57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811061032e5750506000910152565b818101518382015260200161031e56fea164736f6c634300081a000a",
}
var USDCReaderTesterABI = USDCReaderTesterMetaData.ABI
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 fb9493b24ac..5e07dde287f 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
@@ -94,8 +94,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\":[],\"name\":\"CannotTransferToSelf\",\"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\":\"uint8\",\"name\":\"expected\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"actual\",\"type\":\"uint8\"}],\"name\":\"InvalidDecimalArgs\",\"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\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"}],\"name\":\"InvalidRemoteChainDecimals\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidRemotePoolForChain\",\"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\":[],\"name\":\"MismatchedArrayLengths\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"remoteDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"localDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"remoteAmount\",\"type\":\"uint256\"}],\"name\":\"OverflowDetected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"PoolAlreadyAdded\",\"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\":false,\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"RateLimitAdminSet\",\"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\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolRemoved\",\"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\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"addRemotePool\",\"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\":[{\"internalType\":\"uint64[]\",\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes[]\",\"name\":\"remotePoolAddresses\",\"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\":\"chainsToAdd\",\"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\":\"getRemotePools\",\"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\":\"getTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"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\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"isRemotePool\",\"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\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"removeRemotePool\",\"outputs\":[],\"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\":\"remoteChainSelectors\",\"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\":\"outboundConfigs\",\"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\":\"inboundConfigs\",\"type\":\"tuple[]\"}],\"name\":\"setChainRateLimiterConfigs\",\"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\":\"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: "0x6101606040523480156200001257600080fd5b506040516200573a3803806200573a833981016040819052620000359162000b93565b836006848484336000816200005d57604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b03848116919091179091558116156200009057620000908162000493565b50506001600160a01b0385161580620000b057506001600160a01b038116155b80620000c357506001600160a01b038216155b15620000e2576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03808616608081905290831660c0526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa92505050801562000152575060408051601f3d908101601f191682019092526200014f9181019062000cb9565b60015b1562000193578060ff168560ff161462000191576040516332ad3e0760e11b815260ff8087166004830152821660248201526044015b60405180910390fd5b505b60ff841660a052600480546001600160a01b0319166001600160a01b038316179055825115801560e052620001dd57604080516000815260208101909152620001dd90846200050d565b5050506001600160a01b03871691506200020c9050576040516306b7c75960e31b815260040160405180910390fd5b6000856001600160a01b0316632c1219216040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200024d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000273919062000ce5565b90506000816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002dc919062000d05565b905063ffffffff8116156200030d576040516334697c6b60e11b815263ffffffff8216600482015260240162000188565b6000876001600160a01b0316639cdbb1816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200034e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000374919062000d05565b905063ffffffff811615620003a5576040516316ba39c560e31b815263ffffffff8216600482015260240162000188565b6001600160a01b038089166101005283166101208190526040805163234d8e3d60e21b81529051638d3638f4916004808201926020929091908290030181865afa158015620003f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041e919062000d05565b63ffffffff16610140526101005160805162000449916001600160a01b03909116906000196200066a565b6040516001600160a01b03891681527f2e902d38f15b233cbb63711add0fca4545334d3a169d60c0a616494d7eea95449060200160405180910390a1505050505050505062000e52565b336001600160a01b03821603620004bd57604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e0516200052e576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620005b957600083828151811062000552576200055262000d2d565b602090810291909101015190506200056c60028262000750565b15620005af576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010162000531565b5060005b815181101562000665576000828281518110620005de57620005de62000d2d565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200060a57506200065c565b6200061760028262000770565b156200065a576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620005bd565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620006bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006e2919062000d43565b620006ee919062000d73565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200074a918691906200078716565b50505050565b600062000767836001600160a01b03841662000858565b90505b92915050565b600062000767836001600160a01b0384166200095c565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620007d6906001600160a01b038516908490620009ae565b805190915015620006655780806020019051810190620007f7919062000d89565b620006655760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000188565b60008181526001830160205260408120548015620009515760006200087f60018362000dad565b8554909150600090620008959060019062000dad565b905080821462000901576000866000018281548110620008b957620008b962000d2d565b9060005260206000200154905080876000018481548110620008df57620008df62000d2d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000915576200091562000dc3565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200076a565b60009150506200076a565b6000818152600183016020526040812054620009a5575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200076a565b5060006200076a565b6060620009bf8484600085620009c7565b949350505050565b60608247101562000a2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000188565b600080866001600160a01b0316858760405162000a48919062000dff565b60006040518083038185875af1925050503d806000811462000a87576040519150601f19603f3d011682016040523d82523d6000602084013e62000a8c565b606091505b50909250905062000aa08783838762000aab565b979650505050505050565b6060831562000b1f57825160000362000b17576001600160a01b0385163b62000b175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000188565b5081620009bf565b620009bf838381511562000b365781518083602001fd5b8060405162461bcd60e51b815260040162000188919062000e1d565b6001600160a01b038116811462000b6857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000b8e8162000b52565b919050565b600080600080600060a0868803121562000bac57600080fd5b855162000bb98162000b52565b8095505060208087015162000bce8162000b52565b60408801519095506001600160401b038082111562000bec57600080fd5b818901915089601f83011262000c0157600080fd5b81518181111562000c165762000c1662000b6b565b8060051b604051601f19603f8301168101818110858211171562000c3e5762000c3e62000b6b565b60405291825284820192508381018501918c83111562000c5d57600080fd5b938501935b8285101562000c865762000c768562000b81565b8452938501939285019262000c62565b80985050505050505062000c9d6060870162000b81565b915062000cad6080870162000b81565b90509295509295909350565b60006020828403121562000ccc57600080fd5b815160ff8116811462000cde57600080fd5b9392505050565b60006020828403121562000cf857600080fd5b815162000cde8162000b52565b60006020828403121562000d1857600080fd5b815163ffffffff8116811462000cde57600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000d5657600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156200076a576200076a62000d5d565b60006020828403121562000d9c57600080fd5b8151801515811462000cde57600080fd5b818103818111156200076a576200076a62000d5d565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000df657818101518382015260200162000ddc565b50506000910152565b6000825162000e1381846020870162000dd9565b9190910192915050565b602081526000825180602084015262000e3e81604085016020870162000dd9565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161483262000f0860003960008181610432015281816112c40152818161228f01526122ed0152600081816107590152610aa30152600081816103f801526111da01526000818161070a015281816123a50152612ef60152600081816106460152818161203c015261277b015260006103810152600081816102e80152818161033d015281816111a401528181612cea01526130e101526148326000f3fe608060405234801561001057600080fd5b506004361061025b5760003560e01c80639a4575b911610145578063c4bffe2b116100bd578063dfadfa351161008c578063e8a1da1711610071578063e8a1da171461072e578063f2fde38b14610741578063fbf84dd71461075457600080fd5b8063dfadfa351461066a578063e0351e131461070857600080fd5b8063c4bffe2b14610609578063c75eea9c1461061e578063cf7401f314610631578063dc0bd9711461064457600080fd5b8063acfecf9111610114578063b0f479a1116100f9578063b0f479a1146105c5578063b7946580146105e3578063c0d78655146105f657600080fd5b8063acfecf9114610543578063af58d59f1461055657600080fd5b80639a4575b9146104e65780639fdf13ff14610506578063a42a7b8b1461050e578063a7cd63b71461052e57600080fd5b80636155cda0116101d857806379ba5097116101a75780638926f54f1161018c5780638926f54f146104a25780638da5cb5b146104b5578063962d4020146104d357600080fd5b806379ba5097146104875780637d54534e1461048f57600080fd5b80636155cda0146103f357806362ddd3c41461041a5780636b716b0d1461042d5780636d3d1a581461046957600080fd5b8063240028e81161022f578063390775371161021457806339077537146103ab5780634c5ef0ed146103cd57806354c8a4f3146103e057600080fd5b8063240028e81461032d57806324f65ee71461037a57600080fd5b806241d3c11461026057806301ffc9a714610275578063181f5a771461029d57806321df0da7146102e6575b600080fd5b61027361026e3660046136ff565b61077b565b005b610288610283366004613774565b610918565b60405190151581526020015b60405180910390f35b6102d96040518060400160405280601381526020017f55534443546f6b656e506f6f6c20312e352e310000000000000000000000000081525081565b604051610294919061381a565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610294565b61028861033b36600461384f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610294565b6103be6103b936600461386c565b6109fd565b60405190518152602001610294565b6102886103db3660046138be565b610be2565b6102736103ee36600461398f565b610c2c565b6103087f000000000000000000000000000000000000000000000000000000000000000081565b6102736104283660046138be565b610ca7565b6104547f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610294565b60095473ffffffffffffffffffffffffffffffffffffffff16610308565b610273610d3f565b61027361049d36600461384f565b610e0d565b6102886104b03660046139fb565b610e8e565b60015473ffffffffffffffffffffffffffffffffffffffff16610308565b6102736104e1366004613a5d565b610ea5565b6104f96104f4366004613af7565b610fff565b6040516102949190613b32565b610454600081565b61052161051c3660046139fb565b61133f565b6040516102949190613b89565b6105366114aa565b6040516102949190613c0b565b6102736105513660046138be565b6114bb565b6105696105643660046139fb565b6115d3565b604051610294919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610308565b6102d96105f13660046139fb565b6116a8565b61027361060436600461384f565b611758565b61061161182c565b6040516102949190613c65565b61056961062c3660046139fb565b6118e4565b61027361063f366004613df2565b6119b6565b7f0000000000000000000000000000000000000000000000000000000000000000610308565b6106de6106783660046139fb565b60408051606080820183526000808352602080840182905292840181905267ffffffffffffffff949094168452600a82529282902082519384018352805484526001015463ffffffff811691840191909152640100000000900460ff1615159082015290565b604080518251815260208084015163ffffffff169082015291810151151590820152606001610294565b7f0000000000000000000000000000000000000000000000000000000000000000610288565b61027361073c36600461398f565b611a3a565b61027361074f36600461384f565b611f4c565b6103087f000000000000000000000000000000000000000000000000000000000000000081565b610783611f60565b60005b818110156108da5760008383838181106107a2576107a2613e39565b9050608002018036038101906107b89190613e7c565b805190915015806107d55750604081015167ffffffffffffffff16155b1561084457604080517fa087bd2900000000000000000000000000000000000000000000000000000000815282516004820152602083015163ffffffff1660248201529082015167ffffffffffffffff1660448201526060820151151560648201526084015b60405180910390fd5b60408051606080820183528351825260208085015163ffffffff9081168285019081529286015115158486019081529585015167ffffffffffffffff166000908152600a90925293902091518255516001918201805494511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000909516919093161792909217905501610786565b507f1889010d2535a0ab1643678d1da87fbbe8b87b2f585b47ddb72ec622aef9ee56828260405161090c929190613ef6565b60405180910390a15050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806109ab57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806109f757507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b604080516020810190915260008152610a1582611fb3565b6000610a2460c0840184613f7d565b810190610a319190613fe2565b90506000610a4260e0850185613f7d565b810190610a4f91906140af565b9050610a5f8160000151836121d7565b805160208201516040517f57ecfd2800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016926357ecfd2892610ad692600401614140565b6020604051808303816000875af1158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b199190614165565b610b4f576040517fbf969f2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b5f606085016040860161384f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f08660600135604051610bc191815260200190565b60405180910390a35050604080516020810190915260609092013582525090565b6000610c248383604051610bf7929190614182565b604080519182900390912067ffffffffffffffff8716600090815260076020529190912060050190612388565b949350505050565b610c34611f60565b610ca1848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208088028281018201909352878252909350879250869182918501908490808284376000920191909152506123a392505050565b50505050565b610caf611f60565b610cb883610e8e565b610cfa576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161083b565b610d3a8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061255992505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d90576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e15611f60565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d091749060200160405180910390a150565b60006109f7600567ffffffffffffffff8416612388565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590610ee5575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15610f1e576040517f8e4a23d600000000000000000000000000000000000000000000000000000000815233600482015260240161083b565b8483141580610f2d5750848114155b15610f64576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b85811015610ff657610fee878783818110610f8457610f84613e39565b9050602002016020810190610f9991906139fb565b868684818110610fab57610fab613e39565b905060600201803603810190610fc19190614192565b858585818110610fd357610fd3613e39565b905060600201803603810190610fe99190614192565b612653565b600101610f67565b50505050505050565b604080518082019091526060808252602082015261101c8261273d565b6000600a8161103160408601602087016139fb565b67ffffffffffffffff168152602080820192909252604090810160002081516060810183528154815260019091015463ffffffff81169382019390935264010000000090920460ff1615159082018190529091506110d85761109960408401602085016139fb565b6040517fd201c48a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161083b565b6110e28380613f7d565b9050602014611129576110f58380613f7d565b6040517fa3c8cf0900000000000000000000000000000000000000000000000000000000815260040161083b9291906141f7565b60006111358480613f7d565b810190611142919061420b565b602083015183516040517ff856ddb60000000000000000000000000000000000000000000000000000000081526060880135600482015263ffffffff90921660248301526044820183905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116606484015260848301919091529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f856ddb69060a4016020604051808303816000875af1158015611223573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112479190614224565b6040516060870135815290915033907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a260405180604001604052806112a48760200160208101906105f191906139fb565b815260408051808201825267ffffffffffffffff851680825263ffffffff7f00000000000000000000000000000000000000000000000000000000000000008116602093840190815284518085019390935251169281019290925290910190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905295945050505050565b67ffffffffffffffff8116600090815260076020526040812060609190611368906005016128c9565b90506000815167ffffffffffffffff81111561138657611386613ca7565b6040519080825280602002602001820160405280156113b957816020015b60608152602001906001900390816113a45790505b50905060005b82518110156114a257600860008483815181106113de576113de613e39565b6020026020010151815260200190815260200160002080546113ff90614241565b80601f016020809104026020016040519081016040528092919081815260200182805461142b90614241565b80156114785780601f1061144d57610100808354040283529160200191611478565b820191906000526020600020905b81548152906001019060200180831161145b57829003601f168201915b505050505082828151811061148f5761148f613e39565b60209081029190910101526001016113bf565b509392505050565b60606114b660026128c9565b905090565b6114c3611f60565b6114cc83610e8e565b61150e576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161083b565b61154e8282604051611521929190614182565b604080519182900390912067ffffffffffffffff86166000908152600760205291909120600501906128d6565b61158a578282826040517f74f23c7c00000000000000000000000000000000000000000000000000000000815260040161083b93929190614294565b8267ffffffffffffffff167f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7683836040516115c69291906141f7565b60405180910390a2505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526109f7906128e2565b67ffffffffffffffff811660009081526007602052604090206004018054606091906116d390614241565b80601f01602080910402602001604051908101604052809291908181526020018280546116ff90614241565b801561174c5780601f106117215761010080835404028352916020019161174c565b820191906000526020600020905b81548152906001019060200180831161172f57829003601f168201915b50505050509050919050565b611760611f60565b73ffffffffffffffffffffffffffffffffffffffff81166117ad576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910161090c565b6060600061183a60056128c9565b90506000815167ffffffffffffffff81111561185857611858613ca7565b604051908082528060200260200182016040528015611881578160200160208202803683370190505b50905060005b82518110156118dd578281815181106118a2576118a2613e39565b60200260200101518282815181106118bc576118bc613e39565b67ffffffffffffffff90921660209283029190910190910152600101611887565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526109f7906128e2565b60095473ffffffffffffffffffffffffffffffffffffffff1633148015906119f6575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15611a2f576040517f8e4a23d600000000000000000000000000000000000000000000000000000000815233600482015260240161083b565b610d3a838383612653565b611a42611f60565b60005b83811015611c2f576000858583818110611a6157611a61613e39565b9050602002016020810190611a7691906139fb565b9050611a8d600567ffffffffffffffff83166128d6565b611acf576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161083b565b67ffffffffffffffff81166000908152600760205260408120611af4906005016128c9565b905060005b8151811015611b6057611b57828281518110611b1757611b17613e39565b6020026020010151600760008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206005016128d690919063ffffffff16565b50600101611af9565b5067ffffffffffffffff8216600090815260076020526040812080547fffffffffffffffffffffff00000000000000000000000000000000000000000090811682556001820183905560028201805490911690556003810182905590611bc96004830182613692565b6005820160008181611bdb82826136cc565b505060405167ffffffffffffffff871681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991694506020019250611c1d915050565b60405180910390a15050600101611a45565b5060005b81811015611f45576000838383818110611c4f57611c4f613e39565b9050602002810190611c6191906142b8565b611c6a90614395565b9050611c7b81606001516000612994565b611c8a81608001516000612994565b806040015151600003611cc9576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051611ce19060059067ffffffffffffffff16612ad1565b611d265780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161083b565b805167ffffffffffffffff16600090815260076020908152604091829020825160a08082018552606080870180518601516fffffffffffffffffffffffffffffffff90811680865263ffffffff42168689018190528351511515878b0181905284518a0151841686890181905294518b0151841660809889018190528954740100000000000000000000000000000000000000009283027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff7001000000000000000000000000000000008087027fffffffffffffffffffffffff000000000000000000000000000000000000000094851690981788178216929092178d5592810290971760018c01558c519889018d52898e0180518d01518716808b528a8e019590955280515115158a8f018190528151909d01518716988a01899052518d0151909516979098018790526002890180549a909102999093161717909416959095179092559092029091176003820155908201516004820190611ea9908261449d565b5060005b826020015151811015611eed57611ee5836000015184602001518381518110611ed857611ed8613e39565b6020026020010151612559565b600101611ead565b507f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c28260000151836040015184606001518560800151604051611f3394939291906145b7565b60405180910390a15050600101611c33565b5050505050565b611f54611f60565b611f5d81612add565b50565b60015473ffffffffffffffffffffffffffffffffffffffff163314611fb1576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611fc661033b60a083016080840161384f565b61202557611fda60a082016080830161384f565b6040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161083b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb61207160408401602085016139fb565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa1580156120e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121069190614165565b1561213d576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61215561215060408301602084016139fb565b612ba1565b61217561216860408301602084016139fb565b6103db60a0840184613f7d565b6121ba5761218660a0820182613f7d565b6040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161083b9291906141f7565b611f5d6121cd60408301602084016139fb565b8260600135612cc7565b600482015163ffffffff811615612222576040517f68d2f8d600000000000000000000000000000000000000000000000000000000815263ffffffff8216600482015260240161083b565b6008830151600c8401516014850151602085015163ffffffff80851691161461228d5760208501516040517fe366a11700000000000000000000000000000000000000000000000000000000815263ffffffff9182166004820152908416602482015260440161083b565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168263ffffffff1614612322576040517f77e4802600000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528316602482015260440161083b565b845167ffffffffffffffff8281169116146123805784516040517ff917ffea00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9182166004820152908216602482015260440161083b565b505050505050565b600081815260018301602052604081205415155b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006123fa576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561249057600083828151811061241a5761241a613e39565b60200260200101519050612438816002612d0e90919063ffffffff16565b156124875760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016123fd565b5060005b8151811015610d3a5760008282815181106124b1576124b1613e39565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124f55750612551565b612500600282612d30565b1561254f5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101612494565b8051600003612594576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208083019190912067ffffffffffffffff84166000908152600790925260409091206125c69060050182612ad1565b6126005782826040517f393b8ad200000000000000000000000000000000000000000000000000000000815260040161083b929190614650565b6000818152600860205260409020612618838261449d565b508267ffffffffffffffff167f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea836040516115c6919061381a565b61265c83610e8e565b61269e576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161083b565b6126a9826000612994565b67ffffffffffffffff831660009081526007602052604090206126cc9083612d52565b6126d7816000612994565b67ffffffffffffffff831660009081526007602052604090206126fd9060020182612d52565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b83838360405161273093929190614673565b60405180910390a1505050565b61275061033b60a083016080840161384f565b61276457611fda60a082016080830161384f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb6127b060408401602085016139fb565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015612821573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128459190614165565b1561287c576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289461288f606083016040840161384f565b612ef4565b6128ac6128a760408301602084016139fb565b612f73565b611f5d6128bf60408301602084016139fb565b82606001356130c1565b6060600061239c83613105565b600061239c8383613160565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261297082606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426129549190614725565b85608001516fffffffffffffffffffffffffffffffff16613253565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b815115612a5f5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff161015806129ea575060408201516fffffffffffffffffffffffffffffffff16155b15612a2357816040517f8020d12400000000000000000000000000000000000000000000000000000000815260040161083b9190614738565b8015612a5b576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60408201516fffffffffffffffffffffffffffffffff16151580612a98575060208201516fffffffffffffffffffffffffffffffff1615155b15612a5b57816040517fd68af9cc00000000000000000000000000000000000000000000000000000000815260040161083b9190614738565b600061239c838361327b565b3373ffffffffffffffffffffffffffffffffffffffff821603612b2c576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b612baa81610e8e565b612bec576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161083b565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8f9190614165565b611f5d576040517f728fe07b00000000000000000000000000000000000000000000000000000000815233600482015260240161083b565b67ffffffffffffffff82166000908152600760205260409020612a5b90600201827f00000000000000000000000000000000000000000000000000000000000000006132ca565b600061239c8373ffffffffffffffffffffffffffffffffffffffff8416613160565b600061239c8373ffffffffffffffffffffffffffffffffffffffff841661327b565b8154600090612d7b90700100000000000000000000000000000000900463ffffffff1642614725565b90508015612e1d5760018301548354612dc3916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613253565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612e43916fffffffffffffffffffffffffffffffff908116911661364d565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612730908490614738565b7f000000000000000000000000000000000000000000000000000000000000000015611f5d57612f25600282613663565b611f5d576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260240161083b565b612f7c81610e8e565b612fbe576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161083b565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015613037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305b9190614774565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f5d576040517f728fe07b00000000000000000000000000000000000000000000000000000000815233600482015260240161083b565b67ffffffffffffffff82166000908152600760205260409020612a5b90827f00000000000000000000000000000000000000000000000000000000000000006132ca565b60608160000180548060200260200160405190810160405280929190818152602001828054801561174c57602002820191906000526020600020905b8154815260200190600101908083116131415750505050509050919050565b60008181526001830160205260408120548015613249576000613184600183614725565b855490915060009061319890600190614725565b90508082146131fd5760008660000182815481106131b8576131b8613e39565b90600052602060002001549050808760000184815481106131db576131db613e39565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061320e5761320e614791565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109f7565b60009150506109f7565b60006132728561326384866147c0565b61326d90876147d7565b61364d565b95945050505050565b60008181526001830160205260408120546132c2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109f7565b5060006109f7565b825474010000000000000000000000000000000000000000900460ff1615806132f1575081155b156132fb57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061334190700100000000000000000000000000000000900463ffffffff1642614725565b905080156134015781831115613383576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546133bd9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613253565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156134b85773ffffffffffffffffffffffffffffffffffffffff8416613460576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161083b565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161083b565b848310156135cb5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906134fc9082614725565b613506878a614725565b61351091906147d7565b61351a91906147ea565b905073ffffffffffffffffffffffffffffffffffffffff8616613573576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161083b565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161083b565b6135d58584614725565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081831061365c578161239c565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561239c565b50805461369e90614241565b6000825580601f106136ae575050565b601f016020900490600052602060002090810190611f5d91906136e6565b5080546000825590600052602060002090810190611f5d91905b5b808211156136fb57600081556001016136e7565b5090565b6000806020838503121561371257600080fd5b823567ffffffffffffffff8082111561372a57600080fd5b818501915085601f83011261373e57600080fd5b81358181111561374d57600080fd5b8660208260071b850101111561376257600080fd5b60209290920196919550909350505050565b60006020828403121561378657600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461239c57600080fd5b6000815180845260005b818110156137dc576020818501810151868301820152016137c0565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061239c60208301846137b6565b73ffffffffffffffffffffffffffffffffffffffff81168114611f5d57600080fd5b60006020828403121561386157600080fd5b813561239c8161382d565b60006020828403121561387e57600080fd5b813567ffffffffffffffff81111561389557600080fd5b8201610100818503121561239c57600080fd5b67ffffffffffffffff81168114611f5d57600080fd5b6000806000604084860312156138d357600080fd5b83356138de816138a8565b9250602084013567ffffffffffffffff808211156138fb57600080fd5b818601915086601f83011261390f57600080fd5b81358181111561391e57600080fd5b87602082850101111561393057600080fd5b6020830194508093505050509250925092565b60008083601f84011261395557600080fd5b50813567ffffffffffffffff81111561396d57600080fd5b6020830191508360208260051b850101111561398857600080fd5b9250929050565b600080600080604085870312156139a557600080fd5b843567ffffffffffffffff808211156139bd57600080fd5b6139c988838901613943565b909650945060208701359150808211156139e257600080fd5b506139ef87828801613943565b95989497509550505050565b600060208284031215613a0d57600080fd5b813561239c816138a8565b60008083601f840112613a2a57600080fd5b50813567ffffffffffffffff811115613a4257600080fd5b60208301915083602060608302850101111561398857600080fd5b60008060008060008060608789031215613a7657600080fd5b863567ffffffffffffffff80821115613a8e57600080fd5b613a9a8a838b01613943565b90985096506020890135915080821115613ab357600080fd5b613abf8a838b01613a18565b90965094506040890135915080821115613ad857600080fd5b50613ae589828a01613a18565b979a9699509497509295939492505050565b600060208284031215613b0957600080fd5b813567ffffffffffffffff811115613b2057600080fd5b820160a0818503121561239c57600080fd5b602081526000825160406020840152613b4e60608401826137b6565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084830301604085015261327282826137b6565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015613bfe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613bec8583516137b6565b94509285019290850190600101613bb2565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613c5957835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613c27565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613c5957835167ffffffffffffffff1683529284019291840191600101613c81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613cf957613cf9613ca7565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613d4657613d46613ca7565b604052919050565b8015158114611f5d57600080fd5b80356fffffffffffffffffffffffffffffffff81168114613d7c57600080fd5b919050565b600060608284031215613d9357600080fd5b6040516060810181811067ffffffffffffffff82111715613db657613db6613ca7565b6040529050808235613dc781613d4e565b8152613dd560208401613d5c565b6020820152613de660408401613d5c565b60408201525092915050565b600080600060e08486031215613e0757600080fd5b8335613e12816138a8565b9250613e218560208601613d81565b9150613e308560808601613d81565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b803563ffffffff81168114613d7c57600080fd5b600060808284031215613e8e57600080fd5b6040516080810181811067ffffffffffffffff82111715613eb157613eb1613ca7565b60405282358152613ec460208401613e68565b60208201526040830135613ed7816138a8565b60408201526060830135613eea81613d4e565b60608201529392505050565b6020808252818101839052600090604080840186845b87811015613f70578135835263ffffffff613f28868401613e68565b168584015283820135613f3a816138a8565b67ffffffffffffffff1683850152606082810135613f5781613d4e565b1515908401526080928301929190910190600101613f0c565b5090979650505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613fb257600080fd5b83018035915067ffffffffffffffff821115613fcd57600080fd5b60200191503681900382131561398857600080fd5b600060408284031215613ff457600080fd5b613ffc613cd6565b8235614007816138a8565b815261401560208401613e68565b60208201529392505050565b600082601f83011261403257600080fd5b813567ffffffffffffffff81111561404c5761404c613ca7565b61407d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613cff565b81815284602083860101111561409257600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156140c157600080fd5b813567ffffffffffffffff808211156140d957600080fd5b90830190604082860312156140ed57600080fd5b6140f5613cd6565b82358281111561410457600080fd5b61411087828601614021565b82525060208301358281111561412557600080fd5b61413187828601614021565b60208301525095945050505050565b60408152600061415360408301856137b6565b828103602084015261327281856137b6565b60006020828403121561417757600080fd5b815161239c81613d4e565b8183823760009101908152919050565b6000606082840312156141a457600080fd5b61239c8383613d81565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000610c246020830184866141ae565b60006020828403121561421d57600080fd5b5035919050565b60006020828403121561423657600080fd5b815161239c816138a8565b600181811c9082168061425557607f821691505b60208210810361428e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b67ffffffffffffffff841681526040602082015260006132726040830184866141ae565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18336030181126142ec57600080fd5b9190910192915050565b600082601f83011261430757600080fd5b8135602067ffffffffffffffff8083111561432457614324613ca7565b8260051b614333838201613cff565b938452858101830193838101908886111561434d57600080fd5b84880192505b858310156143895782358481111561436b5760008081fd5b6143798a87838c0101614021565b8352509184019190840190614353565b98975050505050505050565b600061012082360312156143a857600080fd5b60405160a0810167ffffffffffffffff82821081831117156143cc576143cc613ca7565b81604052843591506143dd826138a8565b908252602084013590808211156143f357600080fd5b6143ff368387016142f6565b6020840152604085013591508082111561441857600080fd5b5061442536828601614021565b6040830152506144383660608501613d81565b606082015261444a3660c08501613d81565b608082015292915050565b601f821115610d3a576000816000526020600020601f850160051c8101602086101561447e5750805b601f850160051c820191505b818110156123805782815560010161448a565b815167ffffffffffffffff8111156144b7576144b7613ca7565b6144cb816144c58454614241565b84614455565b602080601f83116001811461451e57600084156144e85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612380565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561456b5788860151825594840194600190910190840161454c565b50858210156145a757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff871683528060208401526145db818401876137b6565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506146199050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152613272565b67ffffffffffffffff83168152604060208201526000610c2460408301846137b6565b67ffffffffffffffff8416815260e081016146bf60208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152610c24565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156109f7576109f76146f6565b606081016109f782848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561478657600080fd5b815161239c8161382d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b80820281158282048414176109f7576109f76146f6565b808201808211156109f7576109f76146f6565b600082614820577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"tokenMessenger\",\"type\":\"address\",\"internalType\":\"contractITokenMessenger\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SUPPORTED_USDC_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDomain\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structUSDCTokenPool.Domain\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"domainIdentifier\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_localDomainIdentifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_messageTransmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIMessageTransmitter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_tokenMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractITokenMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDomains\",\"inputs\":[{\"name\":\"domains\",\"type\":\"tuple[]\",\"internalType\":\"structUSDCTokenPool.DomainUpdate[]\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"domainIdentifier\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"tokenMessenger\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DomainsSet\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structUSDCTokenPool.DomainUpdate[]\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"domainIdentifier\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidDestinationDomain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"got\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDomain\",\"inputs\":[{\"name\":\"domain\",\"type\":\"tuple\",\"internalType\":\"structUSDCTokenPool.DomainUpdate\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"domainIdentifier\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"type\":\"error\",\"name\":\"InvalidMessageVersion\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"got\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourceDomain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"got\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenMessengerVersion\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnknownDomain\",\"inputs\":[{\"name\":\"domain\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"UnlockingUSDCFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]",
+ Bin: "0x610160806040523461049b5761582d803803809161001d82856107dc565b8339810160a08282031261049b5781516001600160a01b0381169290919083830361049b5760208101516001600160a01b038116919082810361049b5760408201516001600160401b03811161049b5782019380601f8601121561049b578451946001600160401b0386116104a0578560051b9060208201966100a360405198896107dc565b875260208088019282010192831161049b57602001905b8282106107c4575050506100dc60806100d5606085016107ff565b93016107ff565b9233156107b357600180546001600160a01b03191633179055801580156107a2575b8015610791575b6107805760049260209260805260c0526040519283809263313ce56760e01b82525afa809160009161073d575b5090610719575b50600660a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526105f7575b5081156105e657604051632c12192160e01b8152602081600481865afa90811561050b576000916105ac575b5060405163054fd4d560e41b81526001600160a01b03919091169190602081600481865afa801561050b5763ffffffff9160009161058d575b5016806105795750604051639cdbb18160e01b8152602081600481875afa801561050b5763ffffffff9160009161055a575b50168061054657506004916020916101005280610120526040519283809263234d8e3d60e21b82525afa90811561050b57600091610517575b506101405260805161010051604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201819052939290911690602081604481855afa90811561050b576000916104d9575b5060001981018091116104c35760405190602082019463095ea7b360e01b865260248301526044820152604481526102c56064826107dc565b6000806040958651936102d888866107dc565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082865af13d156104b6573d906001600160401b0382116104a057855161034994909261033a601f8201601f1916602001856107dc565b83523d6000602085013e6109b9565b80518061041f575b837f2e902d38f15b233cbb63711add0fca4545334d3a169d60c0a616494d7eea95446020858351908152a151614da39081610a8a82396080518181816105fa0152818161069401528181611422015281816140080152614485015260a051816106fc015260c051818181612067015281816136710152613bb4015260e051818181610acd0152818161218d01526142de015261010051818181610ceb015261148501526101205181818161083c0152612710015261014051818181610dcd0152818161152e01526138140152f35b816020918101031261049b576020015180159081150361049b57610444573880610351565b815162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b91610349926060916109b9565b634e487b7160e01b600052601160045260246000fd5b90506020813d602011610503575b816104f4602093836107dc565b8101031261049b57513861028c565b3d91506104e7565b6040513d6000823e3d90fd5b610539915060203d60201161053f575b61053181836107dc565b810190610813565b3861023d565b503d610527565b6316ba39c560e31b60005260045260246000fd5b610573915060203d60201161053f5761053181836107dc565b38610204565b6334697c6b60e11b60005260045260246000fd5b6105a6915060203d60201161053f5761053181836107dc565b386101d2565b90506020813d6020116105de575b816105c7602093836107dc565b8101031261049b576105d8906107ff565b38610199565b3d91506105ba565b6306b7c75960e31b60005260046000fd5b906020906040519061060983836107dc565b60008252600036813760e051156107085760005b8251811015610684576001906001600160a01b0361063b828661082f565b51168561064782610871565b610654575b50500161061d565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388561064c565b5092905060005b81518110156106ff576001906001600160a01b036106a9828561082f565b511680156106f957846106bb82610959565b6106c9575b50505b0161068b565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138846106c0565b506106c3565b5050503861016d565b6335f4a7b360e01b60005260046000fd5b60ff1660068114610139576332ad3e0760e11b600052600660045260245260446000fd5b6020813d602011610778575b81610756602093836107dc565b8101031261077457519060ff82168203610771575038610132565b80fd5b5080fd5b3d9150610749565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b03831615610105565b506001600160a01b038416156100fe565b639b15e16f60e01b60005260046000fd5b602080916107d1846107ff565b8152019101906100ba565b601f909101601f19168101906001600160401b038211908210176104a057604052565b51906001600160a01b038216820361049b57565b9081602091031261049b575163ffffffff8116810361049b5790565b80518210156108435760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156108435760005260206000200190600090565b60008181526003602052604090205480156109525760001981018181116104c3576002546000198101919082116104c357818103610901575b50505060025480156108eb57600019016108c5816002610859565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61093a610912610923936002610859565b90549060031b1c9283926002610859565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806108aa565b5050600090565b806000526003602052604060002054156000146109b357600254680100000000000000008110156104a05761099a6109238260018594016002556002610859565b9055600254906000526003602052604060002055600190565b50600090565b91929015610a1b57508151156109cd575090565b3b156109d65790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610a2e5750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b838110610a715750508160006044809484010152601f80199101168101030190fd5b60208282018101516044878401015285935001610a4f56fe6080604052600436101561001257600080fd5b60003560e01c806241d3c11461025657806301ffc9a714610251578063181f5a771461024c57806321df0da714610247578063240028e81461024257806324f65ee71461023d57806339077537146102385780634c5ef0ed1461023357806354c8a4f31461022e5780636155cda01461022957806362ddd3c4146102245780636b716b0d1461021f5780636d3d1a581461021a57806379ba5097146102155780637d54534e146102105780638926f54f1461020b5780638da5cb5b14610206578063962d4020146102015780639a4575b9146101fc5780639fdf13ff146101f7578063a42a7b8b146101f2578063a7cd63b7146101ed578063acfecf91146101e8578063af58d59f146101e3578063b0f479a1146101de578063b7946580146101d9578063c0d78655146101d4578063c4bffe2b146101cf578063c75eea9c146101ca578063cf7401f3146101c5578063dc0bd971146101c0578063dfadfa35146101bb578063e0351e13146101b6578063e8a1da17146101b1578063f2fde38b146101ac5763fbf84dd7146101a757600080fd5b6126c5565b6125d1565b6121b2565b612157565b61208b565b61201c565b611f00565b611d9d565b611cec565b611bac565b611b57565b611af4565b611a2a565b6118fe565b61186c565b61174c565b611694565b6112ce565b6110bb565b611038565b610fdb565b610f2c565b610e43565b610df1565b610d92565b610d0f565b610ca0565b610a9b565b6109e1565b610720565b6106c4565b61063c565b6105af565b61052e565b6102d8565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760043567ffffffffffffffff81116102d357366023820112156102d357806004013567ffffffffffffffff81116102d3573660248260071b840101116102d35760246102d19201612734565b005b600080fd5b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036102d357807faff2afbf000000000000000000000000000000000000000000000000000000006020921490811561039e575b8115610374575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438610369565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150610362565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761041357604052565b6103c8565b6040810190811067ffffffffffffffff82111761041357604052565b60a0810190811067ffffffffffffffff82111761041357604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761041357604052565b604051906104a0602083610450565b565b604051906104a0604083610450565b604051906104a060a083610450565b604051906104a0606083610450565b919082519283825260005b8481106105195750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016104da565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3576105ab604080519061056f8183610450565b601382527f55534443546f6b656e506f6f6c20312e352e31000000000000000000000000006020830152519182916020835260208301906104cf565b0390f35b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff8116036102d357565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760206106ba60043561067c8161061e565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691161490565b6040519015158152f35b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760043567ffffffffffffffff81116102d357806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83360301126102d3576020610821916107a0612a20565b506107aa816135a3565b6107e66107de6107d66107cb6107c360c4890186612a44565b810190612a95565b9360e4880190612a44565b810190612b4d565b9182516137c9565b8181519101519060405193849283927f57ecfd2800000000000000000000000000000000000000000000000000000000845260048401612bd3565b0381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af190811561094457600091610915575b50156108eb5780606461088560446105ab9401612c04565b60405191909201358082529173ffffffffffffffffffffffffffffffffffffffff169033907f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f090602090a36108d8610491565b8190526040519081529081906020820190565b7fbf969f220000000000000000000000000000000000000000000000000000000060005260046000fd5b610937915060203d60201161093d575b61092f8183610450565b810190612bbe565b3861086d565b503d610925565b612bf8565b67ffffffffffffffff8116036102d357565b35906104a082610949565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102d35760043561099c81610949565b9160243567ffffffffffffffff81116102d357826023820112156102d35780600401359267ffffffffffffffff84116102d357602484830101116102d3576024019190565b346102d35760206106ba6109f436610966565b91612c0e565b9181601f840112156102d35782359167ffffffffffffffff83116102d3576020808501948460051b0101116102d357565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102d35760043567ffffffffffffffff81116102d35781610a74916004016109fa565b929092916024359067ffffffffffffffff82116102d357610a97916004016109fa565b9091565b346102d357610ac3610acb610aaf36610a2b565b9491610abc939193613558565b3691612c6e565b923691612c6e565b7f000000000000000000000000000000000000000000000000000000000000000015610c765760005b8251811015610bb95780610b27610b0d60019386612dce565b5173ffffffffffffffffffffffffffffffffffffffff1690565b610b63610b5e73ffffffffffffffffffffffffffffffffffffffff83165b73ffffffffffffffffffffffffffffffffffffffff1690565b614637565b610b6f575b5001610af4565b60405173ffffffffffffffffffffffffffffffffffffffff9190911681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756690602090a138610b68565b5060005b81518110156102d15780610bd6610b0d60019385612dce565b73ffffffffffffffffffffffffffffffffffffffff811615610c7057610c19610c1473ffffffffffffffffffffffffffffffffffffffff8316610b45565b6148ed565b610c26575b505b01610bbd565b60405173ffffffffffffffffffffffffffffffffffffffff9190911681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d890602090a183610c1e565b50610c20565b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102d357610d1d36610966565b610d28929192613558565b67ffffffffffffffff8216610d4a816000526006602052604060002054151590565b15610d6557506102d192610d5f913691612acd565b90613975565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760005473ffffffffffffffffffffffffffffffffffffffff81163303610f02577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff600435610f9f8161061e565b610fa7613558565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760206106ba67ffffffffffffffff60043561102481610949565b166000526006602052604060002054151590565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b9181601f840112156102d35782359167ffffffffffffffff83116102d357602080850194606085020101116102d357565b346102d35760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760043567ffffffffffffffff81116102d35761110a9036906004016109fa565b9060243567ffffffffffffffff81116102d35761112b90369060040161108a565b9060443567ffffffffffffffff81116102d35761114c90369060040161108a565b61116e610b4560095473ffffffffffffffffffffffffffffffffffffffff1690565b3314158061124d575b61121b57838614801590611211575b6111e75760005b86811061119657005b806111e16111af6111aa6001948b8b612ce5565b612cf5565b6111ba838989612cff565b6111db6111d36111cb86898b612cff565b923690611eb7565b913690611eb7565b91613a3a565b0161118d565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b5080861415611186565b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6000fd5b50611270610b4560015473ffffffffffffffffffffffffffffffffffffffff1690565b331415611177565b906112cb91602081526020611298835160408385015260608401906104cf565b9201519060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828503019101526104cf565b90565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760043567ffffffffffffffff81116102d3578060040160a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83360301126102d357611347612d0f565b5061135181613b6a565b6024820161138361137e61136483612cf5565b67ffffffffffffffff16600052600a602052604060002090565b612d28565b916113986113946040850151151590565b1590565b6116525760206113a88280612a44565b90500361160e5760646113c86113c083602094612a44565b810190612daa565b940135926113dc8282015163ffffffff1690565b90516040517ff856ddb60000000000000000000000000000000000000000000000000000000081526004810186905263ffffffff909216602483015260448201959095527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1660648201526084810194909452838060a481010381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1918215610944576105ab936000936115cb575b5061150b611506611583936115af937f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7604051806114fe3394829190602083019252565b0390a2612cf5565b612f9b565b926115276115176104a2565b67ffffffffffffffff9092168252565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015260405192839160208301919091602063ffffffff81604084019567ffffffffffffffff8151168552015116910152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610450565b6115b76104a2565b918252602082015260405191829182611278565b6115af919350611506611583936115fc61150b9360203d602011611607575b6115f48183610450565b810190612db9565b9593509350506114ba565b503d6115ea565b8061161891612a44565b9061164e6040519283927fa3c8cf0900000000000000000000000000000000000000000000000000000000845260048401612d99565b0390fd5b61124961165e83612cf5565b7fd201c48a0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405160008152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061170157505050505090565b909192939460208061173d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301875289516104cf565b970193019301919392906116f2565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35767ffffffffffffffff60043561179081610949565b1660005260076020526117a96005604060002001614541565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06117ef6117d984612c56565b936117e76040519586610450565b808552612c56565b0160005b81811061185b57505060005b815181101561184d578061183161182c61181b60019486612dce565b516000526008602052604060002090565b612e35565b61183b8286612dce565b526118468185612dce565b50016117ff565b604051806105ab85826116ce565b8060606020809387010152016117f3565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3576118a36144ab565b60405180916020820160208352815180915260206040840192019060005b8181106118cf575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff168452859450602093840193909201916001016118c1565b346102d35761190c36610966565b611917929192613558565b67ffffffffffffffff82169161193d611394846000526006602052604060002054151590565b6119f35761198061139460056119678467ffffffffffffffff166000526007602052604060002090565b01611973368689612acd565b60208151910120906147e2565b6119bc57507f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691926119b760405192839283612d99565b0390a2005b61164e84926040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501612ef5565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35767ffffffffffffffff600435611a6e81610949565b611a76612f16565b501660005260076020526105ab611a9b611a966002604060002001612f41565b613c7a565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b9060206112cb9281815201906104cf565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3576105ab611b9860043561150681610949565b6040519182916020835260208301906104cf565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35773ffffffffffffffffffffffffffffffffffffffff600435611bfc8161061e565b611c04613558565b168015611c7e5760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b602060408183019282815284518094520192019060005b818110611ccc5750505090565b825167ffffffffffffffff16845260209384019390920191600101611cbf565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357611d236144f6565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d536117d984612c56565b0136602084013760005b8151811015611d8f578067ffffffffffffffff611d7c60019385612dce565b5116611d888286612dce565b5201611d5d565b604051806105ab8582611ca8565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35767ffffffffffffffff600435611de181610949565b611de9612f16565b501660005260076020526105ab611a9b611a966040600020612f41565b801515036102d357565b35906fffffffffffffffffffffffffffffffff821682036102d357565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60609101126102d35760405190611e64826103f7565b81608435611e7181611e06565b815260a4356fffffffffffffffffffffffffffffffff811681036102d357602082015260c435906fffffffffffffffffffffffffffffffff821682036102d35760400152565b91908260609103126102d357604051611ecf816103f7565b6040611efb8183958035611ee281611e06565b8552611ef060208201611e10565b602086015201611e10565b910152565b346102d35760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357600435611f3b81610949565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102d357604051611f71816103f7565b602435611f7d81611e06565b81526044356fffffffffffffffffffffffffffffffff811681036102d35760208201526064356fffffffffffffffffffffffffffffffff811681036102d3576040820152611fca36611e2d565b9073ffffffffffffffffffffffffffffffffffffffff6009541633141580611ffa575b61121b576102d192613a3a565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611fed565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35767ffffffffffffffff6004356120cf81610949565b6000604080516120de816103f7565b828152826020820152015216600052600a6020526105ab604060002060ff60016040519261210b846103f7565b80548452015463ffffffff8116602084015260201c16151560408201526040519182918291909160408060608301948051845263ffffffff602082015116602085015201511515910152565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346102d3576121c036610a2b565b9190926121cb613558565b6000915b80831061247d5750505060009163ffffffff4216925b8281106121ee57005b6122016121fc82858561313a565b6131f9565b90606082016122108151613d57565b608083019361221f8551613d57565b604084019081515115611c7e57612259611394612254612247885167ffffffffffffffff1690565b67ffffffffffffffff1690565b61497e565b61243257612392612292612278879a999a5167ffffffffffffffff1690565b67ffffffffffffffff166000526007602052604060002090565b6123558961234f87516123366122bb60408301516fffffffffffffffffffffffffffffffff1690565b9161231d6122e66122df60208401516fffffffffffffffffffffffffffffffff1690565b9251151590565b6123146122f16104b1565b6fffffffffffffffffffffffffffffffff851681529763ffffffff166020890152565b15156040870152565b6fffffffffffffffffffffffffffffffff166060850152565b6fffffffffffffffffffffffffffffffff166080830152565b82613290565b6123878961237e8a516123366122bb60408301516fffffffffffffffffffffffffffffffff1690565b60028301613290565b60048451910161339c565b602085019660005b885180518210156123d557906123cf6001926123c8836123c28c5167ffffffffffffffff1690565b92612dce565b5190613975565b0161239a565b505097965094906124297f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c293926124166001975167ffffffffffffffff1690565b92519351905190604051948594856134c3565b0390a1016121e5565b611249612447865167ffffffffffffffff1690565b7f1d5ad3c50000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b90919261248e6111aa858486612ce5565b946124a561139467ffffffffffffffff881661471b565b612599576124d260056124cc8867ffffffffffffffff166000526007602052604060002090565b01614541565b9360005b855181101561251e5760019061251760056125058b67ffffffffffffffff166000526007602052604060002090565b01612510838a612dce565b51906147e2565b50016124d6565b509350937f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991661258b6001939761257061256b8267ffffffffffffffff166000526007602052604060002090565b61308b565b60405167ffffffffffffffff90911681529081906020820190565b0390a10191909392936121cf565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff861660045260246000fd5b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35773ffffffffffffffffffffffffffffffffffffffff6004356126218161061e565b612629613558565b1633811461269b57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b61273c613558565b60005b82811061277e5750907f1889010d2535a0ab1643678d1da87fbbe8b87b2f585b47ddb72ec622aef9ee5691612779604051928392836129a1565b0390a1565b61279161278c828585612914565b61293a565b80511580156128bf575b61285c57906128568261280661136460406127bf6020600198015163ffffffff1690565b936127f78151956127ef6127d66060850151151590565b916127df6104c0565b98895263ffffffff166020890152565b151586840152565b015167ffffffffffffffff1690565b60019082518155019063ffffffff6020820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000064ff0000000060408554940151151560201b16921617179055565b0161273f565b604080517fa087bd2900000000000000000000000000000000000000000000000000000000815282516004820152602083015163ffffffff1660248201529082015167ffffffffffffffff16604482015260609091015115156064820152608490fd5b5067ffffffffffffffff6128de604083015167ffffffffffffffff1690565b161561279b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156129245760071b0190565b6128e5565b359063ffffffff821682036102d357565b6080813603126102d35760405190608082019082821067ffffffffffffffff831117610413576060916040528035835261297660208201612929565b6020840152604081013561298981610949565b6040840152013561299981611e06565b606082015290565b602080825281018390526040019160005b8181106129bf5750505090565b9091926080806001928635815263ffffffff6129dd60208901612929565b16602082015267ffffffffffffffff60408801356129fa81610949565b1660408201526060870135612a0e81611e06565b151560608201520194019291016129b2565b604051906020820182811067ffffffffffffffff8211176104135760405260008252565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102d3570180359067ffffffffffffffff82116102d3576020019181360383136102d357565b908160409103126102d357612ac5602060405192612ab284610418565b8035612abd81610949565b845201612929565b602082015290565b92919267ffffffffffffffff82116104135760405191612b15601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200184610450565b8294818452818301116102d3578281602093846000960137010152565b9080601f830112156102d3578160206112cb93359101612acd565b6020818303126102d35780359067ffffffffffffffff82116102d357016040818303126102d35760405191612b8183610418565b813567ffffffffffffffff81116102d35781612b9e918401612b32565b8352602082013567ffffffffffffffff81116102d357612ac59201612b32565b908160209103126102d357516112cb81611e06565b9091612bea6112cb936040845260408401906104cf565b9160208184039101526104cf565b6040513d6000823e3d90fd5b356112cb8161061e565b6112cb929167ffffffffffffffff612c39921660005260076020526005604060002001923691612acd565b602081519101209060019160005201602052604060002054151590565b67ffffffffffffffff81116104135760051b60200190565b929190612c7a81612c56565b93612c886040519586610450565b602085838152019160051b81019283116102d357905b828210612caa57505050565b602080918335612cb98161061e565b815201910190612c9e565b67ffffffffffffffff6112cb91166000526006602052604060002054151590565b91908110156129245760051b0190565b356112cb81610949565b9190811015612924576060020190565b60405190612d1c82610418565b60606020838281520152565b90604051612d35816103f7565b604060ff6001839580548552015463ffffffff8116602085015260201c161515910152565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9160206112cb938181520191612d5a565b908160209103126102d3573590565b908160209103126102d357516112cb81610949565b80518210156129245760209160051b010190565b90600182811c92168015612e2b575b6020831014612dfc57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612df1565b9060405191826000825492612e4984612de2565b8084529360018116908115612eb55750600114612e6e575b506104a092500383610450565b90506000929192526020600020906000915b818310612e995750509060206104a09282010138612e61565b6020919350806001915483858901015201910190918492612e80565b602093506104a09592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612e61565b60409067ffffffffffffffff6112cb95931681528160208201520191612d5a565b60405190612f2382610434565b60006080838281528260208201528260408201528260608201520152565b90604051612f4e81610434565b60806fffffffffffffffffffffffffffffffff6001839560ff8154848116875263ffffffff81871c16602088015260a01c1615156040860152015481808216166060850152821c16910152565b67ffffffffffffffff1660005260076020526112cb6004604060002001612e35565b91612ff5918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b818110613004575050565b60008155600101612ff9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561305257565b613010565b8054906000815581613067575050565b6000526020600020908101905b81811061307f575050565b60008155600101613074565b60056104a09160008155600060018201556000600282015560006003820155600481016130b88154612de2565b90816130c7575b505001613057565b81601f600093116001146130df5750555b38806130bf565b818352602083206130fa91601f01861c810190600101612ff9565b808252602082209081548360011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8560031b1c1916179055556130d8565b91908110156129245760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1813603018212156102d3570190565b9080601f830112156102d357813561319181612c56565b9261319f6040519485610450565b81845260208085019260051b820101918383116102d35760208201905b8382106131cb57505050505090565b813567ffffffffffffffff81116102d3576020916131ee87848094880101612b32565b8152019101906131bc565b610120813603126102d3576040519061321182610434565b61321a8161095b565b8252602081013567ffffffffffffffff81116102d35761323d903690830161317a565b602083015260408101359067ffffffffffffffff82116102d3576132676132889236908301612b32565b60408401526132793660608301611eb7565b606084015260c0369101611eb7565b608082015290565b8151815460208401516040850151608091821b73ffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffff000000000000000000000000000000000000000000909416939093179290921791151560a01b74ff000000000000000000000000000000000000000016919091178355606084015193810151901b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016921691909117600190910155565b9190601f811161336657505050565b6104a0926000526020600020906020601f840160051c83019310613392575b601f0160051c0190612ff9565b9091508190613385565b919091825167ffffffffffffffff8111610413576133c4816133be8454612de2565b84613357565b6020601f821160011461341e578190612ff5939495600092613413575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b0151905038806133e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169061345184600052602060002090565b9160005b8181106134ab57509583600195969710613474575b505050811b019055565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061346a565b9192602060018192868b015181550194019201613455565b6135276134f26104a09597969467ffffffffffffffff60a09516845261010060208501526101008401906104cf565b9660408301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b01906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b73ffffffffffffffffffffffffffffffffffffffff60015416330361357957565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b90608082016135b761139461067c83612c04565b61377b5750602082019161365860206135fd6135d561224787612cf5565b60801b7fffffffffffffffffffffffffffffffff000000000000000000000000000000001690565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156109445760009161375c575b50613732576136b86136b384612cf5565b613ead565b6136c183612cf5565b6136d661139460a08401926109f48486612a44565b6136f3575060606136ea6104a09394612cf5565b91013590613fd1565b6136fc91612a44565b9061164e6040519283927f24eb47e500000000000000000000000000000000000000000000000000000000845260048401612d99565b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b613775915060203d60201161093d5761092f8183610450565b386136a2565b61378761124991612c04565b7f961c9a4f0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff16600452602490565b90600482015163ffffffff811661392157506008820151916014600c820151910151926137fd602084015163ffffffff1690565b63ffffffff811663ffffffff8316036138e85750507f000000000000000000000000000000000000000000000000000000000000000063ffffffff811663ffffffff8316036138af5750505167ffffffffffffffff1667ffffffffffffffff811667ffffffffffffffff831603613872575050565b7ff917ffea0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff9081166004521660245260446000fd5b7f77e480260000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7fe366a1170000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7f68d2f8d60000000000000000000000000000000000000000000000000000000060005263ffffffff1660045260246000fd5b60409067ffffffffffffffff6112cb949316815281602082015201906104cf565b90805115611c7e578051602082012067ffffffffffffffff8316928360005260076020526139aa8260056040600020016149d4565b15613a035750816139f27f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea936139ed6139fe946000526008602052604060002090565b61339c565b60405191829182611b46565b0390a2565b905061164e6040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401613954565b67ffffffffffffffff166000818152600660205260409020549092919015613b3c5791613b3960e092613b0585613a917f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b97613d57565b846000526007602052613aa881604060002061402e565b613ab183613d57565b846000526007602052613acb83600260406000200161402e565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60808101613b7d61139461067c83612c04565b61377b57506020810190613b9b60206135fd6135d561224786612cf5565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561094457600091613c21575b50613732576060613c186104a093613c07613c0260408601612c04565b6142dc565b6111aa613c1382612cf5565b614373565b91013590614451565b613c3a915060203d60201161093d5761092f8183610450565b38613be5565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161305257565b9190820391821161305257565b613c82612f16565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff82511690602083019163ffffffff835116420342811161305257613ce6906fffffffffffffffffffffffffffffffff6080870151169061303f565b810180911161305257613d0c6fffffffffffffffffffffffffffffffff92918392614d84565b161682524263ffffffff16905290565b6104a09092919260608101936fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b805115613e105760408101516fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff613dbb613da660208501516fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff1690565b911690811090811591613e07575b50613dd15750565b61164e906040519182917f8020d12400000000000000000000000000000000000000000000000000000000835260048301613d1c565b90501538613dc9565b6fffffffffffffffffffffffffffffffff613e3e60408301516fffffffffffffffffffffffffffffffff1690565b1615801590613e85575b613e4f5750565b61164e906040519182917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301613d1c565b50613ea6613da660208301516fffffffffffffffffffffffffffffffff1690565b1515613e48565b613eb961139482612cc4565b613f9a576020613f3291613ee5610b4560045473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90921660048301523360248301529092839190829081906044820190565b03915afa90811561094457600091613f7b575b5015613f4d57565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b613f94915060203d60201161093d5761092f8183610450565b38613f45565b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b9067ffffffffffffffff6104a09216600052600760205260026040600020019073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614a62565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199161420d61277992805461407f6140796140708363ffffffff9060801c1690565b63ffffffff1690565b42613c6d565b9081614219575b50506141c760016140aa60208601516fffffffffffffffffffffffffffffffff1690565b926141356140f8613da66fffffffffffffffffffffffffffffffff6140df85546fffffffffffffffffffffffffffffffff1690565b166fffffffffffffffffffffffffffffffff8816614d84565b82906fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b6141886141428751151590565b82547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178255565b019182906fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b604083015181546fffffffffffffffffffffffffffffffff1660809190911b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016179055565b60405191829182613d1c565b613da66140f8916fffffffffffffffffffffffffffffffff61428d614294958261428660018a0154928261427f614278614262876fffffffffffffffffffffffffffffffff1690565b996fffffffffffffffffffffffffffffffff1690565b9560801c90565b169061303f565b91166148c3565b9116614d84565b80547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161781553880614086565b7f00000000000000000000000000000000000000000000000000000000000000006143045750565b73ffffffffffffffffffffffffffffffffffffffff16806000526003602052604060002054156143315750565b7fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b908160209103126102d357516112cb8161061e565b61437f61139482612cc4565b613f9a5760206143f0916143ab610b4560045473ffffffffffffffffffffffffffffffffffffffff1690565b60405180809581947fa8d87a3b0000000000000000000000000000000000000000000000000000000083526004830191909167ffffffffffffffff6020820193169052565b03915afa80156109445773ffffffffffffffffffffffffffffffffffffffff91600091614422575b50163303613f4d57565b614444915060203d60201161444a575b61443c8183610450565b81019061435e565b38614418565b503d614432565b9067ffffffffffffffff6104a09216600052600760205260406000209073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614a62565b604051906002548083528260208101600260005260206000209260005b8181106144dd5750506104a092500383610450565b84548352600194850194879450602090930192016144c8565b604051906005548083528260208101600560005260206000209260005b8181106145285750506104a092500383610450565b8454835260019485019487945060209093019201614513565b906040519182815491828252602082019060005260206000209260005b8181106145735750506104a092500383610450565b845483526001948501948794506020909301920161455e565b80548210156129245760005260206000200190600090565b80548015614608577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906145d9828261458c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081815260036020526040902054908115614714577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019082821161305257600254927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84019384116130525783836000956146d395036146d9575b5050506146c260026145a4565b600390600052602052604060002090565b55600190565b6146c2614705916146fb6146f161470b95600261458c565b90549060031b1c90565b928391600261458c565b90612fbd565b553880806146b5565b5050600090565b600081815260066020526040902054908115614714577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019082821161305257600554927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84019384116130525783836000956146d395036147b7575b5050506147a660056145a4565b600690600052602052604060002090565b6147a6614705916147cf6146f16147d995600561458c565b928391600561458c565b55388080614799565b60018101918060005282602052604060002054928315156000146148ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401848111613052578354937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85019485116130525760009585836146d3976148729503614881575b5050506145a4565b90600052602052604060002090565b6148a1614705916148986146f16148b1958861458c565b9283918761458c565b8590600052602052604060002090565b5538808061486a565b50505050600090565b9190820180921161305257565b926148db919261303f565b8101809111613052576112cb91614d84565b60008181526003602052604090205461497857600254680100000000000000008110156104135761495f61492a826001859401600255600261458c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600254906000526003602052604060002055600190565b50600090565b6000818152600660205260409020546149785760055468010000000000000000811015610413576149bb61492a826001859401600555600561458c565b9055600554906000526006602052604060002055600190565b600082815260018201602052604090205461471457805490680100000000000000008210156104135782614a1261492a84600180960185558461458c565b905580549260005201602052604060002055600190565b8115614a33570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9091815490614a786113948360ff9060a01c1690565b8015614d7c575b614d7657614a9e6fffffffffffffffffffffffffffffffff8316613da6565b9160018401908154614ad8614079614070614acb613da6856fffffffffffffffffffffffffffffffff1690565b9460801c63ffffffff1690565b80614ce2575b5050858110614c435750848310614b7257505091614b6261277992614b27613da6847f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a97613c6d565b6fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b6040519081529081906020820190565b84614ba0614b9185614b8b613da6614ba5965460801c90565b93613c6d565b614b9a83613c40565b906148c3565b614a29565b9173ffffffffffffffffffffffffffffffffffffffff821615614c1157611249927fd0c8d23a00000000000000000000000000000000000000000000000000000000600052929173ffffffffffffffffffffffffffffffffffffffff9160649460045260245216604452565b7f15279c0800000000000000000000000000000000000000000000000000000000600052600483905260245260446000fd5b828673ffffffffffffffffffffffffffffffffffffffff821615614cb057611249927f1a76572a00000000000000000000000000000000000000000000000000000000600052929173ffffffffffffffffffffffffffffffffffffffff9160649460045260245216604452565b7ff94ebcd100000000000000000000000000000000000000000000000000000000600052600483905260245260446000fd5b828692939611614d4c57614cfc613da6614d039460801c90565b91866148d0565b84547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178555923880614ade565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b508315614a7f565b9080821015614d91575090565b90509056fea164736f6c634300081a000a",
}
var USDCTokenPoolABI = USDCTokenPoolMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/weth9/weth9.go b/core/gethwrappers/ccip/generated/weth9/weth9.go
index 50d0aa23f73..34c1fd7fb8b 100644
--- a/core/gethwrappers/ccip/generated/weth9/weth9.go
+++ b/core/gethwrappers/ccip/generated/weth9/weth9.go
@@ -31,8 +31,8 @@ var (
)
var WETH9MetaData = &bind.MetaData{
- ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
- Bin: "0x60c0604052600d60809081526c2bb930b83832b21022ba3432b960991b60a05260009061002c9082610116565b506040805180820190915260048152630ae8aa8960e31b60208201526001906100559082610116565b506002805460ff1916601217905534801561006f57600080fd5b506101d5565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061009f57607f821691505b6020821081036100bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610111576000816000526020600020601f850160051c810160208610156100ee5750805b601f850160051c820191505b8181101561010d578281556001016100fa565b5050505b505050565b81516001600160401b0381111561012f5761012f610075565b6101438161013d845461008b565b846100c5565b602080601f83116001811461017857600084156101605750858301515b600019600386901b1c1916600185901b17855561010d565b600085815260208120601f198616915b828110156101a757888601518255948401946001909101908401610188565b50858210156101c55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6108ad806101e46000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101fa578063d0e30db01461021a578063dd62ed3e1461022257600080fd5b8063313ce5671461018c57806370a08231146101b857806395d89b41146101e557600080fd5b806318160ddd116100a557806318160ddd1461012f57806323b872dd1461014c5780632e1a7d4d1461016c57600080fd5b806306fdde03146100d4578063095ea7b3146100ff57600080fd5b366100cf576100cd61025a565b005b600080fd5b3480156100e057600080fd5b506100e96102b5565b6040516100f69190610695565b60405180910390f35b34801561010b57600080fd5b5061011f61011a36600461072b565b610343565b60405190151581526020016100f6565b34801561013b57600080fd5b50475b6040519081526020016100f6565b34801561015857600080fd5b5061011f610167366004610755565b6103bd565b34801561017857600080fd5b506100cd610187366004610791565b6105c4565b34801561019857600080fd5b506002546101a69060ff1681565b60405160ff90911681526020016100f6565b3480156101c457600080fd5b5061013e6101d33660046107aa565b60036020526000908152604090205481565b3480156101f157600080fd5b506100e961066a565b34801561020657600080fd5b5061011f61021536600461072b565b610677565b6100cd61068b565b34801561022e57600080fd5b5061013e61023d3660046107c5565b600460209081526000928352604080842090915290825290205481565b3360009081526003602052604081208054349290610279908490610827565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b600080546102c29061083a565b80601f01602080910402602001604051908101604052809291908181526020018280546102ee9061083a565b801561033b5780601f106103105761010080835404028352916020019161033b565b820191906000526020600020905b81548152906001019060200180831161031e57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103ab9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156103ef57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610455575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020546fffffffffffffffffffffffffffffffff14155b156104dd5773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561049757600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320338452909152812080548492906104d790849061088d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360205260408120805484929061051290849061088d565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805484929061054c908490610827565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516105b291815260200190565b60405180910390a35060019392505050565b336000908152600360205260409020548111156105e057600080fd5b33600090815260036020526040812080548392906105ff90849061088d565b9091555050604051339082156108fc029083906000818181858888f19350505050158015610631573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600180546102c29061083a565b60006106843384846103bd565b9392505050565b61069361025a565b565b60006020808352835180602085015260005b818110156106c3578581018301518582016040015282016106a7565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461072657600080fd5b919050565b6000806040838503121561073e57600080fd5b61074783610702565b946020939093013593505050565b60008060006060848603121561076a57600080fd5b61077384610702565b925061078160208501610702565b9150604084013590509250925092565b6000602082840312156107a357600080fd5b5035919050565b6000602082840312156107bc57600080fd5b61068482610702565b600080604083850312156107d857600080fd5b6107e183610702565b91506107ef60208401610702565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156103b7576103b76107f8565b600181811c9082168061084e57607f821691505b602082108103610887577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b818103818111156103b7576103b76107f856fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"guy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawal\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+ Bin: "0x60806040523461011457610014600054610119565b601f81116100cb575b507f577261707065642045746865720000000000000000000000000000000000001a60005560015461004e90610119565b601f8111610081575b6008630ae8aa8960e31b016001556002805460ff19166012179055604051610a5a90816101548239f35b6001600052601f0160051c7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6908101905b8181106100bf5750610057565b600081556001016100b2565b60008052601f0160051c7f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563908101905b818110610108575061001d565b600081556001016100fb565b600080fd5b90600182811c92168015610149575b602083101461013357565b634e487b7160e01b600052602260045260246000fd5b91607f169161012856fe60806040526004361015610062575b361561001957600080fd5b33600052600360205260406000206100323482546108a0565b90556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2005b60003560e01c806306fdde0314610696578063095ea7b3146105ef57806318160ddd146105b557806323b872dd146105685780632e1a7d4d146104aa578063313ce5671461046b57806370a082311461040657806395d89b4114610208578063a9059cbb146101b8578063d0e30db0146101755763dd62ed3e0361000e57346101705760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101705761011761081e565b73ffffffffffffffffffffffffffffffffffffffff610134610841565b9116600052600460205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b600080fd5b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101705733600052600360205260406000206100323482546108a0565b346101705760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101705760206101fe6101f461081e565b60243590336108ad565b6040519015158152f35b346101705760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610170576000604051908091600154928360011c600185169485156103fc575b6020821086146103cf57839495828552908160001461036f57506001146102f6575b5003601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210176102c9576102c59250604052604051918291826107b6565b0390f35b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600185528491507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b81831061035357505081016020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610275565b602091935080600191548385880101520191019091839261031f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208581019190915291151560051b840190910191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09050610275565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b90607f1690610253565b346101705760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101705773ffffffffffffffffffffffffffffffffffffffff61045261081e565b1660005260036020526020604060002054604051908152f35b346101705760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017057602060ff60025416604051908152f35b346101705760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017057600435336000526003602052806040600020541061017057336000526003602052604060002061050a828254610864565b9055806000811561055f575b600080809381933390f115610553576040519081527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560203392a2005b6040513d6000823e3d90fd5b506108fc610516565b346101705760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101705760206101fe6105a461081e565b6105ac610841565b604435916108ad565b346101705760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017057602047604051908152f35b346101705760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101705761062661081e565b73ffffffffffffffffffffffffffffffffffffffff6024359133600052600460205260406000208282166000526020528260406000205560405192835216907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101705760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101705760006040519080918154928360011c600185169485156107ac575b6020821086146103cf57839495828552908160001461036f5750600114610751575003601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210176102c9576102c59250604052604051918291826107b6565b848052602085208592505b81831061079057505081016020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610275565b602091935080600191548385880101520191019091839261075c565b90607f16906106e0565b9190916020815282519283602083015260005b8481106108085750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016107c9565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361017057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361017057565b9190820391821161087157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190820180921161087157565b73ffffffffffffffffffffffffffffffffffffffff16908160005260036020528260406000205410610170573382141580610a03575b610963575b602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9284600052600383526040600020610939878254610864565b90551693846000526003825260406000206109558282546108a0565b9055604051908152a3600190565b816000526004602052604060002073ffffffffffffffffffffffffffffffffffffffff3316600052602052826040600020541061017057602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9284600052600483526040600020823316600052835260406000206109f8878254610864565b9055925050506108e8565b50816000526004602052604060002073ffffffffffffffffffffffffffffffffffffffff33166000526020526fffffffffffffffffffffffffffffffff60406000205414156108e356fea164736f6c634300081a000a",
}
var WETH9ABI = WETH9MetaData.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 f35104e20df..554f41d754c 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,32 +1,31 @@
GETH_VERSION: 1.14.11
-burn_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.bin 76c31f52fe1df85528c08b2e772e37dcf99ca1ec492d83a221abc1d5ec833694
-burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin 1c78cd3118b3c9ca82f8cb77ffc1137619ea4e8e503c460f2dafb659d0dd766b
-burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin eab9c19ef27b245e5ef0216ab1080c9dd89c96013b7dc978bf610288d5e82b00
-ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin 9971fc93c34442a0989570d3dab90a125de31e6e60754ad972807ce6ad4dfba0
-ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin 865bc25c54cf346e5f519dc3fb625260a12c80983b5ba2dcea63519a7befc660
-ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin b368699ae7dbee7c21d049a641642837f18ce2cc8d4ece69509f205de673108e
-ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
-fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin aee49c9246d5903e68b175516b3cdfdec5df23e25d53d604cd382b6bc0bf34f7
-lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin 04b40584830294fb603cc2a250af7d831d05a04650a8c2fc9e3af5a78c471be6
-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 ec2d3a92348d8e7b8f0d359b62a45157b9d2c750c01fbcf991826c4392f6e218
-mock_usdc_token_messenger: ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.bin d976651d36b33ac2196b32b9d2f4fa6690c6a18d41b621365659fce1c1d1e737
-mock_usdc_token_transmitter: ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.bin be0dbc3e475741ea0b7a54ec2b935a321b428baa9f4ce18180a87fb38bb87de2
-mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin 518e19efa2ff52b0fefd8e597b05765317ee7638189bfe34ca43de2f6599faf4
-multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin c3cac2010c2815b484055bf981363a2bd04e7fbe7bb502dc8fd29a16165d221c
-multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin a523e11ea4c069d7d61b309c156951cc6834aff0f352bd1ac37c3a838ff2588f
-nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin e6008490d916826cefd1903612db39621d51617300fc9bb42b68c6c117958198
-offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin 067fdfbf7cae1557fc03ca16d9c38737ee4595655792a1b8bc4846c45caa0c74
-onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 2bf74188a997218502031f177cb2df505b272d66b25fd341a741289e77380c59
-ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 24b4415a883a470d65c484be0fa20714a46b1c9262db205f1c958017820307b2
-registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 0fc277a0b512db4e20b5a32a775b94ed2c0d342d8237511de78c94f7dacad428
-report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin 6c943b39f003aa67c3cefa19a8ff99e846236a058e1ceae77569c3a065ffd5c7
-rmn_home: ../../../contracts/solc/v0.8.24/RMNHome/RMNHome.abi ../../../contracts/solc/v0.8.24/RMNHome/RMNHome.bin 84ca84b3d0c00949905a3d10a91255f877cf32b2a0d7f7f7ce3121ced34a8cb7
-rmn_proxy_contract: ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.abi ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.bin b048d8e752e3c41113ebb305c1efa06737ad36b4907b93e627fb0a3113023454
-rmn_remote: ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.abi ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.bin 941118dfdc6bb042c339cfe8d8e0c7a0b486afb731a785d58a64994e7a13c459
-router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 2e4f0a7826c8abb49d882bb49fc5ff20a186dbd3137624b9097ffed903ae4888
-token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin 397bc7be08c2848c0f4715f90b16206d6367f78ffb7cd48e2b1dfc0ccc5aea26
-token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 793d65f336929becdcf8bc3f2208a5b6de93774215fe2e863bef64df419cfdb0
-usdc_reader_tester: ../../../contracts/solc/v0.8.24/USDCReaderTester/USDCReaderTester.abi ../../../contracts/solc/v0.8.24/USDCReaderTester/USDCReaderTester.bin 672a07c9218fd6ad7c04dde583088b0f5ffc8d55a46f4be1714008dd3409438b
-usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin a9fef4db2c901302c0293b139eb77017b18da8543b7623e17f2932efbb8e3011
-weth9: ../../../contracts/solc/v0.8.24/WETH9/WETH9.abi ../../../contracts/solc/v0.8.24/WETH9/WETH9.bin 2970d79a0ca6dd6279cde130de45e56c8790ed695eae477fb5ba4c1bb75b720d
+burn_from_mint_token_pool: ../../../contracts/solc/ccip/BurnFromMintTokenPool/BurnFromMintTokenPool.sol/BurnFromMintTokenPool.abi.json ../../../contracts/solc/ccip/BurnFromMintTokenPool/BurnFromMintTokenPool.sol/BurnFromMintTokenPool.bin ae4e15dc926517092d46e108cd5e24863d58e689444ce310bb00c1390f711ba9
+burn_mint_token_pool: ../../../contracts/solc/ccip/BurnMintTokenPool/BurnMintTokenPool.sol/BurnMintTokenPool.abi.json ../../../contracts/solc/ccip/BurnMintTokenPool/BurnMintTokenPool.sol/BurnMintTokenPool.bin 7360dc05306d51b247abdf9a3aa8704847b1f4fb91fdb822a2dfc54e1d86cda1
+burn_with_from_mint_token_pool: ../../../contracts/solc/ccip/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.sol/BurnWithFromMintTokenPool.abi.json ../../../contracts/solc/ccip/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.sol/BurnWithFromMintTokenPool.bin 66715c303bb2da2b49bba100a788f6471b0f94d255d40f92306e279b909ae33b
+ccip_encoding_utils: ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.sol/EncodingUtils.abi.json ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.sol/EncodingUtils.bin abd960015cec3e4d94a5948d2d66ee915770fe4a744c28a5ff46d23e870baaea
+ccip_home: ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.abi.json ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.bin 39de1fbc907a2b573e9358e716803bf5ac3b0a2e622d5bc0069ab60daf38949b
+ccip_reader_tester: ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.abi.json ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.bin b8e597d175ec5ff4990d98b4e3b8a8cf06c6ae22977dd6f0e58c0f4107639e8f
+ether_sender_receiver: ../../../contracts/solc/ccip/EtherSenderReceiver/EtherSenderReceiver.sol/EtherSenderReceiver.abi.json ../../../contracts/solc/ccip/EtherSenderReceiver/EtherSenderReceiver.sol/EtherSenderReceiver.bin 88973abc1bfbca23a23704e20087ef46f2e20581a13477806308c8f2e664844e
+fee_quoter: ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.abi.json ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.bin 8b29159231e67ab38d9c9bbddbf218d0e5c0e6685ff3816b391680e889c385ff
+lock_release_token_pool: ../../../contracts/solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.abi.json ../../../contracts/solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.bin 2e73ee0da6f9a9a5722294289b969e4202476706e5d7cdb623e728831c79c28b
+maybe_revert_message_receiver: ../../../contracts/solc/ccip/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.sol/MaybeRevertMessageReceiver.abi.json ../../../contracts/solc/ccip/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.sol/MaybeRevertMessageReceiver.bin d1eb951af1027ca20cbee2c34df80fddbfd861e1695989aeebd29327cfe56584
+message_hasher: ../../../contracts/solc/ccip/MessageHasher/MessageHasher.sol/MessageHasher.abi.json ../../../contracts/solc/ccip/MessageHasher/MessageHasher.sol/MessageHasher.bin 9d503e62f007cfa7bf411ec845c3537b272709001d25ec738820ca83991c299c
+mock_usdc_token_messenger: ../../../contracts/solc/ccip/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.sol/MockE2EUSDCTokenMessenger.abi.json ../../../contracts/solc/ccip/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.sol/MockE2EUSDCTokenMessenger.bin ad7902d63667e582b93b2fad139aa53111f9fddcedf92b1d6d122d1ab7ec4bab
+mock_usdc_token_transmitter: ../../../contracts/solc/ccip/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.sol/MockE2EUSDCTransmitter.abi.json ../../../contracts/solc/ccip/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.sol/MockE2EUSDCTransmitter.bin ae0d090105bc248f4eccd337836ec1db760c506d6f5578e662305abbbc520fcd
+multi_aggregate_rate_limiter: ../../../contracts/solc/ccip/MultiAggregateRateLimiter/MultiAggregateRateLimiter.sol/MultiAggregateRateLimiter.abi.json ../../../contracts/solc/ccip/MultiAggregateRateLimiter/MultiAggregateRateLimiter.sol/MultiAggregateRateLimiter.bin d462b10c87ad74b73502c3c97a7fc53771b915adb9a0fbee781e744f3827d179
+multi_ocr3_helper: ../../../contracts/solc/ccip/MultiOCR3Helper/MultiOCR3Helper.sol/MultiOCR3Helper.abi.json ../../../contracts/solc/ccip/MultiOCR3Helper/MultiOCR3Helper.sol/MultiOCR3Helper.bin 6fa79484ac09342282df342055494853521ea5332adaee0b709c6e21bcd17869
+nonce_manager: ../../../contracts/solc/ccip/NonceManager/NonceManager.sol/NonceManager.abi.json ../../../contracts/solc/ccip/NonceManager/NonceManager.sol/NonceManager.bin ac76c64749ce07dd2ec1b9346d3401dcc5538253e516aecc4767c4308817ea59
+offramp: ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.abi.json ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.bin 0b6526e1dfc331b45fe742560622a6538d9f134b0aeb560e84cccc7802425be1
+onramp: ../../../contracts/solc/ccip/OnRamp/OnRamp.sol/OnRamp.abi.json ../../../contracts/solc/ccip/OnRamp/OnRamp.sol/OnRamp.bin a829e4efe4d8f600dc20589505701fbce872b09bc763b1a5abded28ef4a3afc9
+ping_pong_demo: ../../../contracts/solc/ccip/PingPongDemo/PingPongDemo.sol/PingPongDemo.abi.json ../../../contracts/solc/ccip/PingPongDemo/PingPongDemo.sol/PingPongDemo.bin c87b6e1a8961a9dd2fab1eced0df12d0c1ef47bb1b2511f372b7e33443a20683
+registry_module_owner_custom: ../../../contracts/solc/ccip/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.sol/RegistryModuleOwnerCustom.abi.json ../../../contracts/solc/ccip/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.sol/RegistryModuleOwnerCustom.bin ce04722cdea2e96d791e48c6a99f64559125d34cd24e19cfd5281892d2ed8ef0
+report_codec: ../../../contracts/solc/ccip/ReportCodec/ReportCodec.sol/ReportCodec.abi.json ../../../contracts/solc/ccip/ReportCodec/ReportCodec.sol/ReportCodec.bin 5e66322fdcd40d601e1a55cfccfb9abe066b90297084d2db4f55dfe3ae7d0af2
+rmn_home: ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.abi.json ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.bin e64b6826fdda441f31fc48ce5e7f91434d573e7bd923f6c03c68a7db7f2f164b
+rmn_proxy_contract: ../../../contracts/solc/ccip/RMNProxy/RMNProxy.sol/RMNProxy.abi.json ../../../contracts/solc/ccip/RMNProxy/RMNProxy.sol/RMNProxy.bin 4d06f9e5c6f72daef745e6114faed3bae57ad29758d75de5a4eefcd5f0172328
+rmn_remote: ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.abi.json ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.bin 2cbe49e3478ef4596559de9b7e81089f22bcbd025ddb6b9d5723586ff3d0c0e8
+router: ../../../contracts/solc/ccip/Router/Router.sol/Router.abi.json ../../../contracts/solc/ccip/Router/Router.sol/Router.bin 0103ab2fd344179d49f0320d0a47ec8255fe8a401a2f2c8973e8314dc49d2413
+token_admin_registry: ../../../contracts/solc/ccip/TokenAdminRegistry/TokenAdminRegistry.sol/TokenAdminRegistry.abi.json ../../../contracts/solc/ccip/TokenAdminRegistry/TokenAdminRegistry.sol/TokenAdminRegistry.bin 086268b9df56e089a69a96ce3e4fd03a07a00a1c8812ba9504e31930a5c3ff1d
+token_pool: ../../../contracts/solc/ccip/TokenPool/TokenPool.sol/TokenPool.abi.json ../../../contracts/solc/ccip/TokenPool/TokenPool.sol/TokenPool.bin 6c00ce7b2082f40d5f9b4808eb692a90e81c312b4f5d70d62e4b1ef69a164a9f
+usdc_reader_tester: ../../../contracts/solc/ccip/USDCReaderTester/USDCReaderTester.sol/USDCReaderTester.abi.json ../../../contracts/solc/ccip/USDCReaderTester/USDCReaderTester.sol/USDCReaderTester.bin 7622b1e42bc9c3933c51607d765d8463796c615155596929e554a58ed68b263d
+usdc_token_pool: ../../../contracts/solc/ccip/USDCTokenPool/USDCTokenPool.sol/USDCTokenPool.abi.json ../../../contracts/solc/ccip/USDCTokenPool/USDCTokenPool.sol/USDCTokenPool.bin 8a44f8d2d193fc1332e5e80a5e05172dc15680e0921d7cc945ea321746f764fc
+weth9: ../../../contracts/solc/ccip/WETH9/WETH9.sol/WETH9.abi.json ../../../contracts/solc/ccip/WETH9/WETH9.sol/WETH9.bin 89ee9892414b4d9abfb18046504aa7771c88c52a0831479ca4152f120e647d49
diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go
index 9d6fa7c4645..e1fa0e9150d 100644
--- a/core/gethwrappers/ccip/go_generate.go
+++ b/core/gethwrappers/ccip/go_generate.go
@@ -1,76 +1,38 @@
-// Package gethwrappers_ccip provides tools for wrapping solidity contracts with
-// golang packages, using abigen.
package ccip
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.abi ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.bin RMNProxyContract rmn_proxy_contract
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin TokenAdminRegistry token_admin_registry
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin RegistryModuleOwnerCustom registry_module_owner_custom
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin OnRamp onramp
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin OffRamp offramp
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.abi ../../../contracts/solc/v0.8.24/RMNRemote/RMNRemote.bin RMNRemote rmn_remote
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/RMNHome/RMNHome.abi ../../../contracts/solc/v0.8.24/RMNHome/RMNHome.bin RMNHome rmn_home
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin MultiAggregateRateLimiter multi_aggregate_rate_limiter
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin Router router
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin FeeQuoter fee_quoter
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin CCIPHome ccip_home
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin NonceManager nonce_manager
+//go:generate go run ../generation/wrap.go ccip Router router
+//go:generate go run ../generation/wrap.go ccip CCIPHome ccip_home
+//go:generate go run ../generation/wrap.go ccip OnRamp onramp
+//go:generate go run ../generation/wrap.go ccip OffRamp offramp
+//go:generate go run ../generation/wrap.go ccip FeeQuoter fee_quoter
+//go:generate go run ../generation/wrap.go ccip NonceManager nonce_manager
+//go:generate go run ../generation/wrap.go ccip MultiAggregateRateLimiter multi_aggregate_rate_limiter
+//go:generate go run ../generation/wrap.go ccip TokenAdminRegistry token_admin_registry
+//go:generate go run ../generation/wrap.go ccip RegistryModuleOwnerCustom registry_module_owner_custom
+//go:generate go run ../generation/wrap.go ccip RMNProxy rmn_proxy_contract
+//go:generate go run ../generation/wrap.go ccip RMNRemote rmn_remote
+//go:generate go run ../generation/wrap.go ccip RMNHome rmn_home
// Pools
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin BurnMintTokenPool burn_mint_token_pool
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.bin BurnFromMintTokenPool burn_from_mint_token_pool
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin BurnWithFromMintTokenPool burn_with_from_mint_token_pool
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin LockReleaseTokenPool lock_release_token_pool
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin TokenPool token_pool
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin USDCTokenPool usdc_token_pool
+//go:generate go run ../generation/wrap.go ccip BurnMintTokenPool burn_mint_token_pool
+//go:generate go run ../generation/wrap.go ccip BurnFromMintTokenPool burn_from_mint_token_pool
+//go:generate go run ../generation/wrap.go ccip BurnWithFromMintTokenPool burn_with_from_mint_token_pool
+//go:generate go run ../generation/wrap.go ccip LockReleaseTokenPool lock_release_token_pool
+//go:generate go run ../generation/wrap.go ccip TokenPool token_pool
+//go:generate go run ../generation/wrap.go ccip USDCTokenPool usdc_token_pool
// Helpers
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin MockV3Aggregator mock_v3_aggregator_contract
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin MaybeRevertMessageReceiver maybe_revert_message_receiver
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin PingPongDemo ping_pong_demo
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.abi ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.bin MessageHasher message_hasher
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin MultiOCR3Helper multi_ocr3_helper
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/USDCReaderTester/USDCReaderTester.abi ../../../contracts/solc/v0.8.24/USDCReaderTester/USDCReaderTester.bin USDCReaderTester usdc_reader_tester
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin ReportCodec report_codec
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin EtherSenderReceiver ether_sender_receiver
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/WETH9/WETH9.abi ../../../contracts/solc/v0.8.24/WETH9/WETH9.bin WETH9 weth9
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.bin MockE2EUSDCTokenMessenger mock_usdc_token_messenger
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.bin MockE2EUSDCTransmitter mock_usdc_token_transmitter
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin CCIPReaderTester ccip_reader_tester
+//go:generate go run ../generation/wrap.go ccip MaybeRevertMessageReceiver maybe_revert_message_receiver
+//go:generate go run ../generation/wrap.go ccip PingPongDemo ping_pong_demo
+//go:generate go run ../generation/wrap.go ccip MessageHasher message_hasher
+//go:generate go run ../generation/wrap.go ccip MultiOCR3Helper multi_ocr3_helper
+//go:generate go run ../generation/wrap.go ccip USDCReaderTester usdc_reader_tester
+//go:generate go run ../generation/wrap.go ccip ReportCodec report_codec
+//go:generate go run ../generation/wrap.go ccip EtherSenderReceiver ether_sender_receiver
+//go:generate go run ../generation/wrap.go ccip WETH9 weth9
+//go:generate go run ../generation/wrap.go ccip MockE2EUSDCTokenMessenger mock_usdc_token_messenger
+//go:generate go run ../generation/wrap.go ccip MockE2EUSDCTransmitter mock_usdc_token_transmitter
+//go:generate go run ../generation/wrap.go ccip CCIPReaderTester ccip_reader_tester
// EncodingUtils
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.abi ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEncodingUtils.bin EncodingUtils ccip_encoding_utils
-
-// To run these commands, you must either install docker, or the correct version
-// of abigen. The latter can be installed with these commands, at least on linux:
-//
-// git clone https://github.com/ethereum/go-ethereum
-// cd go-ethereum/cmd/abigen
-// git checkout v
-// go install
-//
-// Here, is the version of go-ethereum specified in chainlink's
-// go.mod. This will install abigen in "$GOPATH/bin", which you should add to
-// your $PATH.
-//
-// To reduce explicit dependencies, and in case the system does not have the
-// correct version of abigen installed , the above commands spin up docker
-// containers. In my hands, total running time including compilation is about
-// 13s. If you're modifying solidity code and testing against go code a lot, it
-// might be worthwhile to generate the the wrappers using a static container
-// with abigen and solc, which will complete much faster. E.g.
-//
-// abigen -sol ../../contracts/src/v0.6/VRFAll.sol -pkg vrf -out solidity_interfaces.go
-//
-// where VRFAll.sol simply contains `import "contract_path";` instructions for
-// all the contracts you wish to target. This runs in about 0.25 seconds in my
-// hands.
-//
-// If you're on linux, you can copy the correct version of solc out of the
-// appropriate docker container. At least, the following works on ubuntu:
-//
-// $ docker run --name solc ethereum/solc:0.6.2
-// $ sudo docker cp solc:/usr/bin/solc /usr/bin
-// $ docker rm solc
-//
-// If you need to point abigen at your solc executable, you can specify the path
-// with the abigen --solc option.
+//go:generate go run ../generation/wrap.go ccip EncodingUtils ccip_encoding_utils
diff --git a/core/gethwrappers/generated/aggregator_v2v3_interface/aggregator_v2v3_interface.go b/core/gethwrappers/generated/aggregator_v2v3_interface/aggregator_v2v3_interface.go
deleted file mode 100644
index e008e54fbb4..00000000000
--- a/core/gethwrappers/generated/aggregator_v2v3_interface/aggregator_v2v3_interface.go
+++ /dev/null
@@ -1,750 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package aggregator_v2v3_interface
-
-import (
- "errors"
- "fmt"
- "math/big"
- "strings"
-
- ethereum "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/event"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
-)
-
-var (
- _ = errors.New
- _ = big.NewInt
- _ = strings.NewReader
- _ = ethereum.NotFound
- _ = bind.Bind
- _ = common.Big1
- _ = types.BloomLookup
- _ = event.NewSubscription
- _ = abi.ConvertType
-)
-
-var AggregatorV2V3InterfaceMetaData = &bind.MetaData{
- ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"current\",\"type\":\"int256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"}],\"name\":\"AnswerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"startedBy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"}],\"name\":\"NewRound\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"}],\"name\":\"getAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint80\",\"name\":\"_roundId\",\"type\":\"uint80\"}],\"name\":\"getRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
-}
-
-var AggregatorV2V3InterfaceABI = AggregatorV2V3InterfaceMetaData.ABI
-
-type AggregatorV2V3Interface struct {
- address common.Address
- abi abi.ABI
- AggregatorV2V3InterfaceCaller
- AggregatorV2V3InterfaceTransactor
- AggregatorV2V3InterfaceFilterer
-}
-
-type AggregatorV2V3InterfaceCaller struct {
- contract *bind.BoundContract
-}
-
-type AggregatorV2V3InterfaceTransactor struct {
- contract *bind.BoundContract
-}
-
-type AggregatorV2V3InterfaceFilterer struct {
- contract *bind.BoundContract
-}
-
-type AggregatorV2V3InterfaceSession struct {
- Contract *AggregatorV2V3Interface
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type AggregatorV2V3InterfaceCallerSession struct {
- Contract *AggregatorV2V3InterfaceCaller
- CallOpts bind.CallOpts
-}
-
-type AggregatorV2V3InterfaceTransactorSession struct {
- Contract *AggregatorV2V3InterfaceTransactor
- TransactOpts bind.TransactOpts
-}
-
-type AggregatorV2V3InterfaceRaw struct {
- Contract *AggregatorV2V3Interface
-}
-
-type AggregatorV2V3InterfaceCallerRaw struct {
- Contract *AggregatorV2V3InterfaceCaller
-}
-
-type AggregatorV2V3InterfaceTransactorRaw struct {
- Contract *AggregatorV2V3InterfaceTransactor
-}
-
-func NewAggregatorV2V3Interface(address common.Address, backend bind.ContractBackend) (*AggregatorV2V3Interface, error) {
- abi, err := abi.JSON(strings.NewReader(AggregatorV2V3InterfaceABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindAggregatorV2V3Interface(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &AggregatorV2V3Interface{address: address, abi: abi, AggregatorV2V3InterfaceCaller: AggregatorV2V3InterfaceCaller{contract: contract}, AggregatorV2V3InterfaceTransactor: AggregatorV2V3InterfaceTransactor{contract: contract}, AggregatorV2V3InterfaceFilterer: AggregatorV2V3InterfaceFilterer{contract: contract}}, nil
-}
-
-func NewAggregatorV2V3InterfaceCaller(address common.Address, caller bind.ContractCaller) (*AggregatorV2V3InterfaceCaller, error) {
- contract, err := bindAggregatorV2V3Interface(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &AggregatorV2V3InterfaceCaller{contract: contract}, nil
-}
-
-func NewAggregatorV2V3InterfaceTransactor(address common.Address, transactor bind.ContractTransactor) (*AggregatorV2V3InterfaceTransactor, error) {
- contract, err := bindAggregatorV2V3Interface(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &AggregatorV2V3InterfaceTransactor{contract: contract}, nil
-}
-
-func NewAggregatorV2V3InterfaceFilterer(address common.Address, filterer bind.ContractFilterer) (*AggregatorV2V3InterfaceFilterer, error) {
- contract, err := bindAggregatorV2V3Interface(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &AggregatorV2V3InterfaceFilterer{contract: contract}, nil
-}
-
-func bindAggregatorV2V3Interface(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := AggregatorV2V3InterfaceMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _AggregatorV2V3Interface.Contract.AggregatorV2V3InterfaceCaller.contract.Call(opts, result, method, params...)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _AggregatorV2V3Interface.Contract.AggregatorV2V3InterfaceTransactor.contract.Transfer(opts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _AggregatorV2V3Interface.Contract.AggregatorV2V3InterfaceTransactor.contract.Transact(opts, method, params...)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _AggregatorV2V3Interface.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _AggregatorV2V3Interface.Contract.contract.Transfer(opts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _AggregatorV2V3Interface.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) Decimals(opts *bind.CallOpts) (uint8, error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "decimals")
-
- if err != nil {
- return *new(uint8), err
- }
-
- out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
- return out0, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) Decimals() (uint8, error) {
- return _AggregatorV2V3Interface.Contract.Decimals(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) Decimals() (uint8, error) {
- return _AggregatorV2V3Interface.Contract.Decimals(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) Description(opts *bind.CallOpts) (string, error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "description")
-
- if err != nil {
- return *new(string), err
- }
-
- out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
- return out0, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) Description() (string, error) {
- return _AggregatorV2V3Interface.Contract.Description(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) Description() (string, error) {
- return _AggregatorV2V3Interface.Contract.Description(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) GetAnswer(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "getAnswer", roundId)
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) GetAnswer(roundId *big.Int) (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.GetAnswer(&_AggregatorV2V3Interface.CallOpts, roundId)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) GetAnswer(roundId *big.Int) (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.GetAnswer(&_AggregatorV2V3Interface.CallOpts, roundId)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) GetRoundData(opts *bind.CallOpts, _roundId *big.Int) (GetRoundData,
-
- error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "getRoundData", _roundId)
-
- outstruct := new(GetRoundData)
- if err != nil {
- return *outstruct, err
- }
-
- outstruct.RoundId = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
- outstruct.Answer = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
- outstruct.StartedAt = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
- outstruct.UpdatedAt = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int)
- outstruct.AnsweredInRound = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int)
-
- return *outstruct, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) GetRoundData(_roundId *big.Int) (GetRoundData,
-
- error) {
- return _AggregatorV2V3Interface.Contract.GetRoundData(&_AggregatorV2V3Interface.CallOpts, _roundId)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) GetRoundData(_roundId *big.Int) (GetRoundData,
-
- error) {
- return _AggregatorV2V3Interface.Contract.GetRoundData(&_AggregatorV2V3Interface.CallOpts, _roundId)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) GetTimestamp(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "getTimestamp", roundId)
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) GetTimestamp(roundId *big.Int) (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.GetTimestamp(&_AggregatorV2V3Interface.CallOpts, roundId)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) GetTimestamp(roundId *big.Int) (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.GetTimestamp(&_AggregatorV2V3Interface.CallOpts, roundId)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) LatestAnswer(opts *bind.CallOpts) (*big.Int, error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "latestAnswer")
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) LatestAnswer() (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.LatestAnswer(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) LatestAnswer() (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.LatestAnswer(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) LatestRound(opts *bind.CallOpts) (*big.Int, error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "latestRound")
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) LatestRound() (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.LatestRound(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) LatestRound() (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.LatestRound(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) LatestRoundData(opts *bind.CallOpts) (LatestRoundData,
-
- error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "latestRoundData")
-
- outstruct := new(LatestRoundData)
- if err != nil {
- return *outstruct, err
- }
-
- outstruct.RoundId = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
- outstruct.Answer = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
- outstruct.StartedAt = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
- outstruct.UpdatedAt = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int)
- outstruct.AnsweredInRound = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int)
-
- return *outstruct, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) LatestRoundData() (LatestRoundData,
-
- error) {
- return _AggregatorV2V3Interface.Contract.LatestRoundData(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) LatestRoundData() (LatestRoundData,
-
- error) {
- return _AggregatorV2V3Interface.Contract.LatestRoundData(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) LatestTimestamp(opts *bind.CallOpts) (*big.Int, error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "latestTimestamp")
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) LatestTimestamp() (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.LatestTimestamp(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) LatestTimestamp() (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.LatestTimestamp(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCaller) Version(opts *bind.CallOpts) (*big.Int, error) {
- var out []interface{}
- err := _AggregatorV2V3Interface.contract.Call(opts, &out, "version")
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceSession) Version() (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.Version(&_AggregatorV2V3Interface.CallOpts)
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceCallerSession) Version() (*big.Int, error) {
- return _AggregatorV2V3Interface.Contract.Version(&_AggregatorV2V3Interface.CallOpts)
-}
-
-type AggregatorV2V3InterfaceAnswerUpdatedIterator struct {
- Event *AggregatorV2V3InterfaceAnswerUpdated
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *AggregatorV2V3InterfaceAnswerUpdatedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(AggregatorV2V3InterfaceAnswerUpdated)
- 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(AggregatorV2V3InterfaceAnswerUpdated)
- 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 *AggregatorV2V3InterfaceAnswerUpdatedIterator) Error() error {
- return it.fail
-}
-
-func (it *AggregatorV2V3InterfaceAnswerUpdatedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type AggregatorV2V3InterfaceAnswerUpdated struct {
- Current *big.Int
- RoundId *big.Int
- UpdatedAt *big.Int
- Raw types.Log
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceFilterer) FilterAnswerUpdated(opts *bind.FilterOpts, current []*big.Int, roundId []*big.Int) (*AggregatorV2V3InterfaceAnswerUpdatedIterator, error) {
-
- var currentRule []interface{}
- for _, currentItem := range current {
- currentRule = append(currentRule, currentItem)
- }
- var roundIdRule []interface{}
- for _, roundIdItem := range roundId {
- roundIdRule = append(roundIdRule, roundIdItem)
- }
-
- logs, sub, err := _AggregatorV2V3Interface.contract.FilterLogs(opts, "AnswerUpdated", currentRule, roundIdRule)
- if err != nil {
- return nil, err
- }
- return &AggregatorV2V3InterfaceAnswerUpdatedIterator{contract: _AggregatorV2V3Interface.contract, event: "AnswerUpdated", logs: logs, sub: sub}, nil
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceFilterer) WatchAnswerUpdated(opts *bind.WatchOpts, sink chan<- *AggregatorV2V3InterfaceAnswerUpdated, current []*big.Int, roundId []*big.Int) (event.Subscription, error) {
-
- var currentRule []interface{}
- for _, currentItem := range current {
- currentRule = append(currentRule, currentItem)
- }
- var roundIdRule []interface{}
- for _, roundIdItem := range roundId {
- roundIdRule = append(roundIdRule, roundIdItem)
- }
-
- logs, sub, err := _AggregatorV2V3Interface.contract.WatchLogs(opts, "AnswerUpdated", currentRule, roundIdRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(AggregatorV2V3InterfaceAnswerUpdated)
- if err := _AggregatorV2V3Interface.contract.UnpackLog(event, "AnswerUpdated", 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 (_AggregatorV2V3Interface *AggregatorV2V3InterfaceFilterer) ParseAnswerUpdated(log types.Log) (*AggregatorV2V3InterfaceAnswerUpdated, error) {
- event := new(AggregatorV2V3InterfaceAnswerUpdated)
- if err := _AggregatorV2V3Interface.contract.UnpackLog(event, "AnswerUpdated", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type AggregatorV2V3InterfaceNewRoundIterator struct {
- Event *AggregatorV2V3InterfaceNewRound
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *AggregatorV2V3InterfaceNewRoundIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(AggregatorV2V3InterfaceNewRound)
- 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(AggregatorV2V3InterfaceNewRound)
- 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 *AggregatorV2V3InterfaceNewRoundIterator) Error() error {
- return it.fail
-}
-
-func (it *AggregatorV2V3InterfaceNewRoundIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type AggregatorV2V3InterfaceNewRound struct {
- RoundId *big.Int
- StartedBy common.Address
- StartedAt *big.Int
- Raw types.Log
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceFilterer) FilterNewRound(opts *bind.FilterOpts, roundId []*big.Int, startedBy []common.Address) (*AggregatorV2V3InterfaceNewRoundIterator, error) {
-
- var roundIdRule []interface{}
- for _, roundIdItem := range roundId {
- roundIdRule = append(roundIdRule, roundIdItem)
- }
- var startedByRule []interface{}
- for _, startedByItem := range startedBy {
- startedByRule = append(startedByRule, startedByItem)
- }
-
- logs, sub, err := _AggregatorV2V3Interface.contract.FilterLogs(opts, "NewRound", roundIdRule, startedByRule)
- if err != nil {
- return nil, err
- }
- return &AggregatorV2V3InterfaceNewRoundIterator{contract: _AggregatorV2V3Interface.contract, event: "NewRound", logs: logs, sub: sub}, nil
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3InterfaceFilterer) WatchNewRound(opts *bind.WatchOpts, sink chan<- *AggregatorV2V3InterfaceNewRound, roundId []*big.Int, startedBy []common.Address) (event.Subscription, error) {
-
- var roundIdRule []interface{}
- for _, roundIdItem := range roundId {
- roundIdRule = append(roundIdRule, roundIdItem)
- }
- var startedByRule []interface{}
- for _, startedByItem := range startedBy {
- startedByRule = append(startedByRule, startedByItem)
- }
-
- logs, sub, err := _AggregatorV2V3Interface.contract.WatchLogs(opts, "NewRound", roundIdRule, startedByRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(AggregatorV2V3InterfaceNewRound)
- if err := _AggregatorV2V3Interface.contract.UnpackLog(event, "NewRound", 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 (_AggregatorV2V3Interface *AggregatorV2V3InterfaceFilterer) ParseNewRound(log types.Log) (*AggregatorV2V3InterfaceNewRound, error) {
- event := new(AggregatorV2V3InterfaceNewRound)
- if err := _AggregatorV2V3Interface.contract.UnpackLog(event, "NewRound", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type GetRoundData struct {
- RoundId *big.Int
- Answer *big.Int
- StartedAt *big.Int
- UpdatedAt *big.Int
- AnsweredInRound *big.Int
-}
-type LatestRoundData struct {
- RoundId *big.Int
- Answer *big.Int
- StartedAt *big.Int
- UpdatedAt *big.Int
- AnsweredInRound *big.Int
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3Interface) ParseLog(log types.Log) (generated.AbigenLog, error) {
- switch log.Topics[0] {
- case _AggregatorV2V3Interface.abi.Events["AnswerUpdated"].ID:
- return _AggregatorV2V3Interface.ParseAnswerUpdated(log)
- case _AggregatorV2V3Interface.abi.Events["NewRound"].ID:
- return _AggregatorV2V3Interface.ParseNewRound(log)
-
- default:
- return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
- }
-}
-
-func (AggregatorV2V3InterfaceAnswerUpdated) Topic() common.Hash {
- return common.HexToHash("0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f")
-}
-
-func (AggregatorV2V3InterfaceNewRound) Topic() common.Hash {
- return common.HexToHash("0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271")
-}
-
-func (_AggregatorV2V3Interface *AggregatorV2V3Interface) Address() common.Address {
- return _AggregatorV2V3Interface.address
-}
-
-type AggregatorV2V3InterfaceInterface interface {
- Decimals(opts *bind.CallOpts) (uint8, error)
-
- Description(opts *bind.CallOpts) (string, error)
-
- GetAnswer(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error)
-
- GetRoundData(opts *bind.CallOpts, _roundId *big.Int) (GetRoundData,
-
- error)
-
- GetTimestamp(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error)
-
- LatestAnswer(opts *bind.CallOpts) (*big.Int, error)
-
- LatestRound(opts *bind.CallOpts) (*big.Int, error)
-
- LatestRoundData(opts *bind.CallOpts) (LatestRoundData,
-
- error)
-
- LatestTimestamp(opts *bind.CallOpts) (*big.Int, error)
-
- Version(opts *bind.CallOpts) (*big.Int, error)
-
- FilterAnswerUpdated(opts *bind.FilterOpts, current []*big.Int, roundId []*big.Int) (*AggregatorV2V3InterfaceAnswerUpdatedIterator, error)
-
- WatchAnswerUpdated(opts *bind.WatchOpts, sink chan<- *AggregatorV2V3InterfaceAnswerUpdated, current []*big.Int, roundId []*big.Int) (event.Subscription, error)
-
- ParseAnswerUpdated(log types.Log) (*AggregatorV2V3InterfaceAnswerUpdated, error)
-
- FilterNewRound(opts *bind.FilterOpts, roundId []*big.Int, startedBy []common.Address) (*AggregatorV2V3InterfaceNewRoundIterator, error)
-
- WatchNewRound(opts *bind.WatchOpts, sink chan<- *AggregatorV2V3InterfaceNewRound, roundId []*big.Int, startedBy []common.Address) (event.Subscription, error)
-
- ParseNewRound(log types.Log) (*AggregatorV2V3InterfaceNewRound, error)
-
- ParseLog(log types.Log) (generated.AbigenLog, error)
-
- Address() common.Address
-}
diff --git a/core/gethwrappers/generation/generate/genwrapper/genwrapper.go b/core/gethwrappers/generation/generate/genwrapper/genwrapper.go
new file mode 100644
index 00000000000..380d6827553
--- /dev/null
+++ b/core/gethwrappers/generation/generate/genwrapper/genwrapper.go
@@ -0,0 +1,44 @@
+package genwrapper
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ gethParams "github.com/ethereum/go-ethereum/params"
+
+ gethwrappers2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers"
+)
+
+func GenWrapper(abiPath string, binPath string, className string, pkgName string) {
+ fmt.Println("Generating", pkgName, "contract wrapper")
+
+ cwd, err := os.Getwd() // gethwrappers directory
+ if err != nil {
+ gethwrappers2.Exit("could not get working directory", err)
+ }
+ outDir := filepath.Join(cwd, "generated", pkgName)
+ if mkdErr := os.MkdirAll(outDir, 0700); err != nil {
+ gethwrappers2.Exit("failed to create wrapper dir", mkdErr)
+ }
+ outPath := filepath.Join(outDir, pkgName+".go")
+
+ gethwrappers2.Abigen(gethwrappers2.AbigenArgs{
+ Bin: binPath, ABI: abiPath, Out: outPath, Type: className, Pkg: pkgName,
+ })
+
+ // Build succeeded, so update the versions db with the new contract data
+ versions, err := gethwrappers2.ReadVersionsDB()
+ if err != nil {
+ gethwrappers2.Exit("could not read current versions database", err)
+ }
+ versions.GethVersion = gethParams.Version
+ versions.ContractVersions[pkgName] = gethwrappers2.ContractVersion{
+ Hash: gethwrappers2.VersionHash(abiPath, binPath),
+ AbiPath: abiPath,
+ BinaryPath: binPath,
+ }
+ if err := gethwrappers2.WriteVersionsDB(versions); err != nil {
+ gethwrappers2.Exit("could not save versions db", err)
+ }
+}
diff --git a/core/gethwrappers/generation/generate/wrap.go b/core/gethwrappers/generation/generate/wrap.go
index 967e703d393..db251101cc3 100644
--- a/core/gethwrappers/generation/generate/wrap.go
+++ b/core/gethwrappers/generation/generate/wrap.go
@@ -1,13 +1,9 @@
package main
import (
- "fmt"
"os"
- "path/filepath"
- gethParams "github.com/ethereum/go-ethereum/params"
-
- gethwrappers2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generation/generate/genwrapper"
)
func main() {
@@ -15,34 +11,6 @@ func main() {
binPath := os.Args[2]
className := os.Args[3]
pkgName := os.Args[4]
- fmt.Println("Generating", pkgName, "contract wrapper")
-
- cwd, err := os.Getwd() // gethwrappers directory
- if err != nil {
- gethwrappers2.Exit("could not get working directory", err)
- }
- outDir := filepath.Join(cwd, "generated", pkgName)
- if mkdErr := os.MkdirAll(outDir, 0700); err != nil {
- gethwrappers2.Exit("failed to create wrapper dir", mkdErr)
- }
- outPath := filepath.Join(outDir, pkgName+".go")
-
- gethwrappers2.Abigen(gethwrappers2.AbigenArgs{
- Bin: binPath, ABI: abiPath, Out: outPath, Type: className, Pkg: pkgName,
- })
- // Build succeeded, so update the versions db with the new contract data
- versions, err := gethwrappers2.ReadVersionsDB()
- if err != nil {
- gethwrappers2.Exit("could not read current versions database", err)
- }
- versions.GethVersion = gethParams.Version
- versions.ContractVersions[pkgName] = gethwrappers2.ContractVersion{
- Hash: gethwrappers2.VersionHash(abiPath, binPath),
- AbiPath: abiPath,
- BinaryPath: binPath,
- }
- if err := gethwrappers2.WriteVersionsDB(versions); err != nil {
- gethwrappers2.Exit("could not save versions db", err)
- }
+ genwrapper.GenWrapper(abiPath, binPath, className, pkgName)
}
diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 514c2596ff2..20b5bfbdbad 100644
--- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -1,6 +1,4 @@
GETH_VERSION: 1.14.11
-aggregator_v2v3_interface: ../../contracts/solc/v0.8.6/AggregatorV2V3Interface/AggregatorV2V3Interface.abi ../../contracts/solc/v0.8.6/AggregatorV2V3Interface/AggregatorV2V3Interface.bin 95e8814b408bb05bf21742ef580d98698b7db6a9bac6a35c3de12b23aec4ee28
-aggregator_v3_interface: ../../contracts/solc/v0.8.6/AggregatorV2V3Interface/AggregatorV3Interface.abi ../../contracts/solc/v0.8.6/AggregatorV2V3Interface/AggregatorV3Interface.bin 351b55d3b0f04af67db6dfb5c92f1c64479400ca1fec77afc20bc0ce65cb49ab
arbitrum_module: ../../contracts/solc/v0.8.19/ArbitrumModule/ArbitrumModule.abi ../../contracts/solc/v0.8.19/ArbitrumModule/ArbitrumModule.bin 12a7bad1f887d832d101a73ae279a91a90c93fd72befea9983e85eff493f62f4
authorized_forwarder: ../../contracts/solc/v0.8.19/AuthorizedForwarder/AuthorizedForwarder.abi ../../contracts/solc/v0.8.19/AuthorizedForwarder/AuthorizedForwarder.bin 8ea76c883d460f8353a45a493f2aebeb5a2d9a7b4619d1bc4fff5fb590bb3e10
authorized_receiver: ../../contracts/solc/v0.8.19/AuthorizedReceiver/AuthorizedReceiver.abi ../../contracts/solc/v0.8.19/AuthorizedReceiver/AuthorizedReceiver.bin 18e8969ba3234b027e1b16c11a783aca58d0ea5c2361010ec597f134b7bf1c4f
@@ -24,7 +22,6 @@ batch_vrf_coordinator_v2: ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2/Batc
batch_vrf_coordinator_v2plus: ../../contracts/solc/v0.8.19/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.abi ../../contracts/solc/v0.8.19/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.bin f13715b38b5b9084b08bffa571fb1c8ef686001535902e1255052f074b31ad4e
blockhash_store: ../../contracts/solc/v0.8.19/BlockhashStore/BlockhashStore.abi ../../contracts/solc/v0.8.19/BlockhashStore/BlockhashStore.bin 31b118f9577240c8834c35f8b5a1440e82a6ca8aea702970de2601824b6ab0e1
chain_module_base: ../../contracts/solc/v0.8.19/ChainModuleBase/ChainModuleBase.abi ../../contracts/solc/v0.8.19/ChainModuleBase/ChainModuleBase.bin 7a82cc28014761090185c2650239ad01a0901181f1b2b899b42ca293bcda3741
-chain_reader_tester: ../../contracts/solc/v0.8.19/ChainReaderTester/ChainReaderTester.abi ../../contracts/solc/v0.8.19/ChainReaderTester/ChainReaderTester.bin ee9839cc26b615d168d5dbc8ef4f31d8d8b1ef8d276d8ee50625476f87ef1508
chain_specific_util_helper: ../../contracts/solc/v0.8.6/ChainSpecificUtilHelper/ChainSpecificUtilHelper.abi ../../contracts/solc/v0.8.6/ChainSpecificUtilHelper/ChainSpecificUtilHelper.bin 66eb30b0717fefe05672df5ec863c0b9a5a654623c4757307a2726d8f31e26b1
counter: ../../contracts/solc/v0.8.6/Counter/Counter.abi ../../contracts/solc/v0.8.6/Counter/Counter.bin 6ca06e000e8423573ffa0bdfda749d88236ab3da2a4cbb4a868c706da90488c9
cron_upkeep_factory_wrapper: ../../contracts/solc/v0.8.6/CronUpkeepFactory/CronUpkeepFactory.abi - dacb0f8cdf54ae9d2781c5e720fc314b32ed5e58eddccff512c75d6067292cd7
diff --git a/core/gethwrappers/generation/wrap.go b/core/gethwrappers/generation/wrap.go
new file mode 100644
index 00000000000..8bbdf61483c
--- /dev/null
+++ b/core/gethwrappers/generation/wrap.go
@@ -0,0 +1,22 @@
+package main
+
+import (
+ "os"
+
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generation/generate/genwrapper"
+)
+
+const (
+ rootDir = "../../../contracts/solc/"
+)
+
+func main() {
+ project := os.Args[1]
+ className := os.Args[2]
+ pkgName := os.Args[3]
+
+ abiPath := rootDir + project + "/" + className + "/" + className + ".sol/" + className + ".abi.json"
+ binPath := rootDir + project + "/" + className + "/" + className + ".sol/" + className + ".bin"
+
+ genwrapper.GenWrapper(abiPath, binPath, className, pkgName)
+}
diff --git a/core/gethwrappers/go_generate.go b/core/gethwrappers/go_generate.go
index 25001027a59..1fee016fe8b 100644
--- a/core/gethwrappers/go_generate.go
+++ b/core/gethwrappers/go_generate.go
@@ -146,21 +146,13 @@ package gethwrappers
//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.19/VRFCoordinatorTestV2_5/VRFCoordinatorTestV2_5.abi ../../contracts/solc/v0.8.19/VRFCoordinatorTestV2_5/VRFCoordinatorTestV2_5.bin VRFCoordinatorTestV2_5 vrf_coordinator_test_v2_5
// Aggregators
-//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/AggregatorV2V3Interface/AggregatorV2V3Interface.abi ../../contracts/solc/v0.8.6/AggregatorV2V3Interface/AggregatorV2V3Interface.bin AggregatorV2V3Interface aggregator_v2v3_interface
-//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/AggregatorV2V3Interface/AggregatorV3Interface.abi ../../contracts/solc/v0.8.6/AggregatorV2V3Interface/AggregatorV3Interface.bin AggregatorV3Interface aggregator_v3_interface
//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/MockAggregatorProxy/MockAggregatorProxy.abi ../../contracts/solc/v0.8.6/MockAggregatorProxy/MockAggregatorProxy.bin MockAggregatorProxy mock_aggregator_proxy
-// Log tester
-
-// ChainReader test contract
-//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.19/ChainReaderTester/ChainReaderTester.abi ../../contracts/solc/v0.8.19/ChainReaderTester/ChainReaderTester.bin ChainReaderTester chain_reader_tester
-
//go:generate go generate ./functions
//go:generate go generate ./keystone
//go:generate go generate ./llo-feeds
//go:generate go generate ./operatorforwarder
//go:generate go generate ./shared
-//go:generate go generate ./transmission
//go:generate go generate ./ccip
//go:generate go generate ./liquiditymanager
//go:generate go generate ./workflow
diff --git a/core/gethwrappers/go_generate_test.go b/core/gethwrappers/go_generate_test.go
index a6253cb1a66..1066149278f 100644
--- a/core/gethwrappers/go_generate_test.go
+++ b/core/gethwrappers/go_generate_test.go
@@ -16,7 +16,8 @@ import (
"github.com/fatih/color"
cutils "github.com/smartcontractkit/chainlink-common/pkg/utils"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
"github.com/smartcontractkit/chainlink/v2/core/utils"
"github.com/stretchr/testify/assert"
@@ -29,7 +30,7 @@ const compileCommand = "../../contracts/scripts/native_solc_compile_all"
// contract artifacts in contracts/solc with the abi and bytecode stored in the
// contract wrapper
func TestCheckContractHashesFromLastGoGenerate(t *testing.T) {
- testutils.SkipShort(t, "requires compiled artifacts")
+ tests.SkipShort(t, "requires compiled artifacts")
versions, err := ReadVersionsDB()
require.NoError(t, err)
require.NotEmpty(t, versions.GethVersion, `version DB should have a "GETH_VERSION:" line`)
diff --git a/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0/capabilities_registry.go b/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0/capabilities_registry.go
new file mode 100644
index 00000000000..2a21f64da56
--- /dev/null
+++ b/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0/capabilities_registry.go
@@ -0,0 +1,2352 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package capabilities_registry
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
+)
+
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+type CapabilitiesRegistryCapability struct {
+ LabelledName string
+ Version string
+ CapabilityType uint8
+ ResponseType uint8
+ ConfigurationContract common.Address
+}
+
+type CapabilitiesRegistryCapabilityConfiguration struct {
+ CapabilityId [32]byte
+ Config []byte
+}
+
+type CapabilitiesRegistryCapabilityInfo struct {
+ HashedId [32]byte
+ LabelledName string
+ Version string
+ CapabilityType uint8
+ ResponseType uint8
+ ConfigurationContract common.Address
+ IsDeprecated bool
+}
+
+type CapabilitiesRegistryDONInfo struct {
+ Id uint32
+ ConfigCount uint32
+ F uint8
+ IsPublic bool
+ AcceptsWorkflows bool
+ NodeP2PIds [][32]byte
+ CapabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration
+}
+
+type CapabilitiesRegistryNodeOperator struct {
+ Admin common.Address
+ Name string
+}
+
+type CapabilitiesRegistryNodeParams struct {
+ NodeOperatorId uint32
+ Signer [32]byte
+ P2pId [32]byte
+ EncryptionPublicKey [32]byte
+ HashedCapabilityIds [][32]byte
+}
+
+type INodeInfoProviderNodeInfo struct {
+ NodeOperatorId uint32
+ ConfigCount uint32
+ WorkflowDONId uint32
+ Signer [32]byte
+ P2pId [32]byte
+ EncryptionPublicKey [32]byte
+ HashedCapabilityIds [][32]byte
+ CapabilitiesDONIds []*big.Int
+}
+
+var CapabilitiesRegistryMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityIsDeprecated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"CapabilityRequiredByDON\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"DONDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONNode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedConfigurationContract\",\"type\":\"address\"}],\"name\":\"InvalidCapabilityConfigurationContractInterface\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"nodeCount\",\"type\":\"uint256\"}],\"name\":\"InvalidFaultTolerance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"InvalidNodeCapabilities\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encryptionPublicKey\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeEncryptionPublicKey\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeOperatorAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeP2PId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"lengthOne\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthTwo\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodeAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotSupportCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfCapabilitiesDON\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfWorkflowDON\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilitiesRegistry.Capability[]\",\"name\":\"capabilities\",\"type\":\"tuple[]\"}],\"name\":\"addCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"addNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionPublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"deprecateCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilities\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isDeprecated\",\"type\":\"bool\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilitiesRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isDeprecated\",\"type\":\"bool\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getCapabilityConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilitiesRegistry.DONInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilitiesRegistry.DONInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"getHashedCapabilityId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextDONId\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionPublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structINodeInfoProvider.NodeInfo\",\"name\":\"nodeInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"getNodeOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.NodeOperator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeOperators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.NodeOperator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionPublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structINodeInfoProvider.NodeInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"p2pIds\",\"type\":\"bytes32[]\"}],\"name\":\"getNodesByP2PIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"workflowDONId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionPublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"capabilitiesDONIds\",\"type\":\"uint256[]\"}],\"internalType\":\"structINodeInfoProvider.NodeInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilitiesRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"name\":\"updateDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilitiesRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"updateNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"encryptionPublicKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilitiesRegistry.NodeParams[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61536d80620001776000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806350c946fe116100f95780638da5cb5b11610097578063ddbe4f8211610071578063ddbe4f821461044d578063e29581aa14610462578063f2fde38b1461046a578063fcdc8efe1461047d57600080fd5b80638da5cb5b146103f25780639cb7c5f41461041a578063d8bc7b681461043a57600080fd5b8063715f5295116100d3578063715f5295146103b157806379ba5097146103c457806384f5ed8a146103cc57806386fa4246146103df57600080fd5b806350c946fe146103695780635d83d9671461038957806366acaa331461039c57600080fd5b806323537405116101665780632c01a1e8116101405780632c01a1e81461030f578063358039f414610322578063398f3773146103355780633f2a13c91461034857600080fd5b806323537405146102c9578063275459f2146102e95780632a852933146102fc57600080fd5b8063181f5a77116101a2578063181f5a77146102365780631d05394c1461027f578063214502431461029457806322bdbcbc146102a957600080fd5b806305a51966146101c95780630fe5800a146101f25780631257001114610213575b600080fd5b6101dc6101d73660046140ab565b6104a3565b6040516101e991906141aa565b60405180910390f35b61020561020036600461436f565b61062c565b6040519081526020016101e9565b6102266102213660046143d3565b61065f565b60405190151581526020016101e9565b6102726040518060400160405280601a81526020017f4361706162696c6974696573526567697374727920312e312e3000000000000081525081565b6040516101e9919061445a565b61029261028d3660046140ab565b61066c565b005b61029c610874565b6040516101e99190614568565b6102bc6102b73660046145f6565b6109d1565b6040516101e9919061464e565b6102dc6102d73660046145f6565b610abe565b6040516101e99190614661565b6102926102f73660046140ab565b610b02565b61029261030a366004614695565b610bd9565b61029261031d3660046140ab565b610cb9565b6102926103303660046140ab565b610f5c565b6102926103433660046140ab565b6116d1565b61035b610356366004614737565b611890565b6040516101e9929190614761565b61037c6103773660046143d3565b611a7c565b6040516101e99190614786565b6102926103973660046140ab565b611b69565b6103a4611c5e565b6040516101e99190614799565b6102926103bf3660046140ab565b611e41565b610292611ef3565b6102926103da3660046140ab565b611ff0565b6102926103ed36600461480e565b61250b565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e9565b61042d6104283660046143d3565b61284b565b6040516101e99190614955565b610292610448366004614968565b612a86565b610455612b50565b6040516101e991906149ee565b6101dc612c44565b610292610478366004614a87565b612d55565b600e54640100000000900463ffffffff1660405163ffffffff90911681526020016101e9565b606060008267ffffffffffffffff8111156104c0576104c061422c565b60405190808252806020026020018201604052801561054f57816020015b60408051610100810182526000808252602080830182905292820181905260608083018290526080830182905260a083019190915260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816104de5790505b50905060005b838110156106225761057e85858381811061057257610572614aa2565b90506020020135611a7c565b82828151811061059057610590614aa2565b602002602001018190525060008019168282815181106105b2576105b2614aa2565b6020026020010151608001510361061a578484828181106105d5576105d5614aa2565b905060200201356040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60405180910390fd5b600101610555565b5090505b92915050565b60008282604051602001610641929190614761565b60405160208183030381529060405280519060200120905092915050565b6000610626600583612d69565b610674612d84565b60005b8181101561086f57600083838381811061069357610693614aa2565b90506020020160208101906106a891906145f6565b63ffffffff8181166000908152600d60209081526040808320805464010000000081049095168085526001820190935290832094955093909290916a010000000000000000000090910460ff16905b61070083612e07565b8110156107a057811561075657600c600061071b8584612e11565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff169055610798565b6107968663ffffffff16600c60006107778588612e1190919063ffffffff16565b8152602001908152602001600020600501612e1d90919063ffffffff16565b505b6001016106f7565b508354640100000000900463ffffffff166000036107f2576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff86166004820152602401610611565b63ffffffff85166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffff0000000000000000000000169055519182527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a25050505050806001019050610677565b505050565b600e54606090640100000000900463ffffffff166000610895600183614b00565b63ffffffff1667ffffffffffffffff8111156108b3576108b361422c565b60405190808252806020026020018201604052801561093a57816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816108d15790505b509050600060015b8363ffffffff168163ffffffff1610156109ae5763ffffffff8082166000908152600d602052604090205416156109a65761097c81612e29565b83838151811061098e5761098e614aa2565b6020026020010181905250816109a390614b1d565b91505b600101610942565b506109ba600184614b00565b63ffffffff1681146109ca578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191610a3590614b55565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6190614b55565b8015610aae5780601f10610a8357610100808354040283529160200191610aae565b820191906000526020600020905b815481529060010190602001808311610a9157829003601f168201915b5050505050815250509050919050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c081019190915261062682612e29565b610b0a612d84565b60005b63ffffffff811682111561086f57600083838363ffffffff16818110610b3557610b35614aa2565b9050602002016020810190610b4a91906145f6565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155919250610b956001830182613ff9565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a250610bd281614ba8565b9050610b0d565b610be1612d84565b63ffffffff8088166000908152600d60205260408120805490926401000000009091041690819003610c47576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff8a166004820152602401610611565b610cae888888886040518060a001604052808f63ffffffff16815260200187610c6f90614ba8565b63ffffffff811682528b15156020830152895460ff6a01000000000000000000009091048116151560408401528b1660609092019190915296506130f4565b505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610f56576000848483818110610cf357610cf3614aa2565b602090810292909201356000818152600c90935260409092206001810154929350919050610d50576040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260048101839052602401610611565b6000610d5e82600501612e07565b1115610db357610d716005820184612e11565b6040517f60a6d89800000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101839052604401610611565b805468010000000000000000900463ffffffff1615610e1b5780546040517f60b9df730000000000000000000000000000000000000000000000000000000081526801000000000000000090910463ffffffff16600482015260248101839052604401610611565b83158015610e555750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610e8e576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610611565b6001810154610e9f90600790612e1d565b506002810154610eb190600990612e1d565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001681556001810182905560028101829055600381018290559060058201818181610f0d8282614033565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610f4491815260200190565b60405180910390a15050600101610cd7565b50505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610f56576000848483818110610f9657610f96614aa2565b9050602002810190610fa89190614bcb565b610fb190614c09565b6040808201516000908152600c6020908152828220805463ffffffff168352600b82528383208451808601909552805473ffffffffffffffffffffffffffffffffffffffff168552600181018054969750919593949390928401919061101690614b55565b80601f016020809104026020016040519081016040528092919081815260200182805461104290614b55565b801561108f5780601f106110645761010080835404028352916020019161108f565b820191906000526020600020905b81548152906001019060200180831161107257829003601f168201915b5050509190925250505060018301549091506110df5782604001516040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b841580156111045750805173ffffffffffffffffffffffffffffffffffffffff163314155b1561113d576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610611565b6020830151611178576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001820154602084015181146111f957602084015161119990600790612d69565b156111d0576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084015160018401556111e5600782612e1d565b5060208401516111f79060079061390b565b505b606084015161123c5783606001516040517f37d8976500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6080840151805160000361127e57806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106119190614ce6565b8354600090859060049061129f90640100000000900463ffffffff16614ba8565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060005b8251811015611384576112f78382815181106112df576112df614aa2565b60200260200101516003612d6990919063ffffffff16565b61132f57826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106119190614ce6565b61137b83828151811061134457611344614aa2565b60200260200101518760040160008563ffffffff1663ffffffff16815260200190815260200160002061390b90919063ffffffff16565b506001016112c1565b50845468010000000000000000900463ffffffff1680156114e55763ffffffff8082166000908152600d60209081526040808320805464010000000090049094168352600190930181528282206002018054845181840281018401909552808552929392909183018282801561141957602002820191906000526020600020905b815481526020019060010190808311611405575b5050505050905060005b81518110156114e25761147882828151811061144157611441614aa2565b60200260200101518960040160008763ffffffff1663ffffffff168152602001908152602001600020612d6990919063ffffffff16565b6114da5781818151811061148e5761148e614aa2565b6020026020010151836040517f03dcd86200000000000000000000000000000000000000000000000000000000815260040161061192919091825263ffffffff16602082015260400190565b600101611423565b50505b60006114f387600501613917565b905060005b81518163ffffffff161015611639576000828263ffffffff168151811061152157611521614aa2565b60209081029190910181015163ffffffff8082166000908152600d845260408082208054640100000000900490931682526001909201845281812060020180548351818702810187019094528084529395509093919290918301828280156115a857602002820191906000526020600020905b815481526020019060010190808311611594575b5050505050905060005b8151811015611625576116078282815181106115d0576115d0614aa2565b60200260200101518c60040160008a63ffffffff1663ffffffff168152602001908152602001600020612d6990919063ffffffff16565b61161d5781818151811061148e5761148e614aa2565b6001016115b2565b5050508061163290614ba8565b90506114f8565b50875187547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff90911690811788556040808a015160028a0181905560608b015160038b01556020808c01518351928352908201527f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a25050505050505050806001019050610f7a565b6116d9612d84565b60005b8181101561086f5760008383838181106116f8576116f8614aa2565b905060200281019061170a9190614d2a565b61171390614d5e565b805190915073ffffffffffffffffffffffffffffffffffffffff16611764576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff000000000000000000000000000000000000000016921691909117815592519192909160018201906117f09082614e18565b5050600e805490915060009061180b9063ffffffff16614ba8565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e846020015160405161187e919061445a565b60405180910390a350506001016116dc565b63ffffffff8083166000908152600d602090815260408083208054640100000000900490941680845260019094018252808320858452600301909152812080546060938493909290916118e290614b55565b80601f016020809104026020016040519081016040528092919081815260200182805461190e90614b55565b801561195b5780601f106119305761010080835404028352916020019161195b565b820191906000526020600020905b81548152906001019060200180831161193e57829003601f168201915b5050506000888152600260208190526040909120015492935060609262010000900473ffffffffffffffffffffffffffffffffffffffff16159150611a6e905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526201000090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015611a25573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a6b9190810190614f32565b90505b9093509150505b9250929050565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a082019290925260c0810182905260e081019190915260408051610100810182526000848152600c6020908152838220805463ffffffff8082168652640100000000820481168487018190526801000000000000000090920416858701526001820154606086015260028201546080860152600382015460a0860152835260040190529190912060c0820190611b3e90613917565b8152602001611b61600c6000868152602001908152602001600020600501613917565b905292915050565b611b71612d84565b60005b8181101561086f576000838383818110611b9057611b90614aa2565b905060200201359050611bad816003612d6990919063ffffffff16565b611be6576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b611bf160058261390b565b611c2a576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b60405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a250600101611b74565b600e5460609063ffffffff166000611c77600183614b00565b63ffffffff1667ffffffffffffffff811115611c9557611c9561422c565b604051908082528060200260200182016040528015611cdb57816020015b604080518082019091526000815260606020820152815260200190600190039081611cb35790505b509050600060015b8363ffffffff168163ffffffff161015611e2b5763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611e235763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff1683526001810180549192840191611d7790614b55565b80601f0160208091040260200160405190810160405280929190818152602001828054611da390614b55565b8015611df05780601f10611dc557610100808354040283529160200191611df0565b820191906000526020600020905b815481529060010190602001808311611dd357829003601f168201915b505050505081525050838381518110611e0b57611e0b614aa2565b602002602001018190525081611e2090614b1d565b91505b600101611ce3565b50600e546109ba9060019063ffffffff16614b00565b611e49612d84565b60005b8181101561086f576000838383818110611e6857611e68614aa2565b9050602002810190611e7a9190614bcb565b611e8390614faf565b90506000611e998260000151836020015161062c565b9050611ea660038261390b565b611edf576040517febf5255100000000000000000000000000000000000000000000000000000000815260048101829052602401610611565b611ee98183613924565b5050600101611e4c565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610611565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610f5657600084848381811061202a5761202a614aa2565b905060200281019061203c9190614bcb565b61204590614c09565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff16825260018101805495965093949193909284019161209b90614b55565b80601f01602080910402602001604051908101604052809291908181526020018280546120c790614b55565b80156121145780601f106120e957610100808354040283529160200191612114565b820191906000526020600020905b8154815290600101906020018083116120f757829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff1661217a5781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152602401610611565b8315801561219f5750805173ffffffffffffffffffffffffffffffffffffffff163314155b156121d8576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610611565b6040808301516000908152600c6020522060018101541561222d5782604001516040517f5461848300000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b60408301516122705782604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6020830151158061228d5750602083015161228d90600790612d69565b156122c4576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301516123075782606001516040517f37d8976500000000000000000000000000000000000000000000000000000000815260040161061191815260200190565b6080830151805160000361234957806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106119190614ce6565b8154829060049061236790640100000000900463ffffffff16614ba8565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b825181101561243d576123b08382815181106112df576112df614aa2565b6123e857826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106119190614ce6565b6124348382815181106123fd576123fd614aa2565b60200260200101518560040160008563ffffffff1663ffffffff16815260200190815260200160002061390b90919063ffffffff16565b50600101612392565b5060608501516003840155845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9182161784556040860151600285015560208601516001850181905561249d916007919061390b16565b5060408501516124af9060099061390b565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a2505050505080600101905061200e565b82811461254e576040517fab8b67c60000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610611565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b8481101561284357600086868381811061258657612586614aa2565b905060200201602081019061259b91906145f6565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff1661260a576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610611565b600086868581811061261e5761261e614aa2565b90506020028101906126309190614d2a565b61263990614d5e565b805190915073ffffffffffffffffffffffffffffffffffffffff1661268a576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815473ffffffffffffffffffffffffffffffffffffffff1633148015906126c757503373ffffffffffffffffffffffffffffffffffffffff861614155b15612700576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610611565b8051825473ffffffffffffffffffffffffffffffffffffffff908116911614158061277c5750602080820151604051612739920161445a565b60405160208183030381529060405280519060200120826001016040516020016127639190615055565b6040516020818303038152906040528051906020012014155b1561283557805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602081015160018301906127d69082614e18565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a28836020015160405161282c919061445a565b60405180910390a35b50505080600101905061256a565b505050505050565b61288c6040805160e0810182526000808252606060208301819052928201839052909182019081526020016000815260006020820181905260409091015290565b6040805160e081018252838152600084815260026020908152929020805491928301916128b890614b55565b80601f01602080910402602001604051908101604052809291908181526020018280546128e490614b55565b80156129315780601f1061290657610100808354040283529160200191612931565b820191906000526020600020905b81548152906001019060200180831161291457829003601f168201915b5050505050815260200160026000858152602001908152602001600020600101805461295c90614b55565b80601f016020809104026020016040519081016040528092919081815260200182805461298890614b55565b80156129d55780601f106129aa576101008083540402835291602001916129d5565b820191906000526020600020905b8154815290600101906020018083116129b857829003601f168201915b50505091835250506000848152600260208181526040909220015491019060ff166003811115612a0757612a0761487a565b815260008481526002602081815260409092200154910190610100900460ff166001811115612a3857612a3861487a565b81526000848152600260208181526040928390209091015462010000900473ffffffffffffffffffffffffffffffffffffffff169083015201612a7c600585612d69565b1515905292915050565b612a8e612d84565b600e805460009164010000000090910463ffffffff16906004612ab083614ba8565b82546101009290920a63ffffffff81810219909316918316021790915581166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001684179055815160a08101835292835260019083015286151590820152841515606082015260ff84166080820152909150612b469089908990899089906130f4565b5050505050505050565b60606000612b5e6003613917565b90506000815167ffffffffffffffff811115612b7c57612b7c61422c565b604051908082528060200260200182016040528015612bee57816020015b612bdb6040805160e0810182526000808252606060208301819052928201839052909182019081526020016000815260006020820181905260409091015290565b815260200190600190039081612b9a5790505b50905060005b82518110156109ca57612c1f838281518110612c1257612c12614aa2565b602002602001015161284b565b828281518110612c3157612c31614aa2565b6020908102919091010152600101612bf4565b60606000612c526009613917565b90506000815167ffffffffffffffff811115612c7057612c7061422c565b604051908082528060200260200182016040528015612cff57816020015b60408051610100810182526000808252602080830182905292820181905260608083018290526080830182905260a083019190915260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612c8e5790505b50905060005b82518110156109ca57612d30838281518110612d2357612d23614aa2565b6020026020010151611a7c565b828281518110612d4257612d42614aa2565b6020908102919091010152600101612d05565b612d5d612d84565b612d6681613b0c565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610611565b565b6000610626825490565b6000612d7d8383613c01565b6000612d7d8383613c2b565b6040805160e0810182526000808252602080830182905282840182905260608084018390526080840183905260a0840181905260c084015263ffffffff8581168352600d8252848320805464010000000090049091168084526001909101825284832060028101805487518186028101860190985280885295969295919493909190830182828015612eda57602002820191906000526020600020905b815481526020019060010190808311612ec6575b505050505090506000815167ffffffffffffffff811115612efd57612efd61422c565b604051908082528060200260200182016040528015612f4357816020015b604080518082019091526000815260606020820152815260200190600190039081612f1b5790505b50905060005b815181101561305b576040518060400160405280848381518110612f6f57612f6f614aa2565b60200260200101518152602001856003016000868581518110612f9457612f94614aa2565b602002602001015181526020019081526020016000208054612fb590614b55565b80601f0160208091040260200160405190810160405280929190818152602001828054612fe190614b55565b801561302e5780601f106130035761010080835404028352916020019161302e565b820191906000526020600020905b81548152906001019060200180831161301157829003601f168201915b505050505081525082828151811061304857613048614aa2565b6020908102919091010152600101612f49565b506040805160e08101825263ffffffff8089166000818152600d6020818152868320548086168752948b168187015260ff680100000000000000008604811697870197909752690100000000000000000085048716151560608701529290915290526a010000000000000000000090049091161515608082015260a081016130e285613917565b81526020019190915295945050505050565b805163ffffffff9081166000908152600d602090815260408083208286015190941683526001909301905220608082015160ff161580613146575060808201518590613141906001615103565b60ff16115b1561318f5760808201516040517f25b4d61800000000000000000000000000000000000000000000000000000000815260ff909116600482015260248101869052604401610611565b6001826020015163ffffffff16111561327757815163ffffffff166000908152600d6020908152604082209084015160019182019183916131d09190614b00565b63ffffffff1663ffffffff168152602001908152602001600020905060005b6131f882612e07565b81101561327457613227846000015163ffffffff16600c60006107778587600001612e1190919063ffffffff16565b50600c60006132368484612e11565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff1690556001016131ef565b50505b60005b858110156134b1576132a787878381811061329757613297614aa2565b859260209091020135905061390b565b6133085782518787838181106132bf576132bf614aa2565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610611565b82606001511561345f57825163ffffffff16600c600089898581811061333057613330614aa2565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff16148015906133aa5750600c600088888481811061337b5761337b614aa2565b602090810292909201358352508101919091526040016000205468010000000000000000900463ffffffff1615155b1561340c5782518787838181106133c3576133c3614aa2565b6040517f60b9df7300000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610611565b8251600c600089898581811061342457613424614aa2565b90506020020135815260200190815260200160002060000160086101000a81548163ffffffff021916908363ffffffff1602179055506134a9565b82516134a79063ffffffff16600c60008a8a8681811061348157613481614aa2565b90506020020135815260200190815260200160002060050161390b90919063ffffffff16565b505b60010161327a565b5060005b838110156138bf57368585838181106134d0576134d0614aa2565b90506020028101906134e29190614d2a565b90506134f060038235612d69565b613529576040517fe181733f00000000000000000000000000000000000000000000000000000000815281356004820152602401610611565b61353560058235612d69565b1561356f576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815281356004820152602401610611565b803560009081526003840160205260408120805461358c90614b55565b905011156135d85783516040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015281356024820152604401610611565b60005b878110156136e25761367f8235600c60008c8c868181106135fe576135fe614aa2565b9050602002013581526020019081526020016000206004016000600c60008e8e8881811061362e5761362e614aa2565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001908152602001600020612d6990919063ffffffff16565b6136da5788888281811061369557613695614aa2565b6040517fa7e792500000000000000000000000000000000000000000000000000000000081526020909102929092013560048301525082356024820152604401610611565b6001016135db565b506002830180546001810182556000918252602091829020833591015561370b9082018261511c565b82356000908152600386016020526040902091613729919083615181565b50604080850151855163ffffffff9081166000908152600d602090815284822080549415156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff90951694909417909355606088015188518316825284822080549115156a0100000000000000000000027fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff9092169190911790556080880151885183168252848220805460ff9290921668010000000000000000027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff909216919091179055828801805189518416835294909120805494909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909416939093179055855191516138b692918435908c908c9061387c9088018861511c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d1e92505050565b506001016134b5565b50815160208084015160405163ffffffff91821681529216917ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a2505050505050565b6000612d7d8383613dff565b60606000612d7d83613e4e565b608081015173ffffffffffffffffffffffffffffffffffffffff16156139c65761397281608001517f78bea72100000000000000000000000000000000000000000000000000000000613eaa565b6139c65760808101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610611565b6000828152600260205260409020815182919081906139e59082614e18565b50602082015160018201906139fa9082614e18565b5060408201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115613a3c57613a3c61487a565b021790555060608201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100836001811115613a8357613a8361487a565b0217905550608091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b3373ffffffffffffffffffffffffffffffffffffffff821603613b8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610611565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000826000018281548110613c1857613c18614aa2565b9060005260206000200154905092915050565b60008181526001830160205260408120548015613d14576000613c4f60018361529c565b8554909150600090613c639060019061529c565b9050818114613cc8576000866000018281548110613c8357613c83614aa2565b9060005260206000200154905080876000018481548110613ca657613ca6614aa2565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613cd957613cd96152af565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610626565b6000915050610626565b6000848152600260208190526040909120015462010000900473ffffffffffffffffffffffffffffffffffffffff161561284357600084815260026020819052604091829020015490517ffba64a7c0000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c90613dc5908690869086908b908d906004016152de565b600060405180830381600087803b158015613ddf57600080fd5b505af1158015613df3573d6000803e3d6000fd5b50505050505050505050565b6000818152600183016020526040812054613e4657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610626565b506000610626565b606081600001805480602002602001604051908101604052809291908181526020018280548015613e9e57602002820191906000526020600020905b815481526020019060010190808311613e8a575b50505050509050919050565b6000613eb583613ec6565b8015612d7d5750612d7d8383613f2a565b6000613ef2827f01ffc9a700000000000000000000000000000000000000000000000000000000613f2a565b80156106265750613f23827fffffffff00000000000000000000000000000000000000000000000000000000613f2a565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613fe2575060208210155b8015613fee5750600081115b979650505050505050565b50805461400590614b55565b6000825580601f10614015575050565b601f016020900490600052602060002090810190612d66919061404d565b5080546000825590600052602060002090810190612d6691905b5b80821115614062576000815560010161404e565b5090565b60008083601f84011261407857600080fd5b50813567ffffffffffffffff81111561409057600080fd5b6020830191508360208260051b8501011115611a7557600080fd5b600080602083850312156140be57600080fd5b823567ffffffffffffffff8111156140d557600080fd5b6140e185828601614066565b90969095509350505050565b60008151808452602080850194506020840160005b8381101561411e57815187529582019590820190600101614102565b509495945050505050565b600061010063ffffffff80845116855280602085015116602086015280604085015116604086015250606083015160608501526080830151608085015260a083015160a085015260c08301518160c0860152614187828601826140ed565b91505060e083015184820360e08601526141a182826140ed565b95945050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561421f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261420d858351614129565b945092850192908501906001016141d3565b5092979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561427e5761427e61422c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156142cb576142cb61422c565b604052919050565b600067ffffffffffffffff8211156142ed576142ed61422c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261432a57600080fd5b813561433d614338826142d3565b614284565b81815284602083860101111561435257600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561438257600080fd5b823567ffffffffffffffff8082111561439a57600080fd5b6143a686838701614319565b935060208501359150808211156143bc57600080fd5b506143c985828601614319565b9150509250929050565b6000602082840312156143e557600080fd5b5035919050565b60005b838110156144075781810151838201526020016143ef565b50506000910152565b600081518084526144288160208601602086016143ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d7d6020830184614410565b600082825180855260208086019550808260051b84010181860160005b848110156144ea578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051845284015160408585018190526144d681860183614410565b9a86019a945050509083019060010161448a565b5090979650505050505050565b600063ffffffff8083511684528060208401511660208501525060ff604083015116604084015260608201511515606084015260808201511515608084015260a082015160e060a085015261454f60e08501826140ed565b905060c083015184820360c08601526141a1828261446d565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561421f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526145cb8583516144f7565b94509285019290850190600101614591565b803563ffffffff811681146145f157600080fd5b919050565b60006020828403121561460857600080fd5b612d7d826145dd565b73ffffffffffffffffffffffffffffffffffffffff815116825260006020820151604060208501526146466040850182614410565b949350505050565b602081526000612d7d6020830184614611565b602081526000612d7d60208301846144f7565b803580151581146145f157600080fd5b803560ff811681146145f157600080fd5b600080600080600080600060a0888a0312156146b057600080fd5b6146b9886145dd565b9650602088013567ffffffffffffffff808211156146d657600080fd5b6146e28b838c01614066565b909850965060408a01359150808211156146fb57600080fd5b506147088a828b01614066565b909550935061471b905060608901614674565b915061472960808901614684565b905092959891949750929550565b6000806040838503121561474a57600080fd5b614753836145dd565b946020939093013593505050565b6040815260006147746040830185614410565b82810360208401526141a18185614410565b602081526000612d7d6020830184614129565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561421f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526147fc858351614611565b945092850192908501906001016147c2565b6000806000806040858703121561482457600080fd5b843567ffffffffffffffff8082111561483c57600080fd5b61484888838901614066565b9096509450602087013591508082111561486157600080fd5b5061486e87828801614066565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b805182526000602082015160e060208501526148c860e0850182614410565b9050604083015184820360408601526148e18282614410565b9150506060830151600481106148f9576148f961487a565b60608501526080830151600281106149135761491361487a565b8060808601525060a083015161494160a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060c083015161062260c086018215159052565b602081526000612d7d60208301846148a9565b600080600080600080600060a0888a03121561498357600080fd5b873567ffffffffffffffff8082111561499b57600080fd5b6149a78b838c01614066565b909950975060208a01359150808211156149c057600080fd5b506149cd8a828b01614066565b90965094506149e0905060408901614674565b925061471b60608901614674565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561421f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614a518583516148a9565b94509285019290850190600101614a17565b803573ffffffffffffffffffffffffffffffffffffffff811681146145f157600080fd5b600060208284031215614a9957600080fd5b612d7d82614a63565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff8281168282160390808211156109ca576109ca614ad1565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b4e57614b4e614ad1565b5060010190565b600181811c90821680614b6957607f821691505b602082108103614ba2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600063ffffffff808316818103614bc157614bc1614ad1565b6001019392505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112614bff57600080fd5b9190910192915050565b600060a08236031215614c1b57600080fd5b614c2361425b565b614c2c836145dd565b8152602080840135818301526040840135604083015260608401356060830152608084013567ffffffffffffffff80821115614c6757600080fd5b9085019036601f830112614c7a57600080fd5b813581811115614c8c57614c8c61422c565b8060051b9150614c9d848301614284565b8181529183018401918481019036841115614cb757600080fd5b938501935b83851015614cd557843582529385019390850190614cbc565b608087015250939695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614d1e57835183529284019291840191600101614d02565b50909695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112614bff57600080fd5b600060408236031215614d7057600080fd5b6040516040810167ffffffffffffffff8282108183111715614d9457614d9461422c565b81604052614da185614a63565b83526020850135915080821115614db757600080fd5b50614dc436828601614319565b60208301525092915050565b601f82111561086f576000816000526020600020601f850160051c81016020861015614df95750805b601f850160051c820191505b8181101561284357828155600101614e05565b815167ffffffffffffffff811115614e3257614e3261422c565b614e4681614e408454614b55565b84614dd0565b602080601f831160018114614e995760008415614e635750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612843565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614ee657888601518255948401946001909101908401614ec7565b5085821015614f2257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215614f4457600080fd5b815167ffffffffffffffff811115614f5b57600080fd5b8201601f81018413614f6c57600080fd5b8051614f7a614338826142d3565b818152856020838501011115614f8f57600080fd5b6141a18260208301602086016143ec565b8035600281106145f157600080fd5b600060a08236031215614fc157600080fd5b614fc961425b565b823567ffffffffffffffff80821115614fe157600080fd5b614fed36838701614319565b8352602085013591508082111561500357600080fd5b5061501036828601614319565b60208301525060408301356004811061502857600080fd5b604082015261503960608401614fa0565b606082015261504a60808401614a63565b608082015292915050565b600060208083526000845461506981614b55565b806020870152604060018084166000811461508b57600181146150c5576150f5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00851660408a0152604084151560051b8a010195506150f5565b89600052602060002060005b858110156150ec5781548b82018601529083019088016150d1565b8a016040019650505b509398975050505050505050565b60ff818116838216019081111561062657610626614ad1565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261515157600080fd5b83018035915067ffffffffffffffff82111561516c57600080fd5b602001915036819003821315611a7557600080fd5b67ffffffffffffffff8311156151995761519961422c565b6151ad836151a78354614b55565b83614dd0565b6000601f8411600181146151ff57600085156151c95750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355615295565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561524e578685013582556020948501946001909201910161522e565b5086821015615289577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8181038181111561062657610626614ad1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561531757600080fd5b8560051b808860a0850137820182810360a0908101602085015261533d90820187614410565b91505063ffffffff8085166040840152808416606084015250969550505050505056fea164736f6c6343000818000a",
+}
+
+var CapabilitiesRegistryABI = CapabilitiesRegistryMetaData.ABI
+
+var CapabilitiesRegistryBin = CapabilitiesRegistryMetaData.Bin
+
+func DeployCapabilitiesRegistry(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *CapabilitiesRegistry, error) {
+ parsed, err := CapabilitiesRegistryMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CapabilitiesRegistryBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &CapabilitiesRegistry{address: address, abi: *parsed, CapabilitiesRegistryCaller: CapabilitiesRegistryCaller{contract: contract}, CapabilitiesRegistryTransactor: CapabilitiesRegistryTransactor{contract: contract}, CapabilitiesRegistryFilterer: CapabilitiesRegistryFilterer{contract: contract}}, nil
+}
+
+type CapabilitiesRegistry struct {
+ address common.Address
+ abi abi.ABI
+ CapabilitiesRegistryCaller
+ CapabilitiesRegistryTransactor
+ CapabilitiesRegistryFilterer
+}
+
+type CapabilitiesRegistryCaller struct {
+ contract *bind.BoundContract
+}
+
+type CapabilitiesRegistryTransactor struct {
+ contract *bind.BoundContract
+}
+
+type CapabilitiesRegistryFilterer struct {
+ contract *bind.BoundContract
+}
+
+type CapabilitiesRegistrySession struct {
+ Contract *CapabilitiesRegistry
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type CapabilitiesRegistryCallerSession struct {
+ Contract *CapabilitiesRegistryCaller
+ CallOpts bind.CallOpts
+}
+
+type CapabilitiesRegistryTransactorSession struct {
+ Contract *CapabilitiesRegistryTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type CapabilitiesRegistryRaw struct {
+ Contract *CapabilitiesRegistry
+}
+
+type CapabilitiesRegistryCallerRaw struct {
+ Contract *CapabilitiesRegistryCaller
+}
+
+type CapabilitiesRegistryTransactorRaw struct {
+ Contract *CapabilitiesRegistryTransactor
+}
+
+func NewCapabilitiesRegistry(address common.Address, backend bind.ContractBackend) (*CapabilitiesRegistry, error) {
+ abi, err := abi.JSON(strings.NewReader(CapabilitiesRegistryABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindCapabilitiesRegistry(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistry{address: address, abi: abi, CapabilitiesRegistryCaller: CapabilitiesRegistryCaller{contract: contract}, CapabilitiesRegistryTransactor: CapabilitiesRegistryTransactor{contract: contract}, CapabilitiesRegistryFilterer: CapabilitiesRegistryFilterer{contract: contract}}, nil
+}
+
+func NewCapabilitiesRegistryCaller(address common.Address, caller bind.ContractCaller) (*CapabilitiesRegistryCaller, error) {
+ contract, err := bindCapabilitiesRegistry(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryCaller{contract: contract}, nil
+}
+
+func NewCapabilitiesRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*CapabilitiesRegistryTransactor, error) {
+ contract, err := bindCapabilitiesRegistry(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryTransactor{contract: contract}, nil
+}
+
+func NewCapabilitiesRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*CapabilitiesRegistryFilterer, error) {
+ contract, err := bindCapabilitiesRegistry(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryFilterer{contract: contract}, nil
+}
+
+func bindCapabilitiesRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := CapabilitiesRegistryMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _CapabilitiesRegistry.Contract.CapabilitiesRegistryCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.CapabilitiesRegistryTransactor.contract.Transfer(opts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.CapabilitiesRegistryTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _CapabilitiesRegistry.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.contract.Transfer(opts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetCapabilities(opts *bind.CallOpts) ([]CapabilitiesRegistryCapabilityInfo, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getCapabilities")
+
+ if err != nil {
+ return *new([]CapabilitiesRegistryCapabilityInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]CapabilitiesRegistryCapabilityInfo)).(*[]CapabilitiesRegistryCapabilityInfo)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetCapabilities() ([]CapabilitiesRegistryCapabilityInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetCapabilities(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetCapabilities() ([]CapabilitiesRegistryCapabilityInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetCapabilities(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetCapability(opts *bind.CallOpts, hashedId [32]byte) (CapabilitiesRegistryCapabilityInfo, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getCapability", hashedId)
+
+ if err != nil {
+ return *new(CapabilitiesRegistryCapabilityInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(CapabilitiesRegistryCapabilityInfo)).(*CapabilitiesRegistryCapabilityInfo)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetCapability(hashedId [32]byte) (CapabilitiesRegistryCapabilityInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetCapability(&_CapabilitiesRegistry.CallOpts, hashedId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetCapability(hashedId [32]byte) (CapabilitiesRegistryCapabilityInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetCapability(&_CapabilitiesRegistry.CallOpts, hashedId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetCapabilityConfigs(opts *bind.CallOpts, donId uint32, capabilityId [32]byte) ([]byte, []byte, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getCapabilityConfigs", donId, capabilityId)
+
+ if err != nil {
+ return *new([]byte), *new([]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+ out1 := *abi.ConvertType(out[1], new([]byte)).(*[]byte)
+
+ return out0, out1, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetCapabilityConfigs(donId uint32, capabilityId [32]byte) ([]byte, []byte, error) {
+ return _CapabilitiesRegistry.Contract.GetCapabilityConfigs(&_CapabilitiesRegistry.CallOpts, donId, capabilityId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetCapabilityConfigs(donId uint32, capabilityId [32]byte) ([]byte, []byte, error) {
+ return _CapabilitiesRegistry.Contract.GetCapabilityConfigs(&_CapabilitiesRegistry.CallOpts, donId, capabilityId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetDON(opts *bind.CallOpts, donId uint32) (CapabilitiesRegistryDONInfo, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getDON", donId)
+
+ if err != nil {
+ return *new(CapabilitiesRegistryDONInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(CapabilitiesRegistryDONInfo)).(*CapabilitiesRegistryDONInfo)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetDON(donId uint32) (CapabilitiesRegistryDONInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetDON(&_CapabilitiesRegistry.CallOpts, donId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetDON(donId uint32) (CapabilitiesRegistryDONInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetDON(&_CapabilitiesRegistry.CallOpts, donId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetDONs(opts *bind.CallOpts) ([]CapabilitiesRegistryDONInfo, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getDONs")
+
+ if err != nil {
+ return *new([]CapabilitiesRegistryDONInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]CapabilitiesRegistryDONInfo)).(*[]CapabilitiesRegistryDONInfo)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetDONs() ([]CapabilitiesRegistryDONInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetDONs(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetDONs() ([]CapabilitiesRegistryDONInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetDONs(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetHashedCapabilityId(opts *bind.CallOpts, labelledName string, version string) ([32]byte, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getHashedCapabilityId", labelledName, version)
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetHashedCapabilityId(labelledName string, version string) ([32]byte, error) {
+ return _CapabilitiesRegistry.Contract.GetHashedCapabilityId(&_CapabilitiesRegistry.CallOpts, labelledName, version)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetHashedCapabilityId(labelledName string, version string) ([32]byte, error) {
+ return _CapabilitiesRegistry.Contract.GetHashedCapabilityId(&_CapabilitiesRegistry.CallOpts, labelledName, version)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetNextDONId(opts *bind.CallOpts) (uint32, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getNextDONId")
+
+ if err != nil {
+ return *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetNextDONId() (uint32, error) {
+ return _CapabilitiesRegistry.Contract.GetNextDONId(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetNextDONId() (uint32, error) {
+ return _CapabilitiesRegistry.Contract.GetNextDONId(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetNode(opts *bind.CallOpts, p2pId [32]byte) (INodeInfoProviderNodeInfo, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getNode", p2pId)
+
+ if err != nil {
+ return *new(INodeInfoProviderNodeInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(INodeInfoProviderNodeInfo)).(*INodeInfoProviderNodeInfo)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetNode(p2pId [32]byte) (INodeInfoProviderNodeInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetNode(&_CapabilitiesRegistry.CallOpts, p2pId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetNode(p2pId [32]byte) (INodeInfoProviderNodeInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetNode(&_CapabilitiesRegistry.CallOpts, p2pId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetNodeOperator(opts *bind.CallOpts, nodeOperatorId uint32) (CapabilitiesRegistryNodeOperator, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getNodeOperator", nodeOperatorId)
+
+ if err != nil {
+ return *new(CapabilitiesRegistryNodeOperator), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(CapabilitiesRegistryNodeOperator)).(*CapabilitiesRegistryNodeOperator)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetNodeOperator(nodeOperatorId uint32) (CapabilitiesRegistryNodeOperator, error) {
+ return _CapabilitiesRegistry.Contract.GetNodeOperator(&_CapabilitiesRegistry.CallOpts, nodeOperatorId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetNodeOperator(nodeOperatorId uint32) (CapabilitiesRegistryNodeOperator, error) {
+ return _CapabilitiesRegistry.Contract.GetNodeOperator(&_CapabilitiesRegistry.CallOpts, nodeOperatorId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetNodeOperators(opts *bind.CallOpts) ([]CapabilitiesRegistryNodeOperator, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getNodeOperators")
+
+ if err != nil {
+ return *new([]CapabilitiesRegistryNodeOperator), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]CapabilitiesRegistryNodeOperator)).(*[]CapabilitiesRegistryNodeOperator)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetNodeOperators() ([]CapabilitiesRegistryNodeOperator, error) {
+ return _CapabilitiesRegistry.Contract.GetNodeOperators(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetNodeOperators() ([]CapabilitiesRegistryNodeOperator, error) {
+ return _CapabilitiesRegistry.Contract.GetNodeOperators(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetNodes(opts *bind.CallOpts) ([]INodeInfoProviderNodeInfo, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getNodes")
+
+ if err != nil {
+ return *new([]INodeInfoProviderNodeInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]INodeInfoProviderNodeInfo)).(*[]INodeInfoProviderNodeInfo)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetNodes() ([]INodeInfoProviderNodeInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetNodes(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetNodes() ([]INodeInfoProviderNodeInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetNodes(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) GetNodesByP2PIds(opts *bind.CallOpts, p2pIds [][32]byte) ([]INodeInfoProviderNodeInfo, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "getNodesByP2PIds", p2pIds)
+
+ if err != nil {
+ return *new([]INodeInfoProviderNodeInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([]INodeInfoProviderNodeInfo)).(*[]INodeInfoProviderNodeInfo)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) GetNodesByP2PIds(p2pIds [][32]byte) ([]INodeInfoProviderNodeInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetNodesByP2PIds(&_CapabilitiesRegistry.CallOpts, p2pIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) GetNodesByP2PIds(p2pIds [][32]byte) ([]INodeInfoProviderNodeInfo, error) {
+ return _CapabilitiesRegistry.Contract.GetNodesByP2PIds(&_CapabilitiesRegistry.CallOpts, p2pIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) IsCapabilityDeprecated(opts *bind.CallOpts, hashedCapabilityId [32]byte) (bool, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "isCapabilityDeprecated", hashedCapabilityId)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) IsCapabilityDeprecated(hashedCapabilityId [32]byte) (bool, error) {
+ return _CapabilitiesRegistry.Contract.IsCapabilityDeprecated(&_CapabilitiesRegistry.CallOpts, hashedCapabilityId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) IsCapabilityDeprecated(hashedCapabilityId [32]byte) (bool, error) {
+ return _CapabilitiesRegistry.Contract.IsCapabilityDeprecated(&_CapabilitiesRegistry.CallOpts, hashedCapabilityId)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "owner")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) Owner() (common.Address, error) {
+ return _CapabilitiesRegistry.Contract.Owner(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) Owner() (common.Address, error) {
+ return _CapabilitiesRegistry.Contract.Owner(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _CapabilitiesRegistry.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) TypeAndVersion() (string, error) {
+ return _CapabilitiesRegistry.Contract.TypeAndVersion(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryCallerSession) TypeAndVersion() (string, error) {
+ return _CapabilitiesRegistry.Contract.TypeAndVersion(&_CapabilitiesRegistry.CallOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) AcceptOwnership() (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AcceptOwnership(&_CapabilitiesRegistry.TransactOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AcceptOwnership(&_CapabilitiesRegistry.TransactOpts)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) AddCapabilities(opts *bind.TransactOpts, capabilities []CapabilitiesRegistryCapability) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "addCapabilities", capabilities)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) AddCapabilities(capabilities []CapabilitiesRegistryCapability) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AddCapabilities(&_CapabilitiesRegistry.TransactOpts, capabilities)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) AddCapabilities(capabilities []CapabilitiesRegistryCapability) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AddCapabilities(&_CapabilitiesRegistry.TransactOpts, capabilities)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) AddDON(opts *bind.TransactOpts, nodes [][32]byte, capabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration, isPublic bool, acceptsWorkflows bool, f uint8) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "addDON", nodes, capabilityConfigurations, isPublic, acceptsWorkflows, f)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) AddDON(nodes [][32]byte, capabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration, isPublic bool, acceptsWorkflows bool, f uint8) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AddDON(&_CapabilitiesRegistry.TransactOpts, nodes, capabilityConfigurations, isPublic, acceptsWorkflows, f)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) AddDON(nodes [][32]byte, capabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration, isPublic bool, acceptsWorkflows bool, f uint8) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AddDON(&_CapabilitiesRegistry.TransactOpts, nodes, capabilityConfigurations, isPublic, acceptsWorkflows, f)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) AddNodeOperators(opts *bind.TransactOpts, nodeOperators []CapabilitiesRegistryNodeOperator) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "addNodeOperators", nodeOperators)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) AddNodeOperators(nodeOperators []CapabilitiesRegistryNodeOperator) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AddNodeOperators(&_CapabilitiesRegistry.TransactOpts, nodeOperators)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) AddNodeOperators(nodeOperators []CapabilitiesRegistryNodeOperator) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AddNodeOperators(&_CapabilitiesRegistry.TransactOpts, nodeOperators)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) AddNodes(opts *bind.TransactOpts, nodes []CapabilitiesRegistryNodeParams) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "addNodes", nodes)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) AddNodes(nodes []CapabilitiesRegistryNodeParams) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AddNodes(&_CapabilitiesRegistry.TransactOpts, nodes)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) AddNodes(nodes []CapabilitiesRegistryNodeParams) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.AddNodes(&_CapabilitiesRegistry.TransactOpts, nodes)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) DeprecateCapabilities(opts *bind.TransactOpts, hashedCapabilityIds [][32]byte) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "deprecateCapabilities", hashedCapabilityIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) DeprecateCapabilities(hashedCapabilityIds [][32]byte) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.DeprecateCapabilities(&_CapabilitiesRegistry.TransactOpts, hashedCapabilityIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) DeprecateCapabilities(hashedCapabilityIds [][32]byte) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.DeprecateCapabilities(&_CapabilitiesRegistry.TransactOpts, hashedCapabilityIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) RemoveDONs(opts *bind.TransactOpts, donIds []uint32) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "removeDONs", donIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) RemoveDONs(donIds []uint32) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.RemoveDONs(&_CapabilitiesRegistry.TransactOpts, donIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) RemoveDONs(donIds []uint32) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.RemoveDONs(&_CapabilitiesRegistry.TransactOpts, donIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) RemoveNodeOperators(opts *bind.TransactOpts, nodeOperatorIds []uint32) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "removeNodeOperators", nodeOperatorIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) RemoveNodeOperators(nodeOperatorIds []uint32) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.RemoveNodeOperators(&_CapabilitiesRegistry.TransactOpts, nodeOperatorIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) RemoveNodeOperators(nodeOperatorIds []uint32) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.RemoveNodeOperators(&_CapabilitiesRegistry.TransactOpts, nodeOperatorIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) RemoveNodes(opts *bind.TransactOpts, removedNodeP2PIds [][32]byte) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "removeNodes", removedNodeP2PIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) RemoveNodes(removedNodeP2PIds [][32]byte) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.RemoveNodes(&_CapabilitiesRegistry.TransactOpts, removedNodeP2PIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) RemoveNodes(removedNodeP2PIds [][32]byte) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.RemoveNodes(&_CapabilitiesRegistry.TransactOpts, removedNodeP2PIds)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.TransferOwnership(&_CapabilitiesRegistry.TransactOpts, to)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.TransferOwnership(&_CapabilitiesRegistry.TransactOpts, to)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) UpdateDON(opts *bind.TransactOpts, donId uint32, nodes [][32]byte, capabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration, isPublic bool, f uint8) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "updateDON", donId, nodes, capabilityConfigurations, isPublic, f)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) UpdateDON(donId uint32, nodes [][32]byte, capabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration, isPublic bool, f uint8) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.UpdateDON(&_CapabilitiesRegistry.TransactOpts, donId, nodes, capabilityConfigurations, isPublic, f)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) UpdateDON(donId uint32, nodes [][32]byte, capabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration, isPublic bool, f uint8) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.UpdateDON(&_CapabilitiesRegistry.TransactOpts, donId, nodes, capabilityConfigurations, isPublic, f)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) UpdateNodeOperators(opts *bind.TransactOpts, nodeOperatorIds []uint32, nodeOperators []CapabilitiesRegistryNodeOperator) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "updateNodeOperators", nodeOperatorIds, nodeOperators)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) UpdateNodeOperators(nodeOperatorIds []uint32, nodeOperators []CapabilitiesRegistryNodeOperator) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.UpdateNodeOperators(&_CapabilitiesRegistry.TransactOpts, nodeOperatorIds, nodeOperators)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) UpdateNodeOperators(nodeOperatorIds []uint32, nodeOperators []CapabilitiesRegistryNodeOperator) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.UpdateNodeOperators(&_CapabilitiesRegistry.TransactOpts, nodeOperatorIds, nodeOperators)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactor) UpdateNodes(opts *bind.TransactOpts, nodes []CapabilitiesRegistryNodeParams) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.contract.Transact(opts, "updateNodes", nodes)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistrySession) UpdateNodes(nodes []CapabilitiesRegistryNodeParams) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.UpdateNodes(&_CapabilitiesRegistry.TransactOpts, nodes)
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryTransactorSession) UpdateNodes(nodes []CapabilitiesRegistryNodeParams) (*types.Transaction, error) {
+ return _CapabilitiesRegistry.Contract.UpdateNodes(&_CapabilitiesRegistry.TransactOpts, nodes)
+}
+
+type CapabilitiesRegistryCapabilityConfiguredIterator struct {
+ Event *CapabilitiesRegistryCapabilityConfigured
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryCapabilityConfiguredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryCapabilityConfigured)
+ 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(CapabilitiesRegistryCapabilityConfigured)
+ 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 *CapabilitiesRegistryCapabilityConfiguredIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryCapabilityConfiguredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryCapabilityConfigured struct {
+ HashedCapabilityId [32]byte
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterCapabilityConfigured(opts *bind.FilterOpts, hashedCapabilityId [][32]byte) (*CapabilitiesRegistryCapabilityConfiguredIterator, error) {
+
+ var hashedCapabilityIdRule []interface{}
+ for _, hashedCapabilityIdItem := range hashedCapabilityId {
+ hashedCapabilityIdRule = append(hashedCapabilityIdRule, hashedCapabilityIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "CapabilityConfigured", hashedCapabilityIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryCapabilityConfiguredIterator{contract: _CapabilitiesRegistry.contract, event: "CapabilityConfigured", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchCapabilityConfigured(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryCapabilityConfigured, hashedCapabilityId [][32]byte) (event.Subscription, error) {
+
+ var hashedCapabilityIdRule []interface{}
+ for _, hashedCapabilityIdItem := range hashedCapabilityId {
+ hashedCapabilityIdRule = append(hashedCapabilityIdRule, hashedCapabilityIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "CapabilityConfigured", hashedCapabilityIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryCapabilityConfigured)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "CapabilityConfigured", 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 (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseCapabilityConfigured(log types.Log) (*CapabilitiesRegistryCapabilityConfigured, error) {
+ event := new(CapabilitiesRegistryCapabilityConfigured)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "CapabilityConfigured", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryCapabilityDeprecatedIterator struct {
+ Event *CapabilitiesRegistryCapabilityDeprecated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryCapabilityDeprecatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryCapabilityDeprecated)
+ 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(CapabilitiesRegistryCapabilityDeprecated)
+ 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 *CapabilitiesRegistryCapabilityDeprecatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryCapabilityDeprecatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryCapabilityDeprecated struct {
+ HashedCapabilityId [32]byte
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterCapabilityDeprecated(opts *bind.FilterOpts, hashedCapabilityId [][32]byte) (*CapabilitiesRegistryCapabilityDeprecatedIterator, error) {
+
+ var hashedCapabilityIdRule []interface{}
+ for _, hashedCapabilityIdItem := range hashedCapabilityId {
+ hashedCapabilityIdRule = append(hashedCapabilityIdRule, hashedCapabilityIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "CapabilityDeprecated", hashedCapabilityIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryCapabilityDeprecatedIterator{contract: _CapabilitiesRegistry.contract, event: "CapabilityDeprecated", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchCapabilityDeprecated(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryCapabilityDeprecated, hashedCapabilityId [][32]byte) (event.Subscription, error) {
+
+ var hashedCapabilityIdRule []interface{}
+ for _, hashedCapabilityIdItem := range hashedCapabilityId {
+ hashedCapabilityIdRule = append(hashedCapabilityIdRule, hashedCapabilityIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "CapabilityDeprecated", hashedCapabilityIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryCapabilityDeprecated)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "CapabilityDeprecated", 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 (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseCapabilityDeprecated(log types.Log) (*CapabilitiesRegistryCapabilityDeprecated, error) {
+ event := new(CapabilitiesRegistryCapabilityDeprecated)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "CapabilityDeprecated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryConfigSetIterator struct {
+ Event *CapabilitiesRegistryConfigSet
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryConfigSetIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryConfigSet)
+ 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(CapabilitiesRegistryConfigSet)
+ 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 *CapabilitiesRegistryConfigSetIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryConfigSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryConfigSet struct {
+ DonId uint32
+ ConfigCount uint32
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterConfigSet(opts *bind.FilterOpts, donId []uint32) (*CapabilitiesRegistryConfigSetIterator, error) {
+
+ var donIdRule []interface{}
+ for _, donIdItem := range donId {
+ donIdRule = append(donIdRule, donIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "ConfigSet", donIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryConfigSetIterator{contract: _CapabilitiesRegistry.contract, event: "ConfigSet", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryConfigSet, donId []uint32) (event.Subscription, error) {
+
+ var donIdRule []interface{}
+ for _, donIdItem := range donId {
+ donIdRule = append(donIdRule, donIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "ConfigSet", donIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryConfigSet)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "ConfigSet", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseConfigSet(log types.Log) (*CapabilitiesRegistryConfigSet, error) {
+ event := new(CapabilitiesRegistryConfigSet)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "ConfigSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryNodeAddedIterator struct {
+ Event *CapabilitiesRegistryNodeAdded
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryNodeAddedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryNodeAdded)
+ 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(CapabilitiesRegistryNodeAdded)
+ 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 *CapabilitiesRegistryNodeAddedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryNodeAddedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryNodeAdded struct {
+ P2pId [32]byte
+ NodeOperatorId uint32
+ Signer [32]byte
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterNodeAdded(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilitiesRegistryNodeAddedIterator, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "NodeAdded", nodeOperatorIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryNodeAddedIterator{contract: _CapabilitiesRegistry.contract, event: "NodeAdded", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeAdded, nodeOperatorId []uint32) (event.Subscription, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "NodeAdded", nodeOperatorIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryNodeAdded)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeAdded", 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 (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseNodeAdded(log types.Log) (*CapabilitiesRegistryNodeAdded, error) {
+ event := new(CapabilitiesRegistryNodeAdded)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeAdded", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryNodeOperatorAddedIterator struct {
+ Event *CapabilitiesRegistryNodeOperatorAdded
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryNodeOperatorAddedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryNodeOperatorAdded)
+ 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(CapabilitiesRegistryNodeOperatorAdded)
+ 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 *CapabilitiesRegistryNodeOperatorAddedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryNodeOperatorAddedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryNodeOperatorAdded struct {
+ NodeOperatorId uint32
+ Admin common.Address
+ Name string
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterNodeOperatorAdded(opts *bind.FilterOpts, nodeOperatorId []uint32, admin []common.Address) (*CapabilitiesRegistryNodeOperatorAddedIterator, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+ var adminRule []interface{}
+ for _, adminItem := range admin {
+ adminRule = append(adminRule, adminItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "NodeOperatorAdded", nodeOperatorIdRule, adminRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryNodeOperatorAddedIterator{contract: _CapabilitiesRegistry.contract, event: "NodeOperatorAdded", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchNodeOperatorAdded(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeOperatorAdded, nodeOperatorId []uint32, admin []common.Address) (event.Subscription, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+ var adminRule []interface{}
+ for _, adminItem := range admin {
+ adminRule = append(adminRule, adminItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "NodeOperatorAdded", nodeOperatorIdRule, adminRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryNodeOperatorAdded)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeOperatorAdded", 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 (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseNodeOperatorAdded(log types.Log) (*CapabilitiesRegistryNodeOperatorAdded, error) {
+ event := new(CapabilitiesRegistryNodeOperatorAdded)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeOperatorAdded", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryNodeOperatorRemovedIterator struct {
+ Event *CapabilitiesRegistryNodeOperatorRemoved
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryNodeOperatorRemovedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryNodeOperatorRemoved)
+ 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(CapabilitiesRegistryNodeOperatorRemoved)
+ 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 *CapabilitiesRegistryNodeOperatorRemovedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryNodeOperatorRemovedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryNodeOperatorRemoved struct {
+ NodeOperatorId uint32
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterNodeOperatorRemoved(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilitiesRegistryNodeOperatorRemovedIterator, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "NodeOperatorRemoved", nodeOperatorIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryNodeOperatorRemovedIterator{contract: _CapabilitiesRegistry.contract, event: "NodeOperatorRemoved", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchNodeOperatorRemoved(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeOperatorRemoved, nodeOperatorId []uint32) (event.Subscription, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "NodeOperatorRemoved", nodeOperatorIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryNodeOperatorRemoved)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeOperatorRemoved", 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 (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseNodeOperatorRemoved(log types.Log) (*CapabilitiesRegistryNodeOperatorRemoved, error) {
+ event := new(CapabilitiesRegistryNodeOperatorRemoved)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeOperatorRemoved", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryNodeOperatorUpdatedIterator struct {
+ Event *CapabilitiesRegistryNodeOperatorUpdated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryNodeOperatorUpdatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryNodeOperatorUpdated)
+ 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(CapabilitiesRegistryNodeOperatorUpdated)
+ 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 *CapabilitiesRegistryNodeOperatorUpdatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryNodeOperatorUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryNodeOperatorUpdated struct {
+ NodeOperatorId uint32
+ Admin common.Address
+ Name string
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterNodeOperatorUpdated(opts *bind.FilterOpts, nodeOperatorId []uint32, admin []common.Address) (*CapabilitiesRegistryNodeOperatorUpdatedIterator, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+ var adminRule []interface{}
+ for _, adminItem := range admin {
+ adminRule = append(adminRule, adminItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "NodeOperatorUpdated", nodeOperatorIdRule, adminRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryNodeOperatorUpdatedIterator{contract: _CapabilitiesRegistry.contract, event: "NodeOperatorUpdated", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchNodeOperatorUpdated(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeOperatorUpdated, nodeOperatorId []uint32, admin []common.Address) (event.Subscription, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+ var adminRule []interface{}
+ for _, adminItem := range admin {
+ adminRule = append(adminRule, adminItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "NodeOperatorUpdated", nodeOperatorIdRule, adminRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryNodeOperatorUpdated)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeOperatorUpdated", 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 (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseNodeOperatorUpdated(log types.Log) (*CapabilitiesRegistryNodeOperatorUpdated, error) {
+ event := new(CapabilitiesRegistryNodeOperatorUpdated)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeOperatorUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryNodeRemovedIterator struct {
+ Event *CapabilitiesRegistryNodeRemoved
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryNodeRemovedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryNodeRemoved)
+ 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(CapabilitiesRegistryNodeRemoved)
+ 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 *CapabilitiesRegistryNodeRemovedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryNodeRemovedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryNodeRemoved struct {
+ P2pId [32]byte
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterNodeRemoved(opts *bind.FilterOpts) (*CapabilitiesRegistryNodeRemovedIterator, error) {
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "NodeRemoved")
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryNodeRemovedIterator{contract: _CapabilitiesRegistry.contract, event: "NodeRemoved", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchNodeRemoved(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeRemoved) (event.Subscription, error) {
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "NodeRemoved")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryNodeRemoved)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeRemoved", 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 (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseNodeRemoved(log types.Log) (*CapabilitiesRegistryNodeRemoved, error) {
+ event := new(CapabilitiesRegistryNodeRemoved)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeRemoved", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryNodeUpdatedIterator struct {
+ Event *CapabilitiesRegistryNodeUpdated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryNodeUpdatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryNodeUpdated)
+ 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(CapabilitiesRegistryNodeUpdated)
+ 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 *CapabilitiesRegistryNodeUpdatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryNodeUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryNodeUpdated struct {
+ P2pId [32]byte
+ NodeOperatorId uint32
+ Signer [32]byte
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterNodeUpdated(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilitiesRegistryNodeUpdatedIterator, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "NodeUpdated", nodeOperatorIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryNodeUpdatedIterator{contract: _CapabilitiesRegistry.contract, event: "NodeUpdated", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchNodeUpdated(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeUpdated, nodeOperatorId []uint32) (event.Subscription, error) {
+
+ var nodeOperatorIdRule []interface{}
+ for _, nodeOperatorIdItem := range nodeOperatorId {
+ nodeOperatorIdRule = append(nodeOperatorIdRule, nodeOperatorIdItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "NodeUpdated", nodeOperatorIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryNodeUpdated)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeUpdated", 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 (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseNodeUpdated(log types.Log) (*CapabilitiesRegistryNodeUpdated, error) {
+ event := new(CapabilitiesRegistryNodeUpdated)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "NodeUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryOwnershipTransferRequestedIterator struct {
+ Event *CapabilitiesRegistryOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryOwnershipTransferRequested)
+ 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(CapabilitiesRegistryOwnershipTransferRequested)
+ 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 *CapabilitiesRegistryOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CapabilitiesRegistryOwnershipTransferRequestedIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryOwnershipTransferRequestedIterator{contract: _CapabilitiesRegistry.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryOwnershipTransferRequested)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseOwnershipTransferRequested(log types.Log) (*CapabilitiesRegistryOwnershipTransferRequested, error) {
+ event := new(CapabilitiesRegistryOwnershipTransferRequested)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type CapabilitiesRegistryOwnershipTransferredIterator struct {
+ Event *CapabilitiesRegistryOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *CapabilitiesRegistryOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(CapabilitiesRegistryOwnershipTransferred)
+ 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(CapabilitiesRegistryOwnershipTransferred)
+ 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 *CapabilitiesRegistryOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *CapabilitiesRegistryOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type CapabilitiesRegistryOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CapabilitiesRegistryOwnershipTransferredIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &CapabilitiesRegistryOwnershipTransferredIterator{contract: _CapabilitiesRegistry.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _CapabilitiesRegistry.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(CapabilitiesRegistryOwnershipTransferred)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistryFilterer) ParseOwnershipTransferred(log types.Log) (*CapabilitiesRegistryOwnershipTransferred, error) {
+ event := new(CapabilitiesRegistryOwnershipTransferred)
+ if err := _CapabilitiesRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistry) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _CapabilitiesRegistry.abi.Events["CapabilityConfigured"].ID:
+ return _CapabilitiesRegistry.ParseCapabilityConfigured(log)
+ case _CapabilitiesRegistry.abi.Events["CapabilityDeprecated"].ID:
+ return _CapabilitiesRegistry.ParseCapabilityDeprecated(log)
+ case _CapabilitiesRegistry.abi.Events["ConfigSet"].ID:
+ return _CapabilitiesRegistry.ParseConfigSet(log)
+ case _CapabilitiesRegistry.abi.Events["NodeAdded"].ID:
+ return _CapabilitiesRegistry.ParseNodeAdded(log)
+ case _CapabilitiesRegistry.abi.Events["NodeOperatorAdded"].ID:
+ return _CapabilitiesRegistry.ParseNodeOperatorAdded(log)
+ case _CapabilitiesRegistry.abi.Events["NodeOperatorRemoved"].ID:
+ return _CapabilitiesRegistry.ParseNodeOperatorRemoved(log)
+ case _CapabilitiesRegistry.abi.Events["NodeOperatorUpdated"].ID:
+ return _CapabilitiesRegistry.ParseNodeOperatorUpdated(log)
+ case _CapabilitiesRegistry.abi.Events["NodeRemoved"].ID:
+ return _CapabilitiesRegistry.ParseNodeRemoved(log)
+ case _CapabilitiesRegistry.abi.Events["NodeUpdated"].ID:
+ return _CapabilitiesRegistry.ParseNodeUpdated(log)
+ case _CapabilitiesRegistry.abi.Events["OwnershipTransferRequested"].ID:
+ return _CapabilitiesRegistry.ParseOwnershipTransferRequested(log)
+ case _CapabilitiesRegistry.abi.Events["OwnershipTransferred"].ID:
+ return _CapabilitiesRegistry.ParseOwnershipTransferred(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (CapabilitiesRegistryCapabilityConfigured) Topic() common.Hash {
+ return common.HexToHash("0x04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae")
+}
+
+func (CapabilitiesRegistryCapabilityDeprecated) Topic() common.Hash {
+ return common.HexToHash("0xdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf21")
+}
+
+func (CapabilitiesRegistryConfigSet) Topic() common.Hash {
+ return common.HexToHash("0xf264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651")
+}
+
+func (CapabilitiesRegistryNodeAdded) Topic() common.Hash {
+ return common.HexToHash("0x74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05")
+}
+
+func (CapabilitiesRegistryNodeOperatorAdded) Topic() common.Hash {
+ return common.HexToHash("0x78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e")
+}
+
+func (CapabilitiesRegistryNodeOperatorRemoved) Topic() common.Hash {
+ return common.HexToHash("0xa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a")
+}
+
+func (CapabilitiesRegistryNodeOperatorUpdated) Topic() common.Hash {
+ return common.HexToHash("0x86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a28")
+}
+
+func (CapabilitiesRegistryNodeRemoved) Topic() common.Hash {
+ return common.HexToHash("0x5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb9753205")
+}
+
+func (CapabilitiesRegistryNodeUpdated) Topic() common.Hash {
+ return common.HexToHash("0x4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b")
+}
+
+func (CapabilitiesRegistryOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (CapabilitiesRegistryOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (_CapabilitiesRegistry *CapabilitiesRegistry) Address() common.Address {
+ return _CapabilitiesRegistry.address
+}
+
+type CapabilitiesRegistryInterface interface {
+ GetCapabilities(opts *bind.CallOpts) ([]CapabilitiesRegistryCapabilityInfo, error)
+
+ GetCapability(opts *bind.CallOpts, hashedId [32]byte) (CapabilitiesRegistryCapabilityInfo, error)
+
+ GetCapabilityConfigs(opts *bind.CallOpts, donId uint32, capabilityId [32]byte) ([]byte, []byte, error)
+
+ GetDON(opts *bind.CallOpts, donId uint32) (CapabilitiesRegistryDONInfo, error)
+
+ GetDONs(opts *bind.CallOpts) ([]CapabilitiesRegistryDONInfo, error)
+
+ GetHashedCapabilityId(opts *bind.CallOpts, labelledName string, version string) ([32]byte, error)
+
+ GetNextDONId(opts *bind.CallOpts) (uint32, error)
+
+ GetNode(opts *bind.CallOpts, p2pId [32]byte) (INodeInfoProviderNodeInfo, error)
+
+ GetNodeOperator(opts *bind.CallOpts, nodeOperatorId uint32) (CapabilitiesRegistryNodeOperator, error)
+
+ GetNodeOperators(opts *bind.CallOpts) ([]CapabilitiesRegistryNodeOperator, error)
+
+ GetNodes(opts *bind.CallOpts) ([]INodeInfoProviderNodeInfo, error)
+
+ GetNodesByP2PIds(opts *bind.CallOpts, p2pIds [][32]byte) ([]INodeInfoProviderNodeInfo, error)
+
+ IsCapabilityDeprecated(opts *bind.CallOpts, hashedCapabilityId [32]byte) (bool, error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ AddCapabilities(opts *bind.TransactOpts, capabilities []CapabilitiesRegistryCapability) (*types.Transaction, error)
+
+ AddDON(opts *bind.TransactOpts, nodes [][32]byte, capabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration, isPublic bool, acceptsWorkflows bool, f uint8) (*types.Transaction, error)
+
+ AddNodeOperators(opts *bind.TransactOpts, nodeOperators []CapabilitiesRegistryNodeOperator) (*types.Transaction, error)
+
+ AddNodes(opts *bind.TransactOpts, nodes []CapabilitiesRegistryNodeParams) (*types.Transaction, error)
+
+ DeprecateCapabilities(opts *bind.TransactOpts, hashedCapabilityIds [][32]byte) (*types.Transaction, error)
+
+ RemoveDONs(opts *bind.TransactOpts, donIds []uint32) (*types.Transaction, error)
+
+ RemoveNodeOperators(opts *bind.TransactOpts, nodeOperatorIds []uint32) (*types.Transaction, error)
+
+ RemoveNodes(opts *bind.TransactOpts, removedNodeP2PIds [][32]byte) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ UpdateDON(opts *bind.TransactOpts, donId uint32, nodes [][32]byte, capabilityConfigurations []CapabilitiesRegistryCapabilityConfiguration, isPublic bool, f uint8) (*types.Transaction, error)
+
+ UpdateNodeOperators(opts *bind.TransactOpts, nodeOperatorIds []uint32, nodeOperators []CapabilitiesRegistryNodeOperator) (*types.Transaction, error)
+
+ UpdateNodes(opts *bind.TransactOpts, nodes []CapabilitiesRegistryNodeParams) (*types.Transaction, error)
+
+ FilterCapabilityConfigured(opts *bind.FilterOpts, hashedCapabilityId [][32]byte) (*CapabilitiesRegistryCapabilityConfiguredIterator, error)
+
+ WatchCapabilityConfigured(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryCapabilityConfigured, hashedCapabilityId [][32]byte) (event.Subscription, error)
+
+ ParseCapabilityConfigured(log types.Log) (*CapabilitiesRegistryCapabilityConfigured, error)
+
+ FilterCapabilityDeprecated(opts *bind.FilterOpts, hashedCapabilityId [][32]byte) (*CapabilitiesRegistryCapabilityDeprecatedIterator, error)
+
+ WatchCapabilityDeprecated(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryCapabilityDeprecated, hashedCapabilityId [][32]byte) (event.Subscription, error)
+
+ ParseCapabilityDeprecated(log types.Log) (*CapabilitiesRegistryCapabilityDeprecated, error)
+
+ FilterConfigSet(opts *bind.FilterOpts, donId []uint32) (*CapabilitiesRegistryConfigSetIterator, error)
+
+ WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryConfigSet, donId []uint32) (event.Subscription, error)
+
+ ParseConfigSet(log types.Log) (*CapabilitiesRegistryConfigSet, error)
+
+ FilterNodeAdded(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilitiesRegistryNodeAddedIterator, error)
+
+ WatchNodeAdded(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeAdded, nodeOperatorId []uint32) (event.Subscription, error)
+
+ ParseNodeAdded(log types.Log) (*CapabilitiesRegistryNodeAdded, error)
+
+ FilterNodeOperatorAdded(opts *bind.FilterOpts, nodeOperatorId []uint32, admin []common.Address) (*CapabilitiesRegistryNodeOperatorAddedIterator, error)
+
+ WatchNodeOperatorAdded(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeOperatorAdded, nodeOperatorId []uint32, admin []common.Address) (event.Subscription, error)
+
+ ParseNodeOperatorAdded(log types.Log) (*CapabilitiesRegistryNodeOperatorAdded, error)
+
+ FilterNodeOperatorRemoved(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilitiesRegistryNodeOperatorRemovedIterator, error)
+
+ WatchNodeOperatorRemoved(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeOperatorRemoved, nodeOperatorId []uint32) (event.Subscription, error)
+
+ ParseNodeOperatorRemoved(log types.Log) (*CapabilitiesRegistryNodeOperatorRemoved, error)
+
+ FilterNodeOperatorUpdated(opts *bind.FilterOpts, nodeOperatorId []uint32, admin []common.Address) (*CapabilitiesRegistryNodeOperatorUpdatedIterator, error)
+
+ WatchNodeOperatorUpdated(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeOperatorUpdated, nodeOperatorId []uint32, admin []common.Address) (event.Subscription, error)
+
+ ParseNodeOperatorUpdated(log types.Log) (*CapabilitiesRegistryNodeOperatorUpdated, error)
+
+ FilterNodeRemoved(opts *bind.FilterOpts) (*CapabilitiesRegistryNodeRemovedIterator, error)
+
+ WatchNodeRemoved(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeRemoved) (event.Subscription, error)
+
+ ParseNodeRemoved(log types.Log) (*CapabilitiesRegistryNodeRemoved, error)
+
+ FilterNodeUpdated(opts *bind.FilterOpts, nodeOperatorId []uint32) (*CapabilitiesRegistryNodeUpdatedIterator, error)
+
+ WatchNodeUpdated(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryNodeUpdated, nodeOperatorId []uint32) (event.Subscription, error)
+
+ ParseNodeUpdated(log types.Log) (*CapabilitiesRegistryNodeUpdated, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CapabilitiesRegistryOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*CapabilitiesRegistryOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CapabilitiesRegistryOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CapabilitiesRegistryOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*CapabilitiesRegistryOwnershipTransferred, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/keystone/generated/feeds_consumer_1_0_0/feeds_consumer.go b/core/gethwrappers/keystone/generated/feeds_consumer_1_0_0/feeds_consumer.go
new file mode 100644
index 00000000000..8b618fbddb5
--- /dev/null
+++ b/core/gethwrappers/keystone/generated/feeds_consumer_1_0_0/feeds_consumer.go
@@ -0,0 +1,756 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package feeds_consumer
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
+)
+
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+var KeystoneFeedsConsumerMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"}],\"name\":\"UnauthorizedWorkflowName\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"}],\"name\":\"UnauthorizedWorkflowOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint224\",\"name\":\"price\",\"type\":\"uint224\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"name\":\"FeedReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_allowedSendersList\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_allowedWorkflowOwnersList\",\"type\":\"address[]\"},{\"internalType\":\"bytes10[]\",\"name\":\"_allowedWorkflowNamesList\",\"type\":\"bytes10[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6112d8806101576000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063805f21321161005b578063805f2132146101695780638da5cb5b1461017c578063e3401711146101a4578063f2fde38b146101b757600080fd5b806301ffc9a71461008257806331d98b3f146100aa57806379ba50971461015f575b600080fd5b610095610090366004610e2b565b6101ca565b60405190151581526020015b60405180910390f35b6101266100b8366004610e74565b6000908152600260209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168084527c010000000000000000000000000000000000000000000000000000000090910463ffffffff169290910182905291565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909316835263ffffffff9091166020830152016100a1565b610167610263565b005b610167610177366004610ed6565b610365565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a1565b6101676101b2366004610f87565b6106e4565b6101676101c5366004611021565b610b24565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f805f213200000000000000000000000000000000000000000000000000000000148061025d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146102e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3360009081526004602052604090205460ff166103b0576040517f3fcc3f170000000000000000000000000000000000000000000000000000000081523360048201526024016102e0565b6000806103f286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610b3892505050565b7fffffffffffffffffffff000000000000000000000000000000000000000000008216600090815260086020526040902054919350915060ff16610486576040517f4b942f800000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffff00000000000000000000000000000000000000000000831660048201526024016102e0565b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604090205460ff166104fd576040517fbf24162300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016102e0565b600061050b848601866110fe565b905060005b81518110156106da57604051806040016040528083838151811061053657610536611210565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200183838151811061057757610577611210565b60200260200101516040015163ffffffff16815250600260008484815181106105a2576105a2611210565b602090810291909101810151518252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055815182908290811061062457610624611210565b6020026020010151600001517f2c30f5cb3caf4239d0f994ce539d7ef24817fa550169c388e3a110f02e40197d83838151811061066357610663611210565b60200260200101516020015184848151811061068157610681611210565b6020026020010151604001516040516106ca9291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a2600101610510565b5050505050505050565b6106ec610b4e565b60005b60035463ffffffff8216101561078d5760006004600060038463ffffffff168154811061071e5761071e611210565b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556107868161123f565b90506106ef565b5060005b63ffffffff81168611156108355760016004600089898563ffffffff168181106107bd576107bd611210565b90506020020160208101906107d29190611021565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905561082e8161123f565b9050610791565b5061084260038787610cc6565b5060005b60055463ffffffff821610156108e45760006006600060058463ffffffff168154811061087557610875611210565b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556108dd8161123f565b9050610846565b5060005b63ffffffff811684111561098c5760016006600087878563ffffffff1681811061091457610914611210565b90506020020160208101906109299190611021565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556109858161123f565b90506108e8565b5061099960058585610cc6565b5060005b60075463ffffffff82161015610a5a5760006008600060078463ffffffff16815481106109cc576109cc611210565b600091825260208083206003808404909101549206600a026101000a90910460b01b7fffffffffffffffffffff00000000000000000000000000000000000000000000168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055610a538161123f565b905061099d565b5060005b63ffffffff8116821115610b0e5760016008600085858563ffffffff16818110610a8a57610a8a611210565b9050602002016020810190610a9f9190611289565b7fffffffffffffffffffff00000000000000000000000000000000000000000000168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055610b078161123f565b9050610a5e565b50610b1b60078383610d4e565b50505050505050565b610b2c610b4e565b610b3581610bd1565b50565b6040810151604a90910151909160609190911c90565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016102e0565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016102e0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054828255906000526020600020908101928215610d3e579160200282015b82811115610d3e5781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190610ce6565b50610d4a929150610e16565b5090565b82805482825590600052602060002090600201600390048101928215610d3e5791602002820160005b83821115610dd757833575ffffffffffffffffffffffffffffffffffffffffffff191683826101000a81548169ffffffffffffffffffff021916908360b01c02179055509260200192600a01602081600901049283019260010302610d77565b8015610e0d5782816101000a81549069ffffffffffffffffffff0219169055600a01602081600901049283019260010302610dd7565b5050610d4a9291505b5b80821115610d4a5760008155600101610e17565b600060208284031215610e3d57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e6d57600080fd5b9392505050565b600060208284031215610e8657600080fd5b5035919050565b60008083601f840112610e9f57600080fd5b50813567ffffffffffffffff811115610eb757600080fd5b602083019150836020828501011115610ecf57600080fd5b9250929050565b60008060008060408587031215610eec57600080fd5b843567ffffffffffffffff80821115610f0457600080fd5b610f1088838901610e8d565b90965094506020870135915080821115610f2957600080fd5b50610f3687828801610e8d565b95989497509550505050565b60008083601f840112610f5457600080fd5b50813567ffffffffffffffff811115610f6c57600080fd5b6020830191508360208260051b8501011115610ecf57600080fd5b60008060008060008060608789031215610fa057600080fd5b863567ffffffffffffffff80821115610fb857600080fd5b610fc48a838b01610f42565b90985096506020890135915080821115610fdd57600080fd5b610fe98a838b01610f42565b9096509450604089013591508082111561100257600080fd5b5061100f89828a01610f42565b979a9699509497509295939492505050565b60006020828403121561103357600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610e6d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156110a9576110a9611057565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156110f6576110f6611057565b604052919050565b6000602080838503121561111157600080fd5b823567ffffffffffffffff8082111561112957600080fd5b818501915085601f83011261113d57600080fd5b81358181111561114f5761114f611057565b61115d848260051b016110af565b8181528481019250606091820284018501918883111561117c57600080fd5b938501935b828510156112045780858a0312156111995760008081fd5b6111a1611086565b85358152868601357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146111d45760008081fd5b8188015260408681013563ffffffff811681146111f15760008081fd5b9082015284529384019392850192611181565b50979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff80831681810361127f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6001019392505050565b60006020828403121561129b57600080fd5b81357fffffffffffffffffffff0000000000000000000000000000000000000000000081168114610e6d57600080fdfea164736f6c6343000818000a",
+}
+
+var KeystoneFeedsConsumerABI = KeystoneFeedsConsumerMetaData.ABI
+
+var KeystoneFeedsConsumerBin = KeystoneFeedsConsumerMetaData.Bin
+
+func DeployKeystoneFeedsConsumer(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *KeystoneFeedsConsumer, error) {
+ parsed, err := KeystoneFeedsConsumerMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(KeystoneFeedsConsumerBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &KeystoneFeedsConsumer{address: address, abi: *parsed, KeystoneFeedsConsumerCaller: KeystoneFeedsConsumerCaller{contract: contract}, KeystoneFeedsConsumerTransactor: KeystoneFeedsConsumerTransactor{contract: contract}, KeystoneFeedsConsumerFilterer: KeystoneFeedsConsumerFilterer{contract: contract}}, nil
+}
+
+type KeystoneFeedsConsumer struct {
+ address common.Address
+ abi abi.ABI
+ KeystoneFeedsConsumerCaller
+ KeystoneFeedsConsumerTransactor
+ KeystoneFeedsConsumerFilterer
+}
+
+type KeystoneFeedsConsumerCaller struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneFeedsConsumerTransactor struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneFeedsConsumerFilterer struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneFeedsConsumerSession struct {
+ Contract *KeystoneFeedsConsumer
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type KeystoneFeedsConsumerCallerSession struct {
+ Contract *KeystoneFeedsConsumerCaller
+ CallOpts bind.CallOpts
+}
+
+type KeystoneFeedsConsumerTransactorSession struct {
+ Contract *KeystoneFeedsConsumerTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type KeystoneFeedsConsumerRaw struct {
+ Contract *KeystoneFeedsConsumer
+}
+
+type KeystoneFeedsConsumerCallerRaw struct {
+ Contract *KeystoneFeedsConsumerCaller
+}
+
+type KeystoneFeedsConsumerTransactorRaw struct {
+ Contract *KeystoneFeedsConsumerTransactor
+}
+
+func NewKeystoneFeedsConsumer(address common.Address, backend bind.ContractBackend) (*KeystoneFeedsConsumer, error) {
+ abi, err := abi.JSON(strings.NewReader(KeystoneFeedsConsumerABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindKeystoneFeedsConsumer(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumer{address: address, abi: abi, KeystoneFeedsConsumerCaller: KeystoneFeedsConsumerCaller{contract: contract}, KeystoneFeedsConsumerTransactor: KeystoneFeedsConsumerTransactor{contract: contract}, KeystoneFeedsConsumerFilterer: KeystoneFeedsConsumerFilterer{contract: contract}}, nil
+}
+
+func NewKeystoneFeedsConsumerCaller(address common.Address, caller bind.ContractCaller) (*KeystoneFeedsConsumerCaller, error) {
+ contract, err := bindKeystoneFeedsConsumer(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerCaller{contract: contract}, nil
+}
+
+func NewKeystoneFeedsConsumerTransactor(address common.Address, transactor bind.ContractTransactor) (*KeystoneFeedsConsumerTransactor, error) {
+ contract, err := bindKeystoneFeedsConsumer(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerTransactor{contract: contract}, nil
+}
+
+func NewKeystoneFeedsConsumerFilterer(address common.Address, filterer bind.ContractFilterer) (*KeystoneFeedsConsumerFilterer, error) {
+ contract, err := bindKeystoneFeedsConsumer(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerFilterer{contract: contract}, nil
+}
+
+func bindKeystoneFeedsConsumer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := KeystoneFeedsConsumerMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _KeystoneFeedsConsumer.Contract.KeystoneFeedsConsumerCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.KeystoneFeedsConsumerTransactor.contract.Transfer(opts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.KeystoneFeedsConsumerTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _KeystoneFeedsConsumer.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.contract.Transfer(opts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCaller) GetPrice(opts *bind.CallOpts, feedId [32]byte) (*big.Int, uint32, error) {
+ var out []interface{}
+ err := _KeystoneFeedsConsumer.contract.Call(opts, &out, "getPrice", feedId)
+
+ if err != nil {
+ return *new(*big.Int), *new(uint32), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+ out1 := *abi.ConvertType(out[1], new(uint32)).(*uint32)
+
+ return out0, out1, err
+
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) GetPrice(feedId [32]byte) (*big.Int, uint32, error) {
+ return _KeystoneFeedsConsumer.Contract.GetPrice(&_KeystoneFeedsConsumer.CallOpts, feedId)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCallerSession) GetPrice(feedId [32]byte) (*big.Int, uint32, error) {
+ return _KeystoneFeedsConsumer.Contract.GetPrice(&_KeystoneFeedsConsumer.CallOpts, feedId)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _KeystoneFeedsConsumer.contract.Call(opts, &out, "owner")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) Owner() (common.Address, error) {
+ return _KeystoneFeedsConsumer.Contract.Owner(&_KeystoneFeedsConsumer.CallOpts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCallerSession) Owner() (common.Address, error) {
+ return _KeystoneFeedsConsumer.Contract.Owner(&_KeystoneFeedsConsumer.CallOpts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
+ var out []interface{}
+ err := _KeystoneFeedsConsumer.contract.Call(opts, &out, "supportsInterface", interfaceId)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _KeystoneFeedsConsumer.Contract.SupportsInterface(&_KeystoneFeedsConsumer.CallOpts, interfaceId)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _KeystoneFeedsConsumer.Contract.SupportsInterface(&_KeystoneFeedsConsumer.CallOpts, interfaceId)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) AcceptOwnership() (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.AcceptOwnership(&_KeystoneFeedsConsumer.TransactOpts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.AcceptOwnership(&_KeystoneFeedsConsumer.TransactOpts)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactor) OnReport(opts *bind.TransactOpts, metadata []byte, rawReport []byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.contract.Transact(opts, "onReport", metadata, rawReport)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) OnReport(metadata []byte, rawReport []byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.OnReport(&_KeystoneFeedsConsumer.TransactOpts, metadata, rawReport)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorSession) OnReport(metadata []byte, rawReport []byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.OnReport(&_KeystoneFeedsConsumer.TransactOpts, metadata, rawReport)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactor) SetConfig(opts *bind.TransactOpts, _allowedSendersList []common.Address, _allowedWorkflowOwnersList []common.Address, _allowedWorkflowNamesList [][10]byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.contract.Transact(opts, "setConfig", _allowedSendersList, _allowedWorkflowOwnersList, _allowedWorkflowNamesList)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) SetConfig(_allowedSendersList []common.Address, _allowedWorkflowOwnersList []common.Address, _allowedWorkflowNamesList [][10]byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.SetConfig(&_KeystoneFeedsConsumer.TransactOpts, _allowedSendersList, _allowedWorkflowOwnersList, _allowedWorkflowNamesList)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorSession) SetConfig(_allowedSendersList []common.Address, _allowedWorkflowOwnersList []common.Address, _allowedWorkflowNamesList [][10]byte) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.SetConfig(&_KeystoneFeedsConsumer.TransactOpts, _allowedSendersList, _allowedWorkflowOwnersList, _allowedWorkflowNamesList)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.TransferOwnership(&_KeystoneFeedsConsumer.TransactOpts, to)
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _KeystoneFeedsConsumer.Contract.TransferOwnership(&_KeystoneFeedsConsumer.TransactOpts, to)
+}
+
+type KeystoneFeedsConsumerFeedReceivedIterator struct {
+ Event *KeystoneFeedsConsumerFeedReceived
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneFeedsConsumerFeedReceivedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerFeedReceived)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerFeedReceived)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *KeystoneFeedsConsumerFeedReceivedIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneFeedsConsumerFeedReceivedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneFeedsConsumerFeedReceived struct {
+ FeedId [32]byte
+ Price *big.Int
+ Timestamp uint32
+ Raw types.Log
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) FilterFeedReceived(opts *bind.FilterOpts, feedId [][32]byte) (*KeystoneFeedsConsumerFeedReceivedIterator, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.FilterLogs(opts, "FeedReceived", feedIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerFeedReceivedIterator{contract: _KeystoneFeedsConsumer.contract, event: "FeedReceived", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) WatchFeedReceived(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerFeedReceived, feedId [][32]byte) (event.Subscription, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.WatchLogs(opts, "FeedReceived", feedIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneFeedsConsumerFeedReceived)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "FeedReceived", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) ParseFeedReceived(log types.Log) (*KeystoneFeedsConsumerFeedReceived, error) {
+ event := new(KeystoneFeedsConsumerFeedReceived)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "FeedReceived", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneFeedsConsumerOwnershipTransferRequestedIterator struct {
+ Event *KeystoneFeedsConsumerOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerOwnershipTransferRequested)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerOwnershipTransferRequested)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneFeedsConsumerOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneFeedsConsumerOwnershipTransferRequestedIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerOwnershipTransferRequestedIterator{contract: _KeystoneFeedsConsumer.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneFeedsConsumerOwnershipTransferRequested)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) ParseOwnershipTransferRequested(log types.Log) (*KeystoneFeedsConsumerOwnershipTransferRequested, error) {
+ event := new(KeystoneFeedsConsumerOwnershipTransferRequested)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneFeedsConsumerOwnershipTransferredIterator struct {
+ Event *KeystoneFeedsConsumerOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerOwnershipTransferred)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneFeedsConsumerOwnershipTransferred)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneFeedsConsumerOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneFeedsConsumerOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneFeedsConsumerOwnershipTransferredIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneFeedsConsumerOwnershipTransferredIterator{contract: _KeystoneFeedsConsumer.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneFeedsConsumer.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneFeedsConsumerOwnershipTransferred)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumerFilterer) ParseOwnershipTransferred(log types.Log) (*KeystoneFeedsConsumerOwnershipTransferred, error) {
+ event := new(KeystoneFeedsConsumerOwnershipTransferred)
+ if err := _KeystoneFeedsConsumer.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumer) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _KeystoneFeedsConsumer.abi.Events["FeedReceived"].ID:
+ return _KeystoneFeedsConsumer.ParseFeedReceived(log)
+ case _KeystoneFeedsConsumer.abi.Events["OwnershipTransferRequested"].ID:
+ return _KeystoneFeedsConsumer.ParseOwnershipTransferRequested(log)
+ case _KeystoneFeedsConsumer.abi.Events["OwnershipTransferred"].ID:
+ return _KeystoneFeedsConsumer.ParseOwnershipTransferred(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (KeystoneFeedsConsumerFeedReceived) Topic() common.Hash {
+ return common.HexToHash("0x2c30f5cb3caf4239d0f994ce539d7ef24817fa550169c388e3a110f02e40197d")
+}
+
+func (KeystoneFeedsConsumerOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (KeystoneFeedsConsumerOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (_KeystoneFeedsConsumer *KeystoneFeedsConsumer) Address() common.Address {
+ return _KeystoneFeedsConsumer.address
+}
+
+type KeystoneFeedsConsumerInterface interface {
+ GetPrice(opts *bind.CallOpts, feedId [32]byte) (*big.Int, uint32, error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ OnReport(opts *bind.TransactOpts, metadata []byte, rawReport []byte) (*types.Transaction, error)
+
+ SetConfig(opts *bind.TransactOpts, _allowedSendersList []common.Address, _allowedWorkflowOwnersList []common.Address, _allowedWorkflowNamesList [][10]byte) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ FilterFeedReceived(opts *bind.FilterOpts, feedId [][32]byte) (*KeystoneFeedsConsumerFeedReceivedIterator, error)
+
+ WatchFeedReceived(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerFeedReceived, feedId [][32]byte) (event.Subscription, error)
+
+ ParseFeedReceived(log types.Log) (*KeystoneFeedsConsumerFeedReceived, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneFeedsConsumerOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*KeystoneFeedsConsumerOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneFeedsConsumerOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *KeystoneFeedsConsumerOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*KeystoneFeedsConsumerOwnershipTransferred, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/keystone/generated/forwarder_1_0_0/forwarder.go b/core/gethwrappers/keystone/generated/forwarder_1_0_0/forwarder.go
new file mode 100644
index 00000000000..c62e4904deb
--- /dev/null
+++ b/core/gethwrappers/keystone/generated/forwarder_1_0_0/forwarder.go
@@ -0,0 +1,1337 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package forwarder
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
+)
+
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+type IRouterTransmissionInfo struct {
+ TransmissionId [32]byte
+ State uint8
+ Transmitter common.Address
+ InvalidReceiver bool
+ Success bool
+ GasLimit *big.Int
+}
+
+var KeystoneForwarderMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transmissionId\",\"type\":\"bytes32\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSigners\",\"type\":\"uint256\"}],\"name\":\"ExcessSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FaultToleranceMustBePositive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transmissionId\",\"type\":\"bytes32\"}],\"name\":\"InsufficientGasForRouting\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSigners\",\"type\":\"uint256\"}],\"name\":\"InsufficientSigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"configId\",\"type\":\"uint64\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"received\",\"type\":\"uint256\"}],\"name\":\"InvalidSignatureCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedForwarder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"configVersion\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"ForwarderAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"ForwarderRemoved\",\"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\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes2\",\"name\":\"reportId\",\"type\":\"bytes2\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"ReportProcessed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"addForwarder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configVersion\",\"type\":\"uint32\"}],\"name\":\"clearConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes2\",\"name\":\"reportId\",\"type\":\"bytes2\"}],\"name\":\"getTransmissionId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes2\",\"name\":\"reportId\",\"type\":\"bytes2\"}],\"name\":\"getTransmissionInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transmissionId\",\"type\":\"bytes32\"},{\"internalType\":\"enumIRouter.TransmissionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"invalidReceiver\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint80\",\"name\":\"gasLimit\",\"type\":\"uint80\"}],\"internalType\":\"structIRouter.TransmissionInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"workflowExecutionId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes2\",\"name\":\"reportId\",\"type\":\"bytes2\"}],\"name\":\"getTransmitter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"removeForwarder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"reportContext\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"name\":\"report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"transmissionId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"validatedReport\",\"type\":\"bytes\"}],\"name\":\"route\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configVersion\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"}],\"name\":\"setConfig\",\"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: "0x60806040523480156200001157600080fd5b503380600081620000695760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200009c576200009c81620000bf565b5050306000908152600360205260409020805460ff19166001179055506200016a565b336001600160a01b03821603620001195760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000060565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61218f806200017a6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806379ba50971161008c578063abcef55411610066578063abcef5541461035d578063ee59d26c14610396578063ef6e17a0146103a9578063f2fde38b146103bc57600080fd5b806379ba50971461025e5780638864b864146102665780638da5cb5b1461033f57600080fd5b8063272cbd93116100c8578063272cbd9314610179578063354bdd66146101995780634d93172d146102385780635c41d2fe1461024b57600080fd5b806311289565146100ef578063181f5a7714610104578063233fd52d14610156575b600080fd5b6101026100fd366004611a33565b6103cf565b005b6101406040518060400160405280601781526020017f4b657973746f6e65466f7277617264657220312e302e3000000000000000000081525081565b60405161014d9190611ade565b60405180910390f35b610169610164366004611b4b565b610989565b604051901515815260200161014d565b61018c610187366004611bd3565b610d4a565b60405161014d9190611c67565b61022a6101a7366004611bd3565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152603481018390527fffff000000000000000000000000000000000000000000000000000000000000821660548201526000906056016040516020818303038152906040528051906020012090509392505050565b60405190815260200161014d565b610102610246366004611d0f565b610f50565b610102610259366004611d0f565b610fcc565b61010261104b565b61031a610274366004611bd3565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208086019190915260348501939093527fffff000000000000000000000000000000000000000000000000000000000000919091166054840152805160368185030181526056909301815282519282019290922060009081526004909152205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014d565b60005473ffffffffffffffffffffffffffffffffffffffff1661031a565b61016961036b366004611d0f565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b6101026103a4366004611d3e565b611148565b6101026103b7366004611dbc565b611525565b6101026103ca366004611d0f565b6115c5565b606d85101561040a576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600061044e89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115d992505050565b67ffffffffffffffff8216600090815260026020526040812080549497509195509193509160ff16908190036104c1576040517fdf3b81ea00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b856104cd826001611e1e565b60ff161461051f576104e0816001611e1e565b6040517fd6022e8e00000000000000000000000000000000000000000000000000000000815260ff9091166004820152602481018790526044016104b8565b60008b8b604051610531929190611e37565b60405190819003812061054a918c908c90602001611e47565b60405160208183030381529060405280519060200120905061056a6118c0565b60005b888110156107ec573660008b8b8481811061058a5761058a611e61565b905060200281019061059c9190611e90565b9092509050604181146105df5781816040517f2adfdc300000000000000000000000000000000000000000000000000000000081526004016104b8929190611f3e565b6000600186848460408181106105f7576105f7611e61565b61060992013560f81c9050601b611e1e565b610617602060008789611f5a565b61062091611f84565b61062e60406020888a611f5a565b61063791611f84565b6040805160008152602081018083529590955260ff909316928401929092526060830152608082015260a0016020604051602081039080840390855afa158015610685573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8116600090815260028c0160205291822054909350915081900361072b576040517fbf18af4300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104b8565b600086826020811061073f5761073f611e61565b602002015173ffffffffffffffffffffffffffffffffffffffff16146107a9576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016104b8565b818682602081106107bc576107bc611e61565b73ffffffffffffffffffffffffffffffffffffffff909216602092909202015250506001909201915061056d9050565b50506040805160608f901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080830191909152603482018990527fffff0000000000000000000000000000000000000000000000000000000000008816605483015282516036818403018152605690920190925280519101206000945030935063233fd52d92509050338d8d8d602d90606d9261088e93929190611f5a565b8f8f606d9080926108a193929190611f5a565b6040518863ffffffff1660e01b81526004016108c39796959493929190611fc0565b6020604051808303816000875af11580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109069190612021565b9050817dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916838b73ffffffffffffffffffffffffffffffffffffffff167f3617b009e9785c42daebadb6d3fb553243a4bf586d07ea72d65d80013ce116b584604051610975911515815260200190565b60405180910390a450505050505050505050565b3360009081526003602052604081205460ff166109d2576040517fd79e123d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e26113886161a861204a565b5a6109ed919061205d565b90506109fd6113886161a861204a565b610a0a9062015f9061204a565b610a169061271061204a565b811015610a52576040517f0bfecd63000000000000000000000000000000000000000000000000000000008152600481018a90526024016104b8565b6000898152600460209081526040918290208251608081018452905473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000810460ff90811615159383019390935275010000000000000000000000000000000000000000008104909216151592810183905276010000000000000000000000000000000000000000000090910469ffffffffffffffffffff1660608201529080610b0a575080602001515b15610b44576040517fa53dc8ca000000000000000000000000000000000000000000000000000000008152600481018b90526024016104b8565b60008a8152600460205260409020805469ffffffffffffffffffff84167601000000000000000000000000000000000000000000000275ffff000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8c1617179055610bd9887f805f2132000000000000000000000000000000000000000000000000000000006115f4565b610c3057505050600087815260046020526040812080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055610d3f565b60008088888888604051602401610c4a9493929190612070565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f805f213200000000000000000000000000000000000000000000000000000000179052905060006113885a610cd2919061205d565b905060008083516020850160008f86f192508215610d375760008d815260046020526040902080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b509093505050505b979650505050505050565b6040805160c0810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905284519088901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001681830152603481018790527fffff000000000000000000000000000000000000000000000000000000000000861660548201528451603681830301815260568201808752815191840191909120808552600490935285842060d68301909652945473ffffffffffffffffffffffffffffffffffffffff811680875274010000000000000000000000000000000000000000820460ff9081161515607685015275010000000000000000000000000000000000000000008304161515609684015276010000000000000000000000000000000000000000000090910469ffffffffffffffffffff1660b69092019190915292939092909190610ea857506000610ed0565b816020015115610eba57506002610ed0565b8160400151610eca576003610ecd565b60015b90505b6040518060c00160405280848152602001826003811115610ef357610ef3611c38565b8152602001836000015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015115158152602001836040015115158152602001836060015169ffffffffffffffffffff1681525093505050509392505050565b610f58611619565b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fb96d15bf9258c7b8df062753a6a262864611fc7b060a5ee2e57e79b85f898d389190a250565b610fd4611619565b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0ea0ce2c048ff45a4a95f2947879de3fb94abec2f152190400cab2d1272a68e79190a250565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016104b8565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611150611619565b8260ff1660000361118d576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f8111156111d2576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101829052601f60248201526044016104b8565b6111dd836003612097565b60ff16811161123b57806111f2846003612097565b6111fd906001611e1e565b6040517f9dd9e6d8000000000000000000000000000000000000000000000000000000008152600481019290925260ff1660248201526044016104b8565b67ffffffff00000000602086901b1663ffffffff85161760005b67ffffffffffffffff82166000908152600260205260409020600101548110156112eb5767ffffffffffffffff82166000908152600260208190526040822060018101805491909201929190849081106112b1576112b1611e61565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812055600101611255565b5060005b8281101561146757600084848381811061130b5761130b611e61565b90506020020160208101906113209190611d0f565b905073ffffffffffffffffffffffffffffffffffffffff8116611387576040517fbf18af4300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016104b8565b67ffffffffffffffff8316600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff86168552909201905290205415611413576040517fe021c4f200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016104b8565b61141e82600161204a565b67ffffffffffffffff8416600090815260026020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294909101905291909120556001016112ef565b5067ffffffffffffffff8116600090815260026020526040902061148f9060010184846118df565b5067ffffffffffffffff81166000908152600260205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff87161790555163ffffffff86811691908816907f4120bd3b23957dd423555817d55654d4481b438aa15485c21b4180c784f1a45590611515908890889088906120b3565b60405180910390a3505050505050565b61152d611619565b63ffffffff818116602084811b67ffffffff00000000168217600090815260028252604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051828152928301905291928516917f4120bd3b23957dd423555817d55654d4481b438aa15485c21b4180c784f1a455916040516115b9929190612119565b60405180910390a35050565b6115cd611619565b6115d68161169c565b50565b60218101516045820151608b90920151909260c09290921c91565b60006115ff83611791565b8015611610575061161083836117f5565b90505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016104b8565b565b3373ffffffffffffffffffffffffffffffffffffffff82160361171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016104b8565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006117bd827f01ffc9a7000000000000000000000000000000000000000000000000000000006117f5565b801561161357506117ee827fffffffff000000000000000000000000000000000000000000000000000000006117f5565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156118ad575060208210155b8015610d3f575015159695505050505050565b6040518061040001604052806020906020820280368337509192915050565b828054828255906000526020600020908101928215611957579160200282015b828111156119575781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8435161782556020909201916001909101906118ff565b50611963929150611967565b5090565b5b808211156119635760008155600101611968565b803573ffffffffffffffffffffffffffffffffffffffff811681146119a057600080fd5b919050565b60008083601f8401126119b757600080fd5b50813567ffffffffffffffff8111156119cf57600080fd5b6020830191508360208285010111156119e757600080fd5b9250929050565b60008083601f840112611a0057600080fd5b50813567ffffffffffffffff811115611a1857600080fd5b6020830191508360208260051b85010111156119e757600080fd5b60008060008060008060006080888a031215611a4e57600080fd5b611a578861197c565b9650602088013567ffffffffffffffff80821115611a7457600080fd5b611a808b838c016119a5565b909850965060408a0135915080821115611a9957600080fd5b611aa58b838c016119a5565b909650945060608a0135915080821115611abe57600080fd5b50611acb8a828b016119ee565b989b979a50959850939692959293505050565b60006020808352835180602085015260005b81811015611b0c57858101830151858201604001528201611af0565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b600080600080600080600060a0888a031215611b6657600080fd5b87359650611b766020890161197c565b9550611b846040890161197c565b9450606088013567ffffffffffffffff80821115611ba157600080fd5b611bad8b838c016119a5565b909650945060808a0135915080821115611bc657600080fd5b50611acb8a828b016119a5565b600080600060608486031215611be857600080fd5b611bf18461197c565b92506020840135915060408401357fffff00000000000000000000000000000000000000000000000000000000000081168114611c2d57600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81518152602082015160c082019060048110611cac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8060208401525073ffffffffffffffffffffffffffffffffffffffff604084015116604083015260608301511515606083015260808301511515608083015260a0830151611d0860a084018269ffffffffffffffffffff169052565b5092915050565b600060208284031215611d2157600080fd5b6116108261197c565b803563ffffffff811681146119a057600080fd5b600080600080600060808688031215611d5657600080fd5b611d5f86611d2a565b9450611d6d60208701611d2a565b9350604086013560ff81168114611d8357600080fd5b9250606086013567ffffffffffffffff811115611d9f57600080fd5b611dab888289016119ee565b969995985093965092949392505050565b60008060408385031215611dcf57600080fd5b611dd883611d2a565b9150611de660208401611d2a565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff818116838216019081111561161357611613611def565b8183823760009101908152919050565b838152818360208301376000910160200190815292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611ec557600080fd5b83018035915067ffffffffffffffff821115611ee057600080fd5b6020019150368190038213156119e757600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000611f52602083018486611ef5565b949350505050565b60008085851115611f6a57600080fd5b83861115611f7757600080fd5b5050820193919092039150565b80356020831015611613577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525060a0606083015261200060a083018688611ef5565b8281036080840152612013818587611ef5565b9a9950505050505050505050565b60006020828403121561203357600080fd5b8151801515811461204357600080fd5b9392505050565b8082018082111561161357611613611def565b8181038181111561161357611613611def565b604081526000612084604083018688611ef5565b8281036020840152610d3f818587611ef5565b60ff8181168382160290811690818114611d0857611d08611def565b60ff8416815260406020808301829052908201839052600090849060608401835b8681101561210d5773ffffffffffffffffffffffffffffffffffffffff6120fa8561197c565b16825292820192908201906001016120d4565b50979650505050505050565b60006040820160ff8516835260206040602085015281855180845260608601915060208701935060005b8181101561217557845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101612143565b509097965050505050505056fea164736f6c6343000818000a",
+}
+
+var KeystoneForwarderABI = KeystoneForwarderMetaData.ABI
+
+var KeystoneForwarderBin = KeystoneForwarderMetaData.Bin
+
+func DeployKeystoneForwarder(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *KeystoneForwarder, error) {
+ parsed, err := KeystoneForwarderMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(KeystoneForwarderBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &KeystoneForwarder{address: address, abi: *parsed, KeystoneForwarderCaller: KeystoneForwarderCaller{contract: contract}, KeystoneForwarderTransactor: KeystoneForwarderTransactor{contract: contract}, KeystoneForwarderFilterer: KeystoneForwarderFilterer{contract: contract}}, nil
+}
+
+type KeystoneForwarder struct {
+ address common.Address
+ abi abi.ABI
+ KeystoneForwarderCaller
+ KeystoneForwarderTransactor
+ KeystoneForwarderFilterer
+}
+
+type KeystoneForwarderCaller struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneForwarderTransactor struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneForwarderFilterer struct {
+ contract *bind.BoundContract
+}
+
+type KeystoneForwarderSession struct {
+ Contract *KeystoneForwarder
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type KeystoneForwarderCallerSession struct {
+ Contract *KeystoneForwarderCaller
+ CallOpts bind.CallOpts
+}
+
+type KeystoneForwarderTransactorSession struct {
+ Contract *KeystoneForwarderTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type KeystoneForwarderRaw struct {
+ Contract *KeystoneForwarder
+}
+
+type KeystoneForwarderCallerRaw struct {
+ Contract *KeystoneForwarderCaller
+}
+
+type KeystoneForwarderTransactorRaw struct {
+ Contract *KeystoneForwarderTransactor
+}
+
+func NewKeystoneForwarder(address common.Address, backend bind.ContractBackend) (*KeystoneForwarder, error) {
+ abi, err := abi.JSON(strings.NewReader(KeystoneForwarderABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindKeystoneForwarder(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarder{address: address, abi: abi, KeystoneForwarderCaller: KeystoneForwarderCaller{contract: contract}, KeystoneForwarderTransactor: KeystoneForwarderTransactor{contract: contract}, KeystoneForwarderFilterer: KeystoneForwarderFilterer{contract: contract}}, nil
+}
+
+func NewKeystoneForwarderCaller(address common.Address, caller bind.ContractCaller) (*KeystoneForwarderCaller, error) {
+ contract, err := bindKeystoneForwarder(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderCaller{contract: contract}, nil
+}
+
+func NewKeystoneForwarderTransactor(address common.Address, transactor bind.ContractTransactor) (*KeystoneForwarderTransactor, error) {
+ contract, err := bindKeystoneForwarder(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderTransactor{contract: contract}, nil
+}
+
+func NewKeystoneForwarderFilterer(address common.Address, filterer bind.ContractFilterer) (*KeystoneForwarderFilterer, error) {
+ contract, err := bindKeystoneForwarder(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderFilterer{contract: contract}, nil
+}
+
+func bindKeystoneForwarder(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := KeystoneForwarderMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _KeystoneForwarder.Contract.KeystoneForwarderCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.KeystoneForwarderTransactor.contract.Transfer(opts)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.KeystoneForwarderTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _KeystoneForwarder.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.contract.Transfer(opts)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmissionId(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) ([32]byte, error) {
+ var out []interface{}
+ err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmissionId", receiver, workflowExecutionId, reportId)
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmissionId(receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) ([32]byte, error) {
+ return _KeystoneForwarder.Contract.GetTransmissionId(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId, reportId)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmissionId(receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) ([32]byte, error) {
+ return _KeystoneForwarder.Contract.GetTransmissionId(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId, reportId)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmissionInfo(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) (IRouterTransmissionInfo, error) {
+ var out []interface{}
+ err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmissionInfo", receiver, workflowExecutionId, reportId)
+
+ if err != nil {
+ return *new(IRouterTransmissionInfo), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(IRouterTransmissionInfo)).(*IRouterTransmissionInfo)
+
+ return out0, err
+
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmissionInfo(receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) (IRouterTransmissionInfo, error) {
+ return _KeystoneForwarder.Contract.GetTransmissionInfo(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId, reportId)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmissionInfo(receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) (IRouterTransmissionInfo, error) {
+ return _KeystoneForwarder.Contract.GetTransmissionInfo(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId, reportId)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCaller) GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) (common.Address, error) {
+ var out []interface{}
+ err := _KeystoneForwarder.contract.Call(opts, &out, "getTransmitter", receiver, workflowExecutionId, reportId)
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) (common.Address, error) {
+ return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId, reportId)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCallerSession) GetTransmitter(receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) (common.Address, error) {
+ return _KeystoneForwarder.Contract.GetTransmitter(&_KeystoneForwarder.CallOpts, receiver, workflowExecutionId, reportId)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCaller) IsForwarder(opts *bind.CallOpts, forwarder common.Address) (bool, error) {
+ var out []interface{}
+ err := _KeystoneForwarder.contract.Call(opts, &out, "isForwarder", forwarder)
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) IsForwarder(forwarder common.Address) (bool, error) {
+ return _KeystoneForwarder.Contract.IsForwarder(&_KeystoneForwarder.CallOpts, forwarder)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCallerSession) IsForwarder(forwarder common.Address) (bool, error) {
+ return _KeystoneForwarder.Contract.IsForwarder(&_KeystoneForwarder.CallOpts, forwarder)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _KeystoneForwarder.contract.Call(opts, &out, "owner")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) Owner() (common.Address, error) {
+ return _KeystoneForwarder.Contract.Owner(&_KeystoneForwarder.CallOpts)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCallerSession) Owner() (common.Address, error) {
+ return _KeystoneForwarder.Contract.Owner(&_KeystoneForwarder.CallOpts)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _KeystoneForwarder.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) TypeAndVersion() (string, error) {
+ return _KeystoneForwarder.Contract.TypeAndVersion(&_KeystoneForwarder.CallOpts)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderCallerSession) TypeAndVersion() (string, error) {
+ return _KeystoneForwarder.Contract.TypeAndVersion(&_KeystoneForwarder.CallOpts)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _KeystoneForwarder.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) AcceptOwnership() (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.AcceptOwnership(&_KeystoneForwarder.TransactOpts)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.AcceptOwnership(&_KeystoneForwarder.TransactOpts)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactor) AddForwarder(opts *bind.TransactOpts, forwarder common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.contract.Transact(opts, "addForwarder", forwarder)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) AddForwarder(forwarder common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.AddForwarder(&_KeystoneForwarder.TransactOpts, forwarder)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorSession) AddForwarder(forwarder common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.AddForwarder(&_KeystoneForwarder.TransactOpts, forwarder)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactor) ClearConfig(opts *bind.TransactOpts, donId uint32, configVersion uint32) (*types.Transaction, error) {
+ return _KeystoneForwarder.contract.Transact(opts, "clearConfig", donId, configVersion)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) ClearConfig(donId uint32, configVersion uint32) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.ClearConfig(&_KeystoneForwarder.TransactOpts, donId, configVersion)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorSession) ClearConfig(donId uint32, configVersion uint32) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.ClearConfig(&_KeystoneForwarder.TransactOpts, donId, configVersion)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactor) RemoveForwarder(opts *bind.TransactOpts, forwarder common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.contract.Transact(opts, "removeForwarder", forwarder)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) RemoveForwarder(forwarder common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.RemoveForwarder(&_KeystoneForwarder.TransactOpts, forwarder)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorSession) RemoveForwarder(forwarder common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.RemoveForwarder(&_KeystoneForwarder.TransactOpts, forwarder)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactor) Report(opts *bind.TransactOpts, receiver common.Address, rawReport []byte, reportContext []byte, signatures [][]byte) (*types.Transaction, error) {
+ return _KeystoneForwarder.contract.Transact(opts, "report", receiver, rawReport, reportContext, signatures)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) Report(receiver common.Address, rawReport []byte, reportContext []byte, signatures [][]byte) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiver, rawReport, reportContext, signatures)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Report(receiver common.Address, rawReport []byte, reportContext []byte, signatures [][]byte) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.Report(&_KeystoneForwarder.TransactOpts, receiver, rawReport, reportContext, signatures)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactor) Route(opts *bind.TransactOpts, transmissionId [32]byte, transmitter common.Address, receiver common.Address, metadata []byte, validatedReport []byte) (*types.Transaction, error) {
+ return _KeystoneForwarder.contract.Transact(opts, "route", transmissionId, transmitter, receiver, metadata, validatedReport)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) Route(transmissionId [32]byte, transmitter common.Address, receiver common.Address, metadata []byte, validatedReport []byte) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.Route(&_KeystoneForwarder.TransactOpts, transmissionId, transmitter, receiver, metadata, validatedReport)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorSession) Route(transmissionId [32]byte, transmitter common.Address, receiver common.Address, metadata []byte, validatedReport []byte) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.Route(&_KeystoneForwarder.TransactOpts, transmissionId, transmitter, receiver, metadata, validatedReport)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactor) SetConfig(opts *bind.TransactOpts, donId uint32, configVersion uint32, f uint8, signers []common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.contract.Transact(opts, "setConfig", donId, configVersion, f, signers)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) SetConfig(donId uint32, configVersion uint32, f uint8, signers []common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, configVersion, f, signers)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorSession) SetConfig(donId uint32, configVersion uint32, f uint8, signers []common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.SetConfig(&_KeystoneForwarder.TransactOpts, donId, configVersion, f, signers)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.TransferOwnership(&_KeystoneForwarder.TransactOpts, to)
+}
+
+func (_KeystoneForwarder *KeystoneForwarderTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _KeystoneForwarder.Contract.TransferOwnership(&_KeystoneForwarder.TransactOpts, to)
+}
+
+type KeystoneForwarderConfigSetIterator struct {
+ Event *KeystoneForwarderConfigSet
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneForwarderConfigSetIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneForwarderConfigSet)
+ 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(KeystoneForwarderConfigSet)
+ 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 *KeystoneForwarderConfigSetIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneForwarderConfigSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneForwarderConfigSet struct {
+ DonId uint32
+ ConfigVersion uint32
+ F uint8
+ Signers []common.Address
+ Raw types.Log
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterConfigSet(opts *bind.FilterOpts, donId []uint32, configVersion []uint32) (*KeystoneForwarderConfigSetIterator, error) {
+
+ var donIdRule []interface{}
+ for _, donIdItem := range donId {
+ donIdRule = append(donIdRule, donIdItem)
+ }
+ var configVersionRule []interface{}
+ for _, configVersionItem := range configVersion {
+ configVersionRule = append(configVersionRule, configVersionItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "ConfigSet", donIdRule, configVersionRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderConfigSetIterator{contract: _KeystoneForwarder.contract, event: "ConfigSet", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderConfigSet, donId []uint32, configVersion []uint32) (event.Subscription, error) {
+
+ var donIdRule []interface{}
+ for _, donIdItem := range donId {
+ donIdRule = append(donIdRule, donIdItem)
+ }
+ var configVersionRule []interface{}
+ for _, configVersionItem := range configVersion {
+ configVersionRule = append(configVersionRule, configVersionItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "ConfigSet", donIdRule, configVersionRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneForwarderConfigSet)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "ConfigSet", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) ParseConfigSet(log types.Log) (*KeystoneForwarderConfigSet, error) {
+ event := new(KeystoneForwarderConfigSet)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "ConfigSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneForwarderForwarderAddedIterator struct {
+ Event *KeystoneForwarderForwarderAdded
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneForwarderForwarderAddedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneForwarderForwarderAdded)
+ 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(KeystoneForwarderForwarderAdded)
+ 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 *KeystoneForwarderForwarderAddedIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneForwarderForwarderAddedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneForwarderForwarderAdded struct {
+ Forwarder common.Address
+ Raw types.Log
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterForwarderAdded(opts *bind.FilterOpts, forwarder []common.Address) (*KeystoneForwarderForwarderAddedIterator, error) {
+
+ var forwarderRule []interface{}
+ for _, forwarderItem := range forwarder {
+ forwarderRule = append(forwarderRule, forwarderItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "ForwarderAdded", forwarderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderForwarderAddedIterator{contract: _KeystoneForwarder.contract, event: "ForwarderAdded", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchForwarderAdded(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderForwarderAdded, forwarder []common.Address) (event.Subscription, error) {
+
+ var forwarderRule []interface{}
+ for _, forwarderItem := range forwarder {
+ forwarderRule = append(forwarderRule, forwarderItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "ForwarderAdded", forwarderRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneForwarderForwarderAdded)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "ForwarderAdded", 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 (_KeystoneForwarder *KeystoneForwarderFilterer) ParseForwarderAdded(log types.Log) (*KeystoneForwarderForwarderAdded, error) {
+ event := new(KeystoneForwarderForwarderAdded)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "ForwarderAdded", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneForwarderForwarderRemovedIterator struct {
+ Event *KeystoneForwarderForwarderRemoved
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneForwarderForwarderRemovedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneForwarderForwarderRemoved)
+ 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(KeystoneForwarderForwarderRemoved)
+ 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 *KeystoneForwarderForwarderRemovedIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneForwarderForwarderRemovedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneForwarderForwarderRemoved struct {
+ Forwarder common.Address
+ Raw types.Log
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterForwarderRemoved(opts *bind.FilterOpts, forwarder []common.Address) (*KeystoneForwarderForwarderRemovedIterator, error) {
+
+ var forwarderRule []interface{}
+ for _, forwarderItem := range forwarder {
+ forwarderRule = append(forwarderRule, forwarderItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "ForwarderRemoved", forwarderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderForwarderRemovedIterator{contract: _KeystoneForwarder.contract, event: "ForwarderRemoved", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchForwarderRemoved(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderForwarderRemoved, forwarder []common.Address) (event.Subscription, error) {
+
+ var forwarderRule []interface{}
+ for _, forwarderItem := range forwarder {
+ forwarderRule = append(forwarderRule, forwarderItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "ForwarderRemoved", forwarderRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneForwarderForwarderRemoved)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "ForwarderRemoved", 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 (_KeystoneForwarder *KeystoneForwarderFilterer) ParseForwarderRemoved(log types.Log) (*KeystoneForwarderForwarderRemoved, error) {
+ event := new(KeystoneForwarderForwarderRemoved)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "ForwarderRemoved", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneForwarderOwnershipTransferRequestedIterator struct {
+ Event *KeystoneForwarderOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneForwarderOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneForwarderOwnershipTransferRequested)
+ 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(KeystoneForwarderOwnershipTransferRequested)
+ 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 *KeystoneForwarderOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneForwarderOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneForwarderOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneForwarderOwnershipTransferRequestedIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderOwnershipTransferRequestedIterator{contract: _KeystoneForwarder.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneForwarderOwnershipTransferRequested)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) ParseOwnershipTransferRequested(log types.Log) (*KeystoneForwarderOwnershipTransferRequested, error) {
+ event := new(KeystoneForwarderOwnershipTransferRequested)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneForwarderOwnershipTransferredIterator struct {
+ Event *KeystoneForwarderOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneForwarderOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneForwarderOwnershipTransferred)
+ 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(KeystoneForwarderOwnershipTransferred)
+ 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 *KeystoneForwarderOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneForwarderOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneForwarderOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneForwarderOwnershipTransferredIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderOwnershipTransferredIterator{contract: _KeystoneForwarder.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneForwarderOwnershipTransferred)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) ParseOwnershipTransferred(log types.Log) (*KeystoneForwarderOwnershipTransferred, error) {
+ event := new(KeystoneForwarderOwnershipTransferred)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type KeystoneForwarderReportProcessedIterator struct {
+ Event *KeystoneForwarderReportProcessed
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *KeystoneForwarderReportProcessedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(KeystoneForwarderReportProcessed)
+ 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(KeystoneForwarderReportProcessed)
+ 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 *KeystoneForwarderReportProcessedIterator) Error() error {
+ return it.fail
+}
+
+func (it *KeystoneForwarderReportProcessedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type KeystoneForwarderReportProcessed struct {
+ Receiver common.Address
+ WorkflowExecutionId [32]byte
+ ReportId [2]byte
+ Result bool
+ Raw types.Log
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowExecutionId [][32]byte, reportId [][2]byte) (*KeystoneForwarderReportProcessedIterator, error) {
+
+ var receiverRule []interface{}
+ for _, receiverItem := range receiver {
+ receiverRule = append(receiverRule, receiverItem)
+ }
+ var workflowExecutionIdRule []interface{}
+ for _, workflowExecutionIdItem := range workflowExecutionId {
+ workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem)
+ }
+ var reportIdRule []interface{}
+ for _, reportIdItem := range reportId {
+ reportIdRule = append(reportIdRule, reportIdItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.FilterLogs(opts, "ReportProcessed", receiverRule, workflowExecutionIdRule, reportIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &KeystoneForwarderReportProcessedIterator{contract: _KeystoneForwarder.contract, event: "ReportProcessed", logs: logs, sub: sub}, nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarderFilterer) WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowExecutionId [][32]byte, reportId [][2]byte) (event.Subscription, error) {
+
+ var receiverRule []interface{}
+ for _, receiverItem := range receiver {
+ receiverRule = append(receiverRule, receiverItem)
+ }
+ var workflowExecutionIdRule []interface{}
+ for _, workflowExecutionIdItem := range workflowExecutionId {
+ workflowExecutionIdRule = append(workflowExecutionIdRule, workflowExecutionIdItem)
+ }
+ var reportIdRule []interface{}
+ for _, reportIdItem := range reportId {
+ reportIdRule = append(reportIdRule, reportIdItem)
+ }
+
+ logs, sub, err := _KeystoneForwarder.contract.WatchLogs(opts, "ReportProcessed", receiverRule, workflowExecutionIdRule, reportIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(KeystoneForwarderReportProcessed)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", 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 (_KeystoneForwarder *KeystoneForwarderFilterer) ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error) {
+ event := new(KeystoneForwarderReportProcessed)
+ if err := _KeystoneForwarder.contract.UnpackLog(event, "ReportProcessed", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+func (_KeystoneForwarder *KeystoneForwarder) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _KeystoneForwarder.abi.Events["ConfigSet"].ID:
+ return _KeystoneForwarder.ParseConfigSet(log)
+ case _KeystoneForwarder.abi.Events["ForwarderAdded"].ID:
+ return _KeystoneForwarder.ParseForwarderAdded(log)
+ case _KeystoneForwarder.abi.Events["ForwarderRemoved"].ID:
+ return _KeystoneForwarder.ParseForwarderRemoved(log)
+ case _KeystoneForwarder.abi.Events["OwnershipTransferRequested"].ID:
+ return _KeystoneForwarder.ParseOwnershipTransferRequested(log)
+ case _KeystoneForwarder.abi.Events["OwnershipTransferred"].ID:
+ return _KeystoneForwarder.ParseOwnershipTransferred(log)
+ case _KeystoneForwarder.abi.Events["ReportProcessed"].ID:
+ return _KeystoneForwarder.ParseReportProcessed(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (KeystoneForwarderConfigSet) Topic() common.Hash {
+ return common.HexToHash("0x4120bd3b23957dd423555817d55654d4481b438aa15485c21b4180c784f1a455")
+}
+
+func (KeystoneForwarderForwarderAdded) Topic() common.Hash {
+ return common.HexToHash("0x0ea0ce2c048ff45a4a95f2947879de3fb94abec2f152190400cab2d1272a68e7")
+}
+
+func (KeystoneForwarderForwarderRemoved) Topic() common.Hash {
+ return common.HexToHash("0xb96d15bf9258c7b8df062753a6a262864611fc7b060a5ee2e57e79b85f898d38")
+}
+
+func (KeystoneForwarderOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (KeystoneForwarderOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (KeystoneForwarderReportProcessed) Topic() common.Hash {
+ return common.HexToHash("0x3617b009e9785c42daebadb6d3fb553243a4bf586d07ea72d65d80013ce116b5")
+}
+
+func (_KeystoneForwarder *KeystoneForwarder) Address() common.Address {
+ return _KeystoneForwarder.address
+}
+
+type KeystoneForwarderInterface interface {
+ GetTransmissionId(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) ([32]byte, error)
+
+ GetTransmissionInfo(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) (IRouterTransmissionInfo, error)
+
+ GetTransmitter(opts *bind.CallOpts, receiver common.Address, workflowExecutionId [32]byte, reportId [2]byte) (common.Address, error)
+
+ IsForwarder(opts *bind.CallOpts, forwarder common.Address) (bool, error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ AddForwarder(opts *bind.TransactOpts, forwarder common.Address) (*types.Transaction, error)
+
+ ClearConfig(opts *bind.TransactOpts, donId uint32, configVersion uint32) (*types.Transaction, error)
+
+ RemoveForwarder(opts *bind.TransactOpts, forwarder common.Address) (*types.Transaction, error)
+
+ Report(opts *bind.TransactOpts, receiver common.Address, rawReport []byte, reportContext []byte, signatures [][]byte) (*types.Transaction, error)
+
+ Route(opts *bind.TransactOpts, transmissionId [32]byte, transmitter common.Address, receiver common.Address, metadata []byte, validatedReport []byte) (*types.Transaction, error)
+
+ SetConfig(opts *bind.TransactOpts, donId uint32, configVersion uint32, f uint8, signers []common.Address) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ FilterConfigSet(opts *bind.FilterOpts, donId []uint32, configVersion []uint32) (*KeystoneForwarderConfigSetIterator, error)
+
+ WatchConfigSet(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderConfigSet, donId []uint32, configVersion []uint32) (event.Subscription, error)
+
+ ParseConfigSet(log types.Log) (*KeystoneForwarderConfigSet, error)
+
+ FilterForwarderAdded(opts *bind.FilterOpts, forwarder []common.Address) (*KeystoneForwarderForwarderAddedIterator, error)
+
+ WatchForwarderAdded(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderForwarderAdded, forwarder []common.Address) (event.Subscription, error)
+
+ ParseForwarderAdded(log types.Log) (*KeystoneForwarderForwarderAdded, error)
+
+ FilterForwarderRemoved(opts *bind.FilterOpts, forwarder []common.Address) (*KeystoneForwarderForwarderRemovedIterator, error)
+
+ WatchForwarderRemoved(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderForwarderRemoved, forwarder []common.Address) (event.Subscription, error)
+
+ ParseForwarderRemoved(log types.Log) (*KeystoneForwarderForwarderRemoved, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneForwarderOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*KeystoneForwarderOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*KeystoneForwarderOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*KeystoneForwarderOwnershipTransferred, error)
+
+ FilterReportProcessed(opts *bind.FilterOpts, receiver []common.Address, workflowExecutionId [][32]byte, reportId [][2]byte) (*KeystoneForwarderReportProcessedIterator, error)
+
+ WatchReportProcessed(opts *bind.WatchOpts, sink chan<- *KeystoneForwarderReportProcessed, receiver []common.Address, workflowExecutionId [][32]byte, reportId [][2]byte) (event.Subscription, error)
+
+ ParseReportProcessed(log types.Log) (*KeystoneForwarderReportProcessed, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0/ocr3_capability.go b/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0/ocr3_capability.go
new file mode 100644
index 00000000000..b4292c44125
--- /dev/null
+++ b/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0/ocr3_capability.go
@@ -0,0 +1,946 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package ocr3_capability
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+ "strings"
+
+ ethereum "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/event"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
+)
+
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+var OCR3CapabilityMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReportingUnsupported\",\"type\":\"error\"},{\"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\":\"bytes[]\",\"name\":\"signers\",\"type\":\"bytes[]\"},{\"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\":\"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\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"_signers\",\"type\":\"bytes[]\"},{\"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\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6112bc806101576000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638da5cb5b1161005b5780638da5cb5b14610169578063afcb95d714610191578063b1dc65a4146101b1578063f2fde38b146101c457600080fd5b8063181f5a771461008d57806379ba5097146100df5780637f3c87d3146100e957806381ff7048146100fc575b600080fd5b6100c96040518060400160405280601481526020017f4f4352334361706162696c69747920312e302e3000000000000000000000000081525081565b6040516100d69190610b8a565b60405180910390f35b6100e76101d7565b005b6100e76100f7366004610cf8565b6102d9565b61014660015460025463ffffffff74010000000000000000000000000000000000000000830481169378010000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff9485168152939092166020840152908201526060016100d6565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d6565b6040805160018152600060208201819052918101919091526060016100d6565b6100e76101bf366004610dd4565b6108b7565b6100e76101d2366004610edd565b6108e9565b60015473ffffffffffffffffffffffffffffffffffffffff16331461025d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b868560ff8616601f83111561034a576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f746f6f206d616e79207369676e657273000000000000000000000000000000006044820152606401610254565b806000036103b4576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f73697469766500000000000000000000000000006044820152606401610254565b818314610442576040517f89a61989000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f7261636c6520616464726573736573206f7574206f6620726567697374726160448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610254565b61044d816003610f27565b83116104b5576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661756c74792d6f7261636c65206620746f6f206869676800000000000000006044820152606401610254565b6104bd6108fd565b60005b8a8110156107255760008a8a838181106104dc576104dc610f44565b90506020020160208101906104f19190610edd565b73ffffffffffffffffffffffffffffffffffffffff160361056e576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7472616e736d6974746572206d757374206e6f7420626520656d7074790000006044820152606401610254565b3660008d8d8481811061058357610583610f44565b90506020028101906105959190610f73565b9092509050600061ffff82165b8082101561071657806105b6836003610fd8565b111561061e576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e76616c6964207369676e6572207075624b657920656e636f64696e6700006044820152606401610254565b60006008858561062f866002610fd8565b81811061063e5761063e610f44565b919091013560f81c90911b90508585610658866001610fd8565b81811061066757610667610f44565b6106789392013560f81c9050610fd8565b90508181610687856003610fd8565b6106919190610fd8565b11156106f9576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e76616c6964207369676e6572207075624b657920656e636f64696e6700006044820152606401610254565b610704816003610fd8565b61070e9084610fd8565b9250506105a2565b505050508060010190506104c0565b50600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8916179055600180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8116780100000000000000000000000000000000000000000000000063ffffffff43811682029290921780855592048116929182916014916107d491849174010000000000000000000000000000000000000000900416610feb565b92506101000a81548163ffffffff021916908363ffffffff16021790555061081d4630600160149054906101000a900463ffffffff1663ffffffff168f8f8f8f8f8f8f8f610980565b6002600001819055508b8b9050600260010160016101000a81548160ff021916908360ff1602179055507f36257c6e8d535293ad661e377c0baac536289be6707b8a488ac175ddaa4055c881600260000154600160149054906101000a900463ffffffff168f8f8f8f8f8f8f8f6040516108a19b9a9998979695949392919061117e565b60405180910390a1505050505050505050505050565b6040517f0750181900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108f16108fd565b6108fa81610a31565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610254565b565b6000808c8c8c8c8c8c8c8c8c8c8c6040516020016109a89b9a99989796959493929190611218565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0e000000000000000000000000000000000000000000000000000000000000179150509b9a5050505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603610ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610254565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000815180845260005b81811015610b4c57602081850181015186830182015201610b30565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b9d6020830184610b26565b9392505050565b60008083601f840112610bb657600080fd5b50813567ffffffffffffffff811115610bce57600080fd5b6020830191508360208260051b8501011115610be957600080fd5b9250929050565b803560ff81168114610c0157600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610c4657600080fd5b813567ffffffffffffffff80821115610c6157610c61610c06565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610ca757610ca7610c06565b81604052838152866020858801011115610cc057600080fd5b836020870160208301376000602085830101528094505050505092915050565b803567ffffffffffffffff81168114610c0157600080fd5b60008060008060008060008060c0898b031215610d1457600080fd5b883567ffffffffffffffff80821115610d2c57600080fd5b610d388c838d01610ba4565b909a50985060208b0135915080821115610d5157600080fd5b610d5d8c838d01610ba4565b9098509650869150610d7160408c01610bf0565b955060608b0135915080821115610d8757600080fd5b610d938c838d01610c35565b9450610da160808c01610ce0565b935060a08b0135915080821115610db757600080fd5b50610dc48b828c01610c35565b9150509295985092959890939650565b60008060008060008060008060e0898b031215610df057600080fd5b606089018a811115610e0157600080fd5b8998503567ffffffffffffffff80821115610e1b57600080fd5b818b0191508b601f830112610e2f57600080fd5b813581811115610e3e57600080fd5b8c6020828501011115610e5057600080fd5b6020830199508098505060808b0135915080821115610e6e57600080fd5b610e7a8c838d01610ba4565b909750955060a08b0135915080821115610e9357600080fd5b50610ea08b828c01610ba4565b999c989b50969995989497949560c00135949350505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c0157600080fd5b600060208284031215610eef57600080fd5b610b9d82610eb9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610f3e57610f3e610ef8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610fa857600080fd5b83018035915067ffffffffffffffff821115610fc357600080fd5b602001915036819003821315610be957600080fd5b80820180821115610f3e57610f3e610ef8565b63ffffffff81811683821601908082111561100857611008610ef8565b5092915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6000838385526020808601955060208560051b8301018460005b8781101561111d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085840301895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126110d357600080fd5b8701848101903567ffffffffffffffff8111156110ef57600080fd5b8036038213156110fe57600080fd5b61110985828461100f565b9a86019a9450505090830190600101611072565b5090979650505050505050565b8183526000602080850194508260005b858110156111735773ffffffffffffffffffffffffffffffffffffffff61116083610eb9565b168752958201959082019060010161113a565b509495945050505050565b600061012063ffffffff808f1684528d6020850152808d166040850152508060608401526111af8184018b8d611058565b905082810360808401526111c481898b61112a565b905060ff871660a084015282810360c08401526111e18187610b26565b905067ffffffffffffffff851660e08401528281036101008401526112068185610b26565b9e9d5050505050505050505050505050565b60006101208d835273ffffffffffffffffffffffffffffffffffffffff8d16602084015267ffffffffffffffff808d1660408501528160608501526112608285018c8e611058565b91508382036080850152611275828a8c61112a565b915060ff881660a085015283820360c08501526112928288610b26565b90861660e085015283810361010085015290506112068185610b2656fea164736f6c6343000818000a",
+}
+
+var OCR3CapabilityABI = OCR3CapabilityMetaData.ABI
+
+var OCR3CapabilityBin = OCR3CapabilityMetaData.Bin
+
+func DeployOCR3Capability(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *OCR3Capability, error) {
+ parsed, err := OCR3CapabilityMetaData.GetAbi()
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ if parsed == nil {
+ return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+ }
+
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OCR3CapabilityBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &OCR3Capability{address: address, abi: *parsed, OCR3CapabilityCaller: OCR3CapabilityCaller{contract: contract}, OCR3CapabilityTransactor: OCR3CapabilityTransactor{contract: contract}, OCR3CapabilityFilterer: OCR3CapabilityFilterer{contract: contract}}, nil
+}
+
+type OCR3Capability struct {
+ address common.Address
+ abi abi.ABI
+ OCR3CapabilityCaller
+ OCR3CapabilityTransactor
+ OCR3CapabilityFilterer
+}
+
+type OCR3CapabilityCaller struct {
+ contract *bind.BoundContract
+}
+
+type OCR3CapabilityTransactor struct {
+ contract *bind.BoundContract
+}
+
+type OCR3CapabilityFilterer struct {
+ contract *bind.BoundContract
+}
+
+type OCR3CapabilitySession struct {
+ Contract *OCR3Capability
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type OCR3CapabilityCallerSession struct {
+ Contract *OCR3CapabilityCaller
+ CallOpts bind.CallOpts
+}
+
+type OCR3CapabilityTransactorSession struct {
+ Contract *OCR3CapabilityTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type OCR3CapabilityRaw struct {
+ Contract *OCR3Capability
+}
+
+type OCR3CapabilityCallerRaw struct {
+ Contract *OCR3CapabilityCaller
+}
+
+type OCR3CapabilityTransactorRaw struct {
+ Contract *OCR3CapabilityTransactor
+}
+
+func NewOCR3Capability(address common.Address, backend bind.ContractBackend) (*OCR3Capability, error) {
+ abi, err := abi.JSON(strings.NewReader(OCR3CapabilityABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindOCR3Capability(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &OCR3Capability{address: address, abi: abi, OCR3CapabilityCaller: OCR3CapabilityCaller{contract: contract}, OCR3CapabilityTransactor: OCR3CapabilityTransactor{contract: contract}, OCR3CapabilityFilterer: OCR3CapabilityFilterer{contract: contract}}, nil
+}
+
+func NewOCR3CapabilityCaller(address common.Address, caller bind.ContractCaller) (*OCR3CapabilityCaller, error) {
+ contract, err := bindOCR3Capability(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &OCR3CapabilityCaller{contract: contract}, nil
+}
+
+func NewOCR3CapabilityTransactor(address common.Address, transactor bind.ContractTransactor) (*OCR3CapabilityTransactor, error) {
+ contract, err := bindOCR3Capability(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &OCR3CapabilityTransactor{contract: contract}, nil
+}
+
+func NewOCR3CapabilityFilterer(address common.Address, filterer bind.ContractFilterer) (*OCR3CapabilityFilterer, error) {
+ contract, err := bindOCR3Capability(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &OCR3CapabilityFilterer{contract: contract}, nil
+}
+
+func bindOCR3Capability(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := OCR3CapabilityMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_OCR3Capability *OCR3CapabilityRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _OCR3Capability.Contract.OCR3CapabilityCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_OCR3Capability *OCR3CapabilityRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _OCR3Capability.Contract.OCR3CapabilityTransactor.contract.Transfer(opts)
+}
+
+func (_OCR3Capability *OCR3CapabilityRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _OCR3Capability.Contract.OCR3CapabilityTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_OCR3Capability *OCR3CapabilityCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _OCR3Capability.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_OCR3Capability *OCR3CapabilityTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _OCR3Capability.Contract.contract.Transfer(opts)
+}
+
+func (_OCR3Capability *OCR3CapabilityTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _OCR3Capability.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_OCR3Capability *OCR3CapabilityCaller) LatestConfigDetails(opts *bind.CallOpts) (LatestConfigDetails,
+
+ error) {
+ var out []interface{}
+ err := _OCR3Capability.contract.Call(opts, &out, "latestConfigDetails")
+
+ outstruct := new(LatestConfigDetails)
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.ConfigCount = *abi.ConvertType(out[0], new(uint32)).(*uint32)
+ outstruct.BlockNumber = *abi.ConvertType(out[1], new(uint32)).(*uint32)
+ outstruct.ConfigDigest = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte)
+
+ return *outstruct, err
+
+}
+
+func (_OCR3Capability *OCR3CapabilitySession) LatestConfigDetails() (LatestConfigDetails,
+
+ error) {
+ return _OCR3Capability.Contract.LatestConfigDetails(&_OCR3Capability.CallOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityCallerSession) LatestConfigDetails() (LatestConfigDetails,
+
+ error) {
+ return _OCR3Capability.Contract.LatestConfigDetails(&_OCR3Capability.CallOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityCaller) LatestConfigDigestAndEpoch(opts *bind.CallOpts) (LatestConfigDigestAndEpoch,
+
+ error) {
+ var out []interface{}
+ err := _OCR3Capability.contract.Call(opts, &out, "latestConfigDigestAndEpoch")
+
+ outstruct := new(LatestConfigDigestAndEpoch)
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.ScanLogs = *abi.ConvertType(out[0], new(bool)).(*bool)
+ outstruct.ConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte)
+ outstruct.Epoch = *abi.ConvertType(out[2], new(uint32)).(*uint32)
+
+ return *outstruct, err
+
+}
+
+func (_OCR3Capability *OCR3CapabilitySession) LatestConfigDigestAndEpoch() (LatestConfigDigestAndEpoch,
+
+ error) {
+ return _OCR3Capability.Contract.LatestConfigDigestAndEpoch(&_OCR3Capability.CallOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityCallerSession) LatestConfigDigestAndEpoch() (LatestConfigDigestAndEpoch,
+
+ error) {
+ return _OCR3Capability.Contract.LatestConfigDigestAndEpoch(&_OCR3Capability.CallOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _OCR3Capability.contract.Call(opts, &out, "owner")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_OCR3Capability *OCR3CapabilitySession) Owner() (common.Address, error) {
+ return _OCR3Capability.Contract.Owner(&_OCR3Capability.CallOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityCallerSession) Owner() (common.Address, error) {
+ return _OCR3Capability.Contract.Owner(&_OCR3Capability.CallOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityCaller) Transmit(opts *bind.CallOpts, arg0 [3][32]byte, arg1 []byte, arg2 [][32]byte, arg3 [][32]byte, arg4 [32]byte) error {
+ var out []interface{}
+ err := _OCR3Capability.contract.Call(opts, &out, "transmit", arg0, arg1, arg2, arg3, arg4)
+
+ if err != nil {
+ return err
+ }
+
+ return err
+
+}
+
+func (_OCR3Capability *OCR3CapabilitySession) Transmit(arg0 [3][32]byte, arg1 []byte, arg2 [][32]byte, arg3 [][32]byte, arg4 [32]byte) error {
+ return _OCR3Capability.Contract.Transmit(&_OCR3Capability.CallOpts, arg0, arg1, arg2, arg3, arg4)
+}
+
+func (_OCR3Capability *OCR3CapabilityCallerSession) Transmit(arg0 [3][32]byte, arg1 []byte, arg2 [][32]byte, arg3 [][32]byte, arg4 [32]byte) error {
+ return _OCR3Capability.Contract.Transmit(&_OCR3Capability.CallOpts, arg0, arg1, arg2, arg3, arg4)
+}
+
+func (_OCR3Capability *OCR3CapabilityCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _OCR3Capability.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_OCR3Capability *OCR3CapabilitySession) TypeAndVersion() (string, error) {
+ return _OCR3Capability.Contract.TypeAndVersion(&_OCR3Capability.CallOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityCallerSession) TypeAndVersion() (string, error) {
+ return _OCR3Capability.Contract.TypeAndVersion(&_OCR3Capability.CallOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _OCR3Capability.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_OCR3Capability *OCR3CapabilitySession) AcceptOwnership() (*types.Transaction, error) {
+ return _OCR3Capability.Contract.AcceptOwnership(&_OCR3Capability.TransactOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _OCR3Capability.Contract.AcceptOwnership(&_OCR3Capability.TransactOpts)
+}
+
+func (_OCR3Capability *OCR3CapabilityTransactor) SetConfig(opts *bind.TransactOpts, _signers [][]byte, _transmitters []common.Address, _f uint8, _onchainConfig []byte, _offchainConfigVersion uint64, _offchainConfig []byte) (*types.Transaction, error) {
+ return _OCR3Capability.contract.Transact(opts, "setConfig", _signers, _transmitters, _f, _onchainConfig, _offchainConfigVersion, _offchainConfig)
+}
+
+func (_OCR3Capability *OCR3CapabilitySession) SetConfig(_signers [][]byte, _transmitters []common.Address, _f uint8, _onchainConfig []byte, _offchainConfigVersion uint64, _offchainConfig []byte) (*types.Transaction, error) {
+ return _OCR3Capability.Contract.SetConfig(&_OCR3Capability.TransactOpts, _signers, _transmitters, _f, _onchainConfig, _offchainConfigVersion, _offchainConfig)
+}
+
+func (_OCR3Capability *OCR3CapabilityTransactorSession) SetConfig(_signers [][]byte, _transmitters []common.Address, _f uint8, _onchainConfig []byte, _offchainConfigVersion uint64, _offchainConfig []byte) (*types.Transaction, error) {
+ return _OCR3Capability.Contract.SetConfig(&_OCR3Capability.TransactOpts, _signers, _transmitters, _f, _onchainConfig, _offchainConfigVersion, _offchainConfig)
+}
+
+func (_OCR3Capability *OCR3CapabilityTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _OCR3Capability.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_OCR3Capability *OCR3CapabilitySession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _OCR3Capability.Contract.TransferOwnership(&_OCR3Capability.TransactOpts, to)
+}
+
+func (_OCR3Capability *OCR3CapabilityTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _OCR3Capability.Contract.TransferOwnership(&_OCR3Capability.TransactOpts, to)
+}
+
+type OCR3CapabilityConfigSetIterator struct {
+ Event *OCR3CapabilityConfigSet
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *OCR3CapabilityConfigSetIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(OCR3CapabilityConfigSet)
+ 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(OCR3CapabilityConfigSet)
+ 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 *OCR3CapabilityConfigSetIterator) Error() error {
+ return it.fail
+}
+
+func (it *OCR3CapabilityConfigSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type OCR3CapabilityConfigSet struct {
+ PreviousConfigBlockNumber uint32
+ ConfigDigest [32]byte
+ ConfigCount uint64
+ Signers [][]byte
+ Transmitters []common.Address
+ F uint8
+ OnchainConfig []byte
+ OffchainConfigVersion uint64
+ OffchainConfig []byte
+ Raw types.Log
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) FilterConfigSet(opts *bind.FilterOpts) (*OCR3CapabilityConfigSetIterator, error) {
+
+ logs, sub, err := _OCR3Capability.contract.FilterLogs(opts, "ConfigSet")
+ if err != nil {
+ return nil, err
+ }
+ return &OCR3CapabilityConfigSetIterator{contract: _OCR3Capability.contract, event: "ConfigSet", logs: logs, sub: sub}, nil
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *OCR3CapabilityConfigSet) (event.Subscription, error) {
+
+ logs, sub, err := _OCR3Capability.contract.WatchLogs(opts, "ConfigSet")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(OCR3CapabilityConfigSet)
+ if err := _OCR3Capability.contract.UnpackLog(event, "ConfigSet", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) ParseConfigSet(log types.Log) (*OCR3CapabilityConfigSet, error) {
+ event := new(OCR3CapabilityConfigSet)
+ if err := _OCR3Capability.contract.UnpackLog(event, "ConfigSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type OCR3CapabilityOwnershipTransferRequestedIterator struct {
+ Event *OCR3CapabilityOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *OCR3CapabilityOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(OCR3CapabilityOwnershipTransferRequested)
+ 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(OCR3CapabilityOwnershipTransferRequested)
+ 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 *OCR3CapabilityOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *OCR3CapabilityOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type OCR3CapabilityOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OCR3CapabilityOwnershipTransferRequestedIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _OCR3Capability.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &OCR3CapabilityOwnershipTransferRequestedIterator{contract: _OCR3Capability.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *OCR3CapabilityOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _OCR3Capability.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(OCR3CapabilityOwnershipTransferRequested)
+ if err := _OCR3Capability.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) ParseOwnershipTransferRequested(log types.Log) (*OCR3CapabilityOwnershipTransferRequested, error) {
+ event := new(OCR3CapabilityOwnershipTransferRequested)
+ if err := _OCR3Capability.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type OCR3CapabilityOwnershipTransferredIterator struct {
+ Event *OCR3CapabilityOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *OCR3CapabilityOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(OCR3CapabilityOwnershipTransferred)
+ 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(OCR3CapabilityOwnershipTransferred)
+ 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 *OCR3CapabilityOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *OCR3CapabilityOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type OCR3CapabilityOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OCR3CapabilityOwnershipTransferredIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _OCR3Capability.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &OCR3CapabilityOwnershipTransferredIterator{contract: _OCR3Capability.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *OCR3CapabilityOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _OCR3Capability.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(OCR3CapabilityOwnershipTransferred)
+ if err := _OCR3Capability.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) ParseOwnershipTransferred(log types.Log) (*OCR3CapabilityOwnershipTransferred, error) {
+ event := new(OCR3CapabilityOwnershipTransferred)
+ if err := _OCR3Capability.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type OCR3CapabilityTransmittedIterator struct {
+ Event *OCR3CapabilityTransmitted
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *OCR3CapabilityTransmittedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(OCR3CapabilityTransmitted)
+ 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(OCR3CapabilityTransmitted)
+ 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 *OCR3CapabilityTransmittedIterator) Error() error {
+ return it.fail
+}
+
+func (it *OCR3CapabilityTransmittedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type OCR3CapabilityTransmitted struct {
+ ConfigDigest [32]byte
+ Epoch uint32
+ Raw types.Log
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) FilterTransmitted(opts *bind.FilterOpts) (*OCR3CapabilityTransmittedIterator, error) {
+
+ logs, sub, err := _OCR3Capability.contract.FilterLogs(opts, "Transmitted")
+ if err != nil {
+ return nil, err
+ }
+ return &OCR3CapabilityTransmittedIterator{contract: _OCR3Capability.contract, event: "Transmitted", logs: logs, sub: sub}, nil
+}
+
+func (_OCR3Capability *OCR3CapabilityFilterer) WatchTransmitted(opts *bind.WatchOpts, sink chan<- *OCR3CapabilityTransmitted) (event.Subscription, error) {
+
+ logs, sub, err := _OCR3Capability.contract.WatchLogs(opts, "Transmitted")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(OCR3CapabilityTransmitted)
+ if err := _OCR3Capability.contract.UnpackLog(event, "Transmitted", 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 (_OCR3Capability *OCR3CapabilityFilterer) ParseTransmitted(log types.Log) (*OCR3CapabilityTransmitted, error) {
+ event := new(OCR3CapabilityTransmitted)
+ if err := _OCR3Capability.contract.UnpackLog(event, "Transmitted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type LatestConfigDetails struct {
+ ConfigCount uint32
+ BlockNumber uint32
+ ConfigDigest [32]byte
+}
+type LatestConfigDigestAndEpoch struct {
+ ScanLogs bool
+ ConfigDigest [32]byte
+ Epoch uint32
+}
+
+func (_OCR3Capability *OCR3Capability) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _OCR3Capability.abi.Events["ConfigSet"].ID:
+ return _OCR3Capability.ParseConfigSet(log)
+ case _OCR3Capability.abi.Events["OwnershipTransferRequested"].ID:
+ return _OCR3Capability.ParseOwnershipTransferRequested(log)
+ case _OCR3Capability.abi.Events["OwnershipTransferred"].ID:
+ return _OCR3Capability.ParseOwnershipTransferred(log)
+ case _OCR3Capability.abi.Events["Transmitted"].ID:
+ return _OCR3Capability.ParseTransmitted(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (OCR3CapabilityConfigSet) Topic() common.Hash {
+ return common.HexToHash("0x36257c6e8d535293ad661e377c0baac536289be6707b8a488ac175ddaa4055c8")
+}
+
+func (OCR3CapabilityOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (OCR3CapabilityOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (OCR3CapabilityTransmitted) Topic() common.Hash {
+ return common.HexToHash("0xb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62")
+}
+
+func (_OCR3Capability *OCR3Capability) Address() common.Address {
+ return _OCR3Capability.address
+}
+
+type OCR3CapabilityInterface interface {
+ LatestConfigDetails(opts *bind.CallOpts) (LatestConfigDetails,
+
+ error)
+
+ LatestConfigDigestAndEpoch(opts *bind.CallOpts) (LatestConfigDigestAndEpoch,
+
+ error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ Transmit(opts *bind.CallOpts, arg0 [3][32]byte, arg1 []byte, arg2 [][32]byte, arg3 [][32]byte, arg4 [32]byte) error
+
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ SetConfig(opts *bind.TransactOpts, _signers [][]byte, _transmitters []common.Address, _f uint8, _onchainConfig []byte, _offchainConfigVersion uint64, _offchainConfig []byte) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ FilterConfigSet(opts *bind.FilterOpts) (*OCR3CapabilityConfigSetIterator, error)
+
+ WatchConfigSet(opts *bind.WatchOpts, sink chan<- *OCR3CapabilityConfigSet) (event.Subscription, error)
+
+ ParseConfigSet(log types.Log) (*OCR3CapabilityConfigSet, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OCR3CapabilityOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *OCR3CapabilityOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*OCR3CapabilityOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OCR3CapabilityOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *OCR3CapabilityOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*OCR3CapabilityOwnershipTransferred, error)
+
+ FilterTransmitted(opts *bind.FilterOpts) (*OCR3CapabilityTransmittedIterator, error)
+
+ WatchTransmitted(opts *bind.WatchOpts, sink chan<- *OCR3CapabilityTransmitted) (event.Subscription, error)
+
+ ParseTransmitted(log types.Log) (*OCR3CapabilityTransmitted, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/generated/aggregator_v3_interface/aggregator_v3_interface.go b/core/gethwrappers/shared/generated/aggregator_v3_interface/aggregator_v3_interface.go
similarity index 87%
rename from core/gethwrappers/generated/aggregator_v3_interface/aggregator_v3_interface.go
rename to core/gethwrappers/shared/generated/aggregator_v3_interface/aggregator_v3_interface.go
index 5daccaf84b5..7c14c14ed2d 100644
--- a/core/gethwrappers/generated/aggregator_v3_interface/aggregator_v3_interface.go
+++ b/core/gethwrappers/shared/generated/aggregator_v3_interface/aggregator_v3_interface.go
@@ -29,7 +29,7 @@ var (
)
var AggregatorV3InterfaceMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint80\",\"name\":\"_roundId\",\"type\":\"uint80\"}],\"name\":\"getRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"description\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoundData\",\"inputs\":[{\"name\":\"_roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"outputs\":[{\"name\":\"roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"},{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"startedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"answeredInRound\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestRoundData\",\"inputs\":[],\"outputs\":[{\"name\":\"roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"},{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"startedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"answeredInRound\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"}]",
}
var AggregatorV3InterfaceABI = AggregatorV3InterfaceMetaData.ABI
diff --git a/core/gethwrappers/shared/generated/burn_mint_erc20/burn_mint_erc20.go b/core/gethwrappers/shared/generated/burn_mint_erc20/burn_mint_erc20.go
index 9780521156e..22072a87895 100644
--- a/core/gethwrappers/shared/generated/burn_mint_erc20/burn_mint_erc20.go
+++ b/core/gethwrappers/shared/generated/burn_mint_erc20/burn_mint_erc20.go
@@ -31,7 +31,7 @@ var (
)
var BurnMintERC20MetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preMint\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"CCIPAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BURNER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCCIPAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setCCIPAdmin\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"decimals_\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"maxSupply_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"preMint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BURNER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MINTER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCCIPAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantMintAndBurnRoles\",\"inputs\":[{\"name\":\"burnAndMinter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCCIPAdmin\",\"inputs\":[{\"name\":\"newAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CCIPAdminTransferred\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidRecipient\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MaxSupplyExceeded\",\"inputs\":[{\"name\":\"supplyAfterMint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]",
Bin: "0x60c06040523480156200001157600080fd5b5060405162002260380380620022608339810160408190526200003491620002e7565b848460036200004483826200040b565b5060046200005382826200040b565b50505060ff831660805260a0829052600680546001600160a01b03191633179055801562000087576200008733826200009f565b6200009460003362000166565b5050505050620004f9565b6001600160a01b038216620000fa5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200010e9190620004d7565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b5050565b620001728282620001f5565b620001625760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001ac3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b505050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024a57600080fd5b81516001600160401b038082111562000267576200026762000222565b604051601f8301601f19908116603f0116810190828211818310171562000292576200029262000222565b81604052838152602092508683858801011115620002af57600080fd5b600091505b83821015620002d35785820183015181830184015290820190620002b4565b600093810190920192909252949350505050565b600080600080600060a086880312156200030057600080fd5b85516001600160401b03808211156200031857600080fd5b6200032689838a0162000238565b965060208801519150808211156200033d57600080fd5b506200034c8882890162000238565b945050604086015160ff811681146200036457600080fd5b6060870151608090970151959894975095949392505050565b600181811c908216806200039257607f821691505b602082108103620003b357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001f057600081815260208120601f850160051c81016020861015620003e25750805b601f850160051c820191505b818110156200040357828155600101620003ee565b505050505050565b81516001600160401b0381111562000427576200042762000222565b6200043f816200043884546200037d565b84620003b9565b602080601f8311600181146200047757600084156200045e5750858301515b600019600386901b1c1916600185901b17855562000403565b600085815260208120601f198616915b82811015620004a85788860151825594840194600190910190840162000487565b5085821015620004c75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200021c57634e487b7160e01b600052601160045260246000fd5b60805160a051611d336200052d6000396000818161047c015281816108f2015261091c015260006102a40152611d336000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379cc6790116100f9578063a8fa343c11610097578063d539139311610071578063d539139314610440578063d547741f14610467578063d5abeb011461047a578063dd62ed3e146104a057600080fd5b8063a8fa343c14610407578063a9059cbb1461041a578063c630948d1461042d57600080fd5b806395d89b41116100d357806395d89b41146103d15780639dc29fac146103d9578063a217fddf146103ec578063a457c2d7146103f457600080fd5b806379cc6790146103505780638fd6a6ac1461036357806391d148541461038b57600080fd5b80632f2ff15d11610166578063395093511161014057806339509351146102e157806340c10f19146102f457806342966c681461030757806370a082311461031a57600080fd5b80632f2ff15d14610288578063313ce5671461029d57806336568abe146102ce57600080fd5b806318160ddd116101a257806318160ddd1461021957806323b872dd1461022b578063248a9ca31461023e578063282c51f31461026157600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063095ea7b314610206575b600080fd5b6101dc6101d7366004611996565b6104e6565b60405190151581526020015b60405180910390f35b6101f9610663565b6040516101e891906119fc565b6101dc610214366004611a76565b6106f5565b6002545b6040519081526020016101e8565b6101dc610239366004611aa0565b61070d565b61021d61024c366004611adc565b60009081526005602052604090206001015490565b61021d7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61029b610296366004611af5565b610731565b005b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101e8565b61029b6102dc366004611af5565b61075b565b6101dc6102ef366004611a76565b610813565b61029b610302366004611a76565b61085f565b61029b610315366004611adc565b6109a9565b61021d610328366004611b21565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61029b61035e366004611a76565b6109dc565b60065460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e8565b6101dc610399366004611af5565b600091825260056020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101f9610a10565b61029b6103e7366004611a76565b610a1f565b61021d600081565b6101dc610402366004611a76565b610a29565b61029b610415366004611b21565b610afa565b6101dc610428366004611a76565b610b7d565b61029b61043b366004611b21565b610b8b565b61021d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61029b610475366004611af5565b610be2565b7f000000000000000000000000000000000000000000000000000000000000000061021d565b61021d6104ae366004611b3c565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b806105c557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b8061061157507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b8061065d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8fd6a6ac00000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461067290611b66565b80601f016020809104026020016040519081016040528092919081815260200182805461069e90611b66565b80156106eb5780601f106106c0576101008083540402835291602001916106eb565b820191906000526020600020905b8154815290600101906020018083116106ce57829003601f168201915b5050505050905090565b600033610703818585610c07565b5060019392505050565b60003361071b858285610c79565b610726858585610d50565b506001949350505050565b60008281526005602052604090206001015461074c81610dc2565b6107568383610dcc565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610805576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61080f8282610ec0565b5050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190610703908290869061085a908790611be8565b610c07565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661088981610dc2565b3073ffffffffffffffffffffffffffffffffffffffff8416036108f0576040517f17858bbe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016107fc565b7f00000000000000000000000000000000000000000000000000000000000000001580159061095157507f00000000000000000000000000000000000000000000000000000000000000008261094560025490565b61094f9190611be8565b115b1561099f578161096060025490565b61096a9190611be8565b6040517fcbbf11130000000000000000000000000000000000000000000000000000000081526004016107fc91815260200190565b6107568383610f7b565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486109d381610dc2565b61080f8261106e565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610a0681610dc2565b6107568383611078565b60606004805461067290611b66565b61080f82826109dc565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610aed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016107fc565b6107268286868403610c07565b6000610b0581610dc2565b6006805473ffffffffffffffffffffffffffffffffffffffff8481167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d724290600090a3505050565b600033610703818585610d50565b610bb57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682610731565b610bdf7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84882610731565b50565b600082815260056020526040902060010154610bfd81610dc2565b6107568383610ec0565b3073ffffffffffffffffffffffffffffffffffffffff831603610c6e576040517f17858bbe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016107fc565b61075683838361108d565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d4a5781811015610d3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107fc565b610d4a8484848403610c07565b50505050565b3073ffffffffffffffffffffffffffffffffffffffff831603610db7576040517f17858bbe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016107fc565b610756838383611240565b610bdf81336114af565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661080f57600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610e623390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561080f57600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b73ffffffffffffffffffffffffffffffffffffffff8216610ff8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107fc565b806002600082825461100a9190611be8565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b610bdf3382611569565b611083823383610c79565b61080f8282611569565b73ffffffffffffffffffffffffffffffffffffffff831661112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107fc565b73ffffffffffffffffffffffffffffffffffffffff82166111d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166112e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016107fc565b73ffffffffffffffffffffffffffffffffffffffff8216611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016107fc565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d4a565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661080f576114ef8161172d565b6114fa83602061174c565b60405160200161150b929190611bfb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526107fc916004016119fc565b73ffffffffffffffffffffffffffffffffffffffff821661160c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156116c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b606061065d73ffffffffffffffffffffffffffffffffffffffff831660145b6060600061175b836002611c7c565b611766906002611be8565b67ffffffffffffffff81111561177e5761177e611c93565b6040519080825280601f01601f1916602001820160405280156117a8576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117df576117df611cc2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061184257611842611cc2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061187e846002611c7c565b611889906001611be8565b90505b6001811115611926577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106118ca576118ca611cc2565b1a60f81b8282815181106118e0576118e0611cc2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361191f81611cf1565b905061188c565b50831561198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107fc565b9392505050565b6000602082840312156119a857600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461198f57600080fd5b60005b838110156119f35781810151838201526020016119db565b50506000910152565b6020815260008251806020840152611a1b8160408501602087016119d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a7157600080fd5b919050565b60008060408385031215611a8957600080fd5b611a9283611a4d565b946020939093013593505050565b600080600060608486031215611ab557600080fd5b611abe84611a4d565b9250611acc60208501611a4d565b9150604084013590509250925092565b600060208284031215611aee57600080fd5b5035919050565b60008060408385031215611b0857600080fd5b82359150611b1860208401611a4d565b90509250929050565b600060208284031215611b3357600080fd5b61198f82611a4d565b60008060408385031215611b4f57600080fd5b611b5883611a4d565b9150611b1860208401611a4d565b600181811c90821680611b7a57607f821691505b602082108103611bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561065d5761065d611bb9565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611c338160178501602088016119d8565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351611c708160288401602088016119d8565b01602801949350505050565b808202811582820484141761065d5761065d611bb9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081611d0057611d00611bb9565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c6343000813000a",
}
diff --git a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go
index 1d5b1c4ab17..ca4edccfd25 100644
--- a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go
+++ b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go
@@ -31,7 +31,7 @@ var (
)
var BurnMintERC677MetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"decimals_\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"maxSupply_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decreaseApproval\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurners\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinters\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantBurnRole\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"grantMintAndBurnRoles\",\"inputs\":[{\"name\":\"burnAndMinter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"grantMintRole\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseApproval\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBurner\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"revokeBurnRole\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeMintRole\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferAndCall\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnAccessGranted\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnAccessRevoked\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MintAccessGranted\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MintAccessRevoked\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxSupplyExceeded\",\"inputs\":[{\"name\":\"supplyAfterMint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"SenderNotBurner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"SenderNotMinter\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}]",
Bin: "0x60c06040523480156200001157600080fd5b50604051620022dd380380620022dd833981016040819052620000349162000277565b338060008686818160036200004a838262000391565b50600462000059828262000391565b5050506001600160a01b0384169150620000bc90505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ef57620000ef8162000106565b50505060ff90911660805260a052506200045d9050565b336001600160a01b03821603620001605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b3565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001da57600080fd5b81516001600160401b0380821115620001f757620001f7620001b2565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b2565b816040528381526020925086838588010111156200023f57600080fd5b600091505b8382101562000263578582018301518183018401529082019062000244565b600093810190920192909252949350505050565b600080600080608085870312156200028e57600080fd5b84516001600160401b0380821115620002a657600080fd5b620002b488838901620001c8565b95506020870151915080821115620002cb57600080fd5b50620002da87828801620001c8565b935050604085015160ff81168114620002f257600080fd5b6060959095015193969295505050565b600181811c908216806200031757607f821691505b6020821081036200033857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038c57600081815260208120601f850160051c81016020861015620003675750805b601f850160051c820191505b81811015620003885782815560010162000373565b5050505b505050565b81516001600160401b03811115620003ad57620003ad620001b2565b620003c581620003be845462000302565b846200033e565b602080601f831160018114620003fd5760008415620003e45750858301515b600019600386901b1c1916600185901b17855562000388565b600085815260208120601f198616915b828110156200042e578886015182559484019460019091019084016200040d565b50858210156200044d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200049160003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a",
}
diff --git a/core/gethwrappers/generated/chain_reader_tester/chain_reader_tester.go b/core/gethwrappers/shared/generated/chain_reader_tester/chain_reader_tester.go
similarity index 80%
rename from core/gethwrappers/generated/chain_reader_tester/chain_reader_tester.go
rename to core/gethwrappers/shared/generated/chain_reader_tester/chain_reader_tester.go
index 407858373c9..b49f14c0a5c 100644
--- a/core/gethwrappers/generated/chain_reader_tester/chain_reader_tester.go
+++ b/core/gethwrappers/shared/generated/chain_reader_tester/chain_reader_tester.go
@@ -68,7 +68,7 @@ type TestStruct struct {
}
var ChainReaderTesterMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"StaticBytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int32\",\"name\":\"field\",\"type\":\"int32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"oracleId\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"string\",\"name\":\"S\",\"type\":\"string\"}],\"internalType\":\"structInnerDynamicTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"indexed\":false,\"internalType\":\"structMidLevelDynamicTestStruct\",\"name\":\"nestedDynamicStruct\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"address\",\"name\":\"A\",\"type\":\"address\"}],\"internalType\":\"structInnerStaticTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"indexed\":false,\"internalType\":\"structMidLevelStaticTestStruct\",\"name\":\"nestedStaticStruct\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint8[32]\",\"name\":\"oracleIds\",\"type\":\"uint8[32]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"Account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"AccountStr\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structAccountStruct\",\"name\":\"accountStruct\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"Accounts\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"differentField\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"int192\",\"name\":\"bigField\",\"type\":\"int192\"}],\"name\":\"Triggered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"fieldHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"field\",\"type\":\"string\"}],\"name\":\"TriggeredEventWithDynamicTopic\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int32\",\"name\":\"field1\",\"type\":\"int32\"},{\"indexed\":true,\"internalType\":\"int32\",\"name\":\"field2\",\"type\":\"int32\"},{\"indexed\":true,\"internalType\":\"int32\",\"name\":\"field3\",\"type\":\"int32\"}],\"name\":\"TriggeredWithFourTopics\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"field1\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint8[32]\",\"name\":\"field2\",\"type\":\"uint8[32]\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"field3\",\"type\":\"bytes32\"}],\"name\":\"TriggeredWithFourTopicsWithHashed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"field\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"differentField\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"oracleId\",\"type\":\"uint8\"},{\"internalType\":\"uint8[32]\",\"name\":\"oracleIds\",\"type\":\"uint8[32]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"Account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"AccountStr\",\"type\":\"address\"}],\"internalType\":\"structAccountStruct\",\"name\":\"accountStruct\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"int192\",\"name\":\"bigField\",\"type\":\"int192\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"string\",\"name\":\"S\",\"type\":\"string\"}],\"internalType\":\"structInnerDynamicTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelDynamicTestStruct\",\"name\":\"nestedDynamicStruct\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"address\",\"name\":\"A\",\"type\":\"address\"}],\"internalType\":\"structInnerStaticTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelStaticTestStruct\",\"name\":\"nestedStaticStruct\",\"type\":\"tuple\"}],\"name\":\"addTestStruct\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAlterablePrimitiveValue\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDifferentPrimitiveValue\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"getElementAtIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"int32\",\"name\":\"Field\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"DifferentField\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"OracleId\",\"type\":\"uint8\"},{\"internalType\":\"uint8[32]\",\"name\":\"OracleIds\",\"type\":\"uint8[32]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"Account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"AccountStr\",\"type\":\"address\"}],\"internalType\":\"structAccountStruct\",\"name\":\"AccountStruct\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"Accounts\",\"type\":\"address[]\"},{\"internalType\":\"int192\",\"name\":\"BigField\",\"type\":\"int192\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"string\",\"name\":\"S\",\"type\":\"string\"}],\"internalType\":\"structInnerDynamicTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelDynamicTestStruct\",\"name\":\"NestedDynamicStruct\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"address\",\"name\":\"A\",\"type\":\"address\"}],\"internalType\":\"structInnerStaticTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelStaticTestStruct\",\"name\":\"NestedStaticStruct\",\"type\":\"tuple\"}],\"internalType\":\"structTestStruct\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPrimitiveValue\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSliceValue\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"field\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"differentField\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"oracleId\",\"type\":\"uint8\"},{\"internalType\":\"uint8[32]\",\"name\":\"oracleIds\",\"type\":\"uint8[32]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"Account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"AccountStr\",\"type\":\"address\"}],\"internalType\":\"structAccountStruct\",\"name\":\"accountStruct\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"int192\",\"name\":\"bigField\",\"type\":\"int192\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"string\",\"name\":\"S\",\"type\":\"string\"}],\"internalType\":\"structInnerDynamicTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelDynamicTestStruct\",\"name\":\"nestedDynamicStruct\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"address\",\"name\":\"A\",\"type\":\"address\"}],\"internalType\":\"structInnerStaticTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelStaticTestStruct\",\"name\":\"nestedStaticStruct\",\"type\":\"tuple\"}],\"name\":\"returnSeen\",\"outputs\":[{\"components\":[{\"internalType\":\"int32\",\"name\":\"Field\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"DifferentField\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"OracleId\",\"type\":\"uint8\"},{\"internalType\":\"uint8[32]\",\"name\":\"OracleIds\",\"type\":\"uint8[32]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"Account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"AccountStr\",\"type\":\"address\"}],\"internalType\":\"structAccountStruct\",\"name\":\"AccountStruct\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"Accounts\",\"type\":\"address[]\"},{\"internalType\":\"int192\",\"name\":\"BigField\",\"type\":\"int192\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"string\",\"name\":\"S\",\"type\":\"string\"}],\"internalType\":\"structInnerDynamicTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelDynamicTestStruct\",\"name\":\"NestedDynamicStruct\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"address\",\"name\":\"A\",\"type\":\"address\"}],\"internalType\":\"structInnerStaticTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelStaticTestStruct\",\"name\":\"NestedStaticStruct\",\"type\":\"tuple\"}],\"internalType\":\"structTestStruct\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"value\",\"type\":\"uint64\"}],\"name\":\"setAlterablePrimitiveValue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"field\",\"type\":\"int32\"},{\"internalType\":\"uint8\",\"name\":\"oracleId\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"string\",\"name\":\"S\",\"type\":\"string\"}],\"internalType\":\"structInnerDynamicTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelDynamicTestStruct\",\"name\":\"nestedDynamicStruct\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes2\",\"name\":\"FixedBytes\",\"type\":\"bytes2\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"IntVal\",\"type\":\"int64\"},{\"internalType\":\"address\",\"name\":\"A\",\"type\":\"address\"}],\"internalType\":\"structInnerStaticTestStruct\",\"name\":\"Inner\",\"type\":\"tuple\"}],\"internalType\":\"structMidLevelStaticTestStruct\",\"name\":\"nestedStaticStruct\",\"type\":\"tuple\"},{\"internalType\":\"uint8[32]\",\"name\":\"oracleIds\",\"type\":\"uint8[32]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"Account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"AccountStr\",\"type\":\"address\"}],\"internalType\":\"structAccountStruct\",\"name\":\"accountStruct\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"string\",\"name\":\"differentField\",\"type\":\"string\"},{\"internalType\":\"int192\",\"name\":\"bigField\",\"type\":\"int192\"}],\"name\":\"triggerEvent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"field\",\"type\":\"string\"}],\"name\":\"triggerEventWithDynamicTopic\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"val1\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"val2\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"val3\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"val4\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"val5\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"val6\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"val7\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"raw\",\"type\":\"bytes\"}],\"name\":\"triggerStaticBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"field1\",\"type\":\"int32\"},{\"internalType\":\"int32\",\"name\":\"field2\",\"type\":\"int32\"},{\"internalType\":\"int32\",\"name\":\"field3\",\"type\":\"int32\"}],\"name\":\"triggerWithFourTopics\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"field1\",\"type\":\"string\"},{\"internalType\":\"uint8[32]\",\"name\":\"field2\",\"type\":\"uint8[32]\"},{\"internalType\":\"bytes32\",\"name\":\"field3\",\"type\":\"bytes32\"}],\"name\":\"triggerWithFourTopicsWithHashed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addTestStruct\",\"inputs\":[{\"name\":\"field\",\"type\":\"int32\",\"internalType\":\"int32\"},{\"name\":\"differentField\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"oracleId\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"oracleIds\",\"type\":\"uint8[32]\",\"internalType\":\"uint8[32]\"},{\"name\":\"accountStruct\",\"type\":\"tuple\",\"internalType\":\"structAccountStruct\",\"components\":[{\"name\":\"Account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"AccountStr\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"accounts\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"bigField\",\"type\":\"int192\",\"internalType\":\"int192\"},{\"name\":\"nestedDynamicStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelDynamicTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerDynamicTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"S\",\"type\":\"string\",\"internalType\":\"string\"}]}]},{\"name\":\"nestedStaticStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelStaticTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerStaticTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"A\",\"type\":\"address\",\"internalType\":\"address\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAlterablePrimitiveValue\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDifferentPrimitiveValue\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getElementAtIndex\",\"inputs\":[{\"name\":\"i\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTestStruct\",\"components\":[{\"name\":\"Field\",\"type\":\"int32\",\"internalType\":\"int32\"},{\"name\":\"DifferentField\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"OracleId\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"OracleIds\",\"type\":\"uint8[32]\",\"internalType\":\"uint8[32]\"},{\"name\":\"AccountStruct\",\"type\":\"tuple\",\"internalType\":\"structAccountStruct\",\"components\":[{\"name\":\"Account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"AccountStr\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"Accounts\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"BigField\",\"type\":\"int192\",\"internalType\":\"int192\"},{\"name\":\"NestedDynamicStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelDynamicTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerDynamicTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"S\",\"type\":\"string\",\"internalType\":\"string\"}]}]},{\"name\":\"NestedStaticStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelStaticTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerStaticTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"A\",\"type\":\"address\",\"internalType\":\"address\"}]}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPrimitiveValue\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getSliceValue\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"returnSeen\",\"inputs\":[{\"name\":\"field\",\"type\":\"int32\",\"internalType\":\"int32\"},{\"name\":\"differentField\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"oracleId\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"oracleIds\",\"type\":\"uint8[32]\",\"internalType\":\"uint8[32]\"},{\"name\":\"accountStruct\",\"type\":\"tuple\",\"internalType\":\"structAccountStruct\",\"components\":[{\"name\":\"Account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"AccountStr\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"accounts\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"bigField\",\"type\":\"int192\",\"internalType\":\"int192\"},{\"name\":\"nestedDynamicStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelDynamicTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerDynamicTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"S\",\"type\":\"string\",\"internalType\":\"string\"}]}]},{\"name\":\"nestedStaticStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelStaticTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerStaticTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"A\",\"type\":\"address\",\"internalType\":\"address\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTestStruct\",\"components\":[{\"name\":\"Field\",\"type\":\"int32\",\"internalType\":\"int32\"},{\"name\":\"DifferentField\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"OracleId\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"OracleIds\",\"type\":\"uint8[32]\",\"internalType\":\"uint8[32]\"},{\"name\":\"AccountStruct\",\"type\":\"tuple\",\"internalType\":\"structAccountStruct\",\"components\":[{\"name\":\"Account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"AccountStr\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"Accounts\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"BigField\",\"type\":\"int192\",\"internalType\":\"int192\"},{\"name\":\"NestedDynamicStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelDynamicTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerDynamicTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"S\",\"type\":\"string\",\"internalType\":\"string\"}]}]},{\"name\":\"NestedStaticStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelStaticTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerStaticTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"A\",\"type\":\"address\",\"internalType\":\"address\"}]}]}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"setAlterablePrimitiveValue\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"triggerEvent\",\"inputs\":[{\"name\":\"field\",\"type\":\"int32\",\"internalType\":\"int32\"},{\"name\":\"oracleId\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"nestedDynamicStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelDynamicTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerDynamicTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"S\",\"type\":\"string\",\"internalType\":\"string\"}]}]},{\"name\":\"nestedStaticStruct\",\"type\":\"tuple\",\"internalType\":\"structMidLevelStaticTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerStaticTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"A\",\"type\":\"address\",\"internalType\":\"address\"}]}]},{\"name\":\"oracleIds\",\"type\":\"uint8[32]\",\"internalType\":\"uint8[32]\"},{\"name\":\"accountStruct\",\"type\":\"tuple\",\"internalType\":\"structAccountStruct\",\"components\":[{\"name\":\"Account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"AccountStr\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"accounts\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"differentField\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"bigField\",\"type\":\"int192\",\"internalType\":\"int192\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"triggerEventWithDynamicTopic\",\"inputs\":[{\"name\":\"field\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"triggerStaticBytes\",\"inputs\":[{\"name\":\"val1\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"val2\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"val3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"val4\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"val5\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"val6\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"val7\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"raw\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"triggerWithFourTopics\",\"inputs\":[{\"name\":\"field1\",\"type\":\"int32\",\"internalType\":\"int32\"},{\"name\":\"field2\",\"type\":\"int32\",\"internalType\":\"int32\"},{\"name\":\"field3\",\"type\":\"int32\",\"internalType\":\"int32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"triggerWithFourTopicsWithHashed\",\"inputs\":[{\"name\":\"field1\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"field2\",\"type\":\"uint8[32]\",\"internalType\":\"uint8[32]\"},{\"name\":\"field3\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"StaticBytes\",\"inputs\":[{\"name\":\"message\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Triggered\",\"inputs\":[{\"name\":\"field\",\"type\":\"int32\",\"indexed\":true,\"internalType\":\"int32\"},{\"name\":\"oracleId\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"nestedDynamicStruct\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structMidLevelDynamicTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerDynamicTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"S\",\"type\":\"string\",\"internalType\":\"string\"}]}]},{\"name\":\"nestedStaticStruct\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structMidLevelStaticTestStruct\",\"components\":[{\"name\":\"FixedBytes\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"Inner\",\"type\":\"tuple\",\"internalType\":\"structInnerStaticTestStruct\",\"components\":[{\"name\":\"IntVal\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"A\",\"type\":\"address\",\"internalType\":\"address\"}]}]},{\"name\":\"oracleIds\",\"type\":\"uint8[32]\",\"indexed\":false,\"internalType\":\"uint8[32]\"},{\"name\":\"accountStruct\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structAccountStruct\",\"components\":[{\"name\":\"Account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"AccountStr\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"Accounts\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"differentField\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"bigField\",\"type\":\"int192\",\"indexed\":false,\"internalType\":\"int192\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TriggeredEventWithDynamicTopic\",\"inputs\":[{\"name\":\"fieldHash\",\"type\":\"string\",\"indexed\":true,\"internalType\":\"string\"},{\"name\":\"field\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TriggeredWithFourTopics\",\"inputs\":[{\"name\":\"field1\",\"type\":\"int32\",\"indexed\":true,\"internalType\":\"int32\"},{\"name\":\"field2\",\"type\":\"int32\",\"indexed\":true,\"internalType\":\"int32\"},{\"name\":\"field3\",\"type\":\"int32\",\"indexed\":true,\"internalType\":\"int32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TriggeredWithFourTopicsWithHashed\",\"inputs\":[{\"name\":\"field1\",\"type\":\"string\",\"indexed\":true,\"internalType\":\"string\"},{\"name\":\"field2\",\"type\":\"uint8[32]\",\"indexed\":true,\"internalType\":\"uint8[32]\"},{\"name\":\"field3\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false}]",
Bin: "0x608060405234801561001057600080fd5b50600180548082018255600082905260048082047fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6908101805460086003958616810261010090810a8088026001600160401b0391820219909416939093179093558654808801909755848704909301805496909516909202900a91820291021990921691909117905561209a806100a96000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80636cf01bfc1161008c578063ab5e0b3811610066578063ab5e0b38146101df578063dbfd7332146101fc578063ef4e1ced1461020f578063fbe9fbf61461021657600080fd5b80636cf01bfc146101a657806380d77303146101b9578063a90e1998146101cc57600080fd5b8063660b5962116100bd578063660b596214610135578063679004a4146101485780636c9a43b61461015d57600080fd5b80632c45576f146100e45780633272b66c1461010d57806351f3f54d14610122575b600080fd5b6100f76100f2366004610f24565b610228565b604051610104919061108d565b60405180910390f35b61012061011b366004611240565b61059b565b005b61012061013036600461139f565b6105f0565b61012061014336600461150c565b610664565b610150610a33565b6040516101049190611612565b61012061016b366004611660565b600280547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6100f76101b436600461150c565b610abf565b6101206101c7366004611682565b610bd6565b6101206101da366004611795565b610c30565b6107c65b60405167ffffffffffffffff9091168152602001610104565b61012061020a36600461184a565b610c8a565b60036101e3565b60025467ffffffffffffffff166101e3565b610230610cc7565b600061023d60018461188d565b8154811061024d5761024d6118c7565b6000918252602091829020604080516101208101909152600d90920201805460030b82526001810180549293919291840191610288906118f6565b80601f01602080910402602001604051908101604052809291908181526020018280546102b4906118f6565b80156103015780601f106102d657610100808354040283529160200191610301565b820191906000526020600020905b8154815290600101906020018083116102e457829003601f168201915b5050509183525050600282015460ff166020808301919091526040805161040081018083529190930192916003850191826000855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116103365790505050509183525050604080518082018252600484015473ffffffffffffffffffffffffffffffffffffffff90811682526005850154166020828101919091528084019190915260068401805483518184028101840185528181529390940193909183018282801561040b57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116103e0575b505050918352505060078281015460170b60208084019190915260408051808201825260088601805460f01b7fffff0000000000000000000000000000000000000000000000000000000000001682528251808401845260098801805490960b8152600a880180549490970196929591948681019491939084019161048f906118f6565b80601f01602080910402602001604051908101604052809291908181526020018280546104bb906118f6565b80156105085780601f106104dd57610100808354040283529160200191610508565b820191906000526020600020905b8154815290600101906020018083116104eb57829003601f168201915b505050919092525050509052508152604080518082018252600b84015460f01b7fffff0000000000000000000000000000000000000000000000000000000000001681528151808301909252600c90930154600781900b825268010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660208083019190915280840191909152015292915050565b81816040516105ab929190611943565b60405180910390207f3d969732b1bbbb9f1d7eb9f3f14e4cb50a74d950b3ef916a397b85dfbab93c6783836040516105e492919061199c565b60405180910390a25050565b600088888888888888886040516020016106119897969594939291906119b0565b60405160208183030381529060405290507f1e40927ec0bdc7319f09a53452590433ec395dec3b70b982eba779c740685bfe816040516106519190611a56565b60405180910390a1505050505050505050565b60006040518061012001604052808d60030b81526020018c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060ff8b166020808301919091526040805161040081810183529190930192918c918390839080828437600092019190915250505081526020016106fc368a90038a018a611a8d565b8152602001878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250505090825250601786900b602082015260400161074d85611b0c565b815260200161076136859003850185611baa565b905281546001808201845560009384526020938490208351600d9093020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9093169290921782559282015191929091908201906107c79082611c89565b5060408201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560608201516108159060038301906020610d90565b506080820151805160048301805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560209283015160058501805491909316911617905560a0830151805161088f9260068501920190610e23565b5060c08201516007820180547fffffffffffffffff0000000000000000000000000000000000000000000000001677ffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905560e082015180516008830180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660f09290921c91909117815560208083015180516009860180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff90921691909117815591810151909190600a8601906109729082611c89565b5050505061010092909201518051600b8301805460f09290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169190911790556020908101518051600c9093018054919092015173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090911667ffffffffffffffff90931692909217919091179055505050505050505050505050565b60606001805480602002602001604051908101604052809291908181526020018280548015610ab557602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020019060080190602082600701049283019260010382029150808411610a705790505b5050505050905090565b610ac7610cc7565b6040518061012001604052808d60030b81526020018c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060ff8b166020808301919091526040805161040081810183529190930192918c91839083908082843760009201919091525050508152602001610b5d368a90038a018a611a8d565b8152602001878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250505090825250601786900b6020820152604001610bae85611b0c565b8152602001610bc236859003850185611baa565b905290505b9b9a5050505050505050505050565b8a60030b7f6a1c0d59d12839c1d2bd0a8cd5e73032dc60569f7f448b99b572b61c442b8add8b8b8b8b8b8b8b8b8b8b604051610c1b9a99989796959493929190611ec4565b60405180910390a25050505050505050505050565b8082604051610c3f9190612035565b604051809103902084604051610c559190612071565b604051908190038120907f7220e4dbe4e9d0ed5f71acd022bc89c26748ac6784f2c548bc17bb8e52af34b090600090a4505050565b8060030b8260030b8460030b7f91c80dc390f3d041b3a04b0099b19634499541ea26972250986ee4b24a12fac560405160405180910390a4505050565b6040805161012081018252600080825260606020830181905292820152908101610cef610e9d565b8152602001610d3d6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b81526060602082018190526000604083015201610d58610ebc565b8152602001610d8b6040805180820182526000808252825180840190935280835260208381019190915290919082015290565b905290565b600183019183908215610e135791602002820160005b83821115610de457835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302610da6565b8015610e115782816101000a81549060ff0219169055600101602081600001049283019260010302610de4565b505b50610e1f929150610f0f565b5090565b828054828255906000526020600020908101928215610e13579160200282015b82811115610e1357825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190610e43565b6040518061040001604052806020906020820280368337509192915050565b604051806040016040528060007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001610d8b6040518060400160405280600060070b8152602001606081525090565b5b80821115610e1f5760008155600101610f10565b600060208284031215610f3657600080fd5b5035919050565b60005b83811015610f58578181015183820152602001610f40565b50506000910152565b60008151808452610f79816020860160208601610f3d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8060005b6020808210610fbe5750610fd5565b825160ff1685529384019390910190600101610faf565b50505050565b600081518084526020808501945080840160005b8381101561102157815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610fef565b509495945050505050565b7fffff00000000000000000000000000000000000000000000000000000000000081511682526000602082015160406020850152805160070b604085015260208101519050604060608501526110856080850182610f61565b949350505050565b602081526110a160208201835160030b9052565b6000602083015161056060408401526110be610580840182610f61565b905060408401516110d4606085018260ff169052565b5060608401516110e76080850182610fab565b506080840151805173ffffffffffffffffffffffffffffffffffffffff9081166104808601526020820151166104a08501525060a08401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080858403016104c08601526111558383610fdb565b925060c0860151915061116e6104e086018360170b9052565b60e0860151915080858403016105008601525061118b828261102c565b61010086015180517fffff00000000000000000000000000000000000000000000000000000000000016610520870152602080820151805160070b610540890152015173ffffffffffffffffffffffffffffffffffffffff166105608701529092509050509392505050565b60008083601f84011261120957600080fd5b50813567ffffffffffffffff81111561122157600080fd5b60208301915083602082850101111561123957600080fd5b9250929050565b6000806020838503121561125357600080fd5b823567ffffffffffffffff81111561126a57600080fd5b611276858286016111f7565b90969095509350505050565b803563ffffffff8116811461129657600080fd5b919050565b803567ffffffffffffffff8116811461129657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611305576113056112b3565b60405290565b600067ffffffffffffffff80841115611326576113266112b3565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561136c5761136c6112b3565b8160405280935085815286868601111561138557600080fd5b858560208301376000602087830101525050509392505050565b600080600080600080600080610100898b0312156113bc57600080fd5b6113c589611282565b97506113d360208a01611282565b96506113e160408a01611282565b95506113ef60608a0161129b565b94506080890135935060a0890135925060c0890135915060e089013567ffffffffffffffff81111561142057600080fd5b8901601f81018b1361143157600080fd5b6114408b82356020840161130b565b9150509295985092959890939650565b8035600381900b811461129657600080fd5b803560ff8116811461129657600080fd5b80610400810183101561148557600080fd5b92915050565b60006040828403121561149d57600080fd5b50919050565b60008083601f8401126114b557600080fd5b50813567ffffffffffffffff8111156114cd57600080fd5b6020830191508360208260051b850101111561123957600080fd5b8035601781900b811461129657600080fd5b60006060828403121561149d57600080fd5b60008060008060008060008060008060006105608c8e03121561152e57600080fd5b6115378c611450565b9a5067ffffffffffffffff8060208e0135111561155357600080fd5b6115638e60208f01358f016111f7565b909b50995061157460408e01611462565b98506115838e60608f01611473565b97506115938e6104608f0161148b565b9650806104a08e013511156115a757600080fd5b6115b88e6104a08f01358f016114a3565b90965094506115ca6104c08e016114e8565b9350806104e08e013511156115de57600080fd5b506115f08d6104e08e01358e0161148b565b91506116008d6105008e016114fa565b90509295989b509295989b9093969950565b6020808252825182820181905260009190848201906040850190845b8181101561165457835167ffffffffffffffff168352928401929184019160010161162e565b50909695505050505050565b60006020828403121561167257600080fd5b61167b8261129b565b9392505050565b60008060008060008060008060008060006105608c8e0312156116a457600080fd5b6116ad8c611450565b9a506116bb60208d01611462565b995067ffffffffffffffff8060408e013511156116d757600080fd5b6116e78e60408f01358f0161148b565b99506116f68e60608f016114fa565b98506117058e60c08f01611473565b97506117158e6104c08f0161148b565b9650806105008e0135111561172957600080fd5b61173a8e6105008f01358f016114a3565b90965094506105208d013581101561175157600080fd5b506117638d6105208e01358e016111f7565b90935091506116006105408d016114e8565b600082601f83011261178657600080fd5b61167b8383356020850161130b565b600080600061044084860312156117ab57600080fd5b833567ffffffffffffffff808211156117c357600080fd5b6117cf87838801611775565b94506020915086603f8701126117e457600080fd5b60405161040081018181108382111715611800576118006112b3565b60405290508061042087018881111561181857600080fd5b8388015b8181101561183a5761182d81611462565b845292840192840161181c565b5095989097509435955050505050565b60008060006060848603121561185f57600080fd5b61186884611450565b925061187660208501611450565b915061188460408501611450565b90509250925092565b81810381811115611485577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061190a57607f821691505b60208210810361149d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000611085602083018486611953565b60007fffffffff00000000000000000000000000000000000000000000000000000000808b60e01b168352808a60e01b166004840152808960e01b166008840152507fffffffffffffffff0000000000000000000000000000000000000000000000008760c01b16600c8301528560148301528460348301528360548301528251611a42816074850160208701610f3d565b919091016074019998505050505050505050565b60208152600061167b6020830184610f61565b803573ffffffffffffffffffffffffffffffffffffffff8116811461129657600080fd5b600060408284031215611a9f57600080fd5b611aa76112e2565b611ab083611a69565b8152611abe60208401611a69565b60208201529392505050565b80357fffff0000000000000000000000000000000000000000000000000000000000008116811461129657600080fd5b8035600781900b811461129657600080fd5b600060408236031215611b1e57600080fd5b611b266112e2565b611b2f83611aca565b8152602083013567ffffffffffffffff80821115611b4c57600080fd5b818501915060408236031215611b6157600080fd5b611b696112e2565b611b7283611afa565b8152602083013582811115611b8657600080fd5b611b9236828601611775565b60208301525080602085015250505080915050919050565b60008183036060811215611bbd57600080fd5b611bc56112e2565b611bce84611aca565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083011215611c0057600080fd5b611c086112e2565b9150611c1660208501611afa565b8252611c2460408501611a69565b6020830152816020820152809250505092915050565b601f821115611c8457600081815260208120601f850160051c81016020861015611c615750805b601f850160051c820191505b81811015611c8057828155600101611c6d565b5050505b505050565b815167ffffffffffffffff811115611ca357611ca36112b3565b611cb781611cb184546118f6565b84611c3a565b602080601f831160018114611d0a5760008415611cd45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611c80565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611d5757888601518255948401946001909101908401611d38565b5085821015611d9357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7fffff000000000000000000000000000000000000000000000000000000000000611dcd82611aca565b168252611ddc60208201611afa565b60070b602083015273ffffffffffffffffffffffffffffffffffffffff611e0560408301611a69565b1660408301525050565b8060005b6020808210611e225750610fd5565b60ff611e2d84611462565b168552938401939190910190600101611e13565b73ffffffffffffffffffffffffffffffffffffffff80611e6083611a69565b16835280611e7060208401611a69565b166020840152505050565b8183526000602080850194508260005b858110156110215773ffffffffffffffffffffffffffffffffffffffff611eb183611a69565b1687529582019590820190600101611e8b565b600061054060ff8d1683528060208401527fffff000000000000000000000000000000000000000000000000000000000000611eff8d611aca565b16818401525060208b01357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18c3603018112611f3a57600080fd5b60406105608401528b01611f4d81611afa565b60070b61058084015260208101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112611f8b57600080fd5b0160208101903567ffffffffffffffff811115611fa757600080fd5b803603821315611fb657600080fd5b60406105a0850152611fcd6105c085018284611953565b915050611fdd604084018c611da3565b611fea60a084018b611e0f565b611ff86104a084018a611e41565b8281036104e084015261200c81888a611e7b565b9050828103610500840152612022818688611953565b915050610bc761052083018460170b9052565b60008183825b602080821061204a5750612061565b825160ff168452928301929091019060010161203b565b5050506104008201905092915050565b60008251612083818460208701610f3d565b919091019291505056fea164736f6c6343000813000a",
}
diff --git a/core/gethwrappers/shared/generated/erc20/erc20.go b/core/gethwrappers/shared/generated/erc20/erc20.go
index 9fd43134b6d..10659ec6486 100644
--- a/core/gethwrappers/shared/generated/erc20/erc20.go
+++ b/core/gethwrappers/shared/generated/erc20/erc20.go
@@ -31,7 +31,7 @@ var (
)
var ERC20MetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"name_\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"symbol_\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
Bin: "0x60806040523480156200001157600080fd5b5060405162000de638038062000de683398101604081905262000034916200011f565b600362000042838262000218565b50600462000051828262000218565b505050620002e4565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200008257600080fd5b81516001600160401b03808211156200009f576200009f6200005a565b604051601f8301601f19908116603f01168101908282118183101715620000ca57620000ca6200005a565b81604052838152602092508683858801011115620000e757600080fd5b600091505b838210156200010b5785820183015181830184015290820190620000ec565b600093810190920192909252949350505050565b600080604083850312156200013357600080fd5b82516001600160401b03808211156200014b57600080fd5b620001598683870162000070565b935060208501519150808211156200017057600080fd5b506200017f8582860162000070565b9150509250929050565b600181811c908216806200019e57607f821691505b602082108103620001bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021357600081815260208120601f850160051c81016020861015620001ee5750805b601f850160051c820191505b818110156200020f57828155600101620001fa565b5050505b505050565b81516001600160401b038111156200023457620002346200005a565b6200024c8162000245845462000189565b84620001c5565b602080601f8311600181146200028457600084156200026b5750858301515b600019600386901b1c1916600185901b1785556200020f565b600085815260208120601f198616915b82811015620002b55788860151825594840194600190910190840162000294565b5085821015620002d45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610af280620002f46000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80633950935111610081578063a457c2d71161005b578063a457c2d714610194578063a9059cbb146101a7578063dd62ed3e146101ba57600080fd5b8063395093511461014357806370a082311461015657806395d89b411461018c57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610200565b6040516100e39190610908565b60405180910390f35b6100ff6100fa36600461099d565b610292565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f3660046109c7565b6102ac565b604051601281526020016100e3565b6100ff61015136600461099d565b6102d0565b610113610164366004610a03565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d661031c565b6100ff6101a236600461099d565b61032b565b6100ff6101b536600461099d565b610401565b6101136101c8366004610a25565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461020f90610a58565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610a58565b80156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b5050505050905090565b6000336102a081858561040f565b60019150505b92915050565b6000336102ba8582856105c2565b6102c5858585610699565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906102a09082908690610317908790610aab565b61040f565b60606004805461020f90610a58565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102c5828686840361040f565b6000336102a0818585610699565b73ffffffffffffffffffffffffffffffffffffffff83166104b1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016103eb565b73ffffffffffffffffffffffffffffffffffffffff8216610554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016103eb565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106935781811015610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103eb565b610693848484840361040f565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103eb565b73ffffffffffffffffffffffffffffffffffffffff82166107df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016103eb565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016103eb565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610693565b600060208083528351808285015260005b8181101561093557858101830151858201604001528201610919565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099857600080fd5b919050565b600080604083850312156109b057600080fd5b6109b983610974565b946020939093013593505050565b6000806000606084860312156109dc57600080fd5b6109e584610974565b92506109f360208501610974565b9150604084013590509250925092565b600060208284031215610a1557600080fd5b610a1e82610974565b9392505050565b60008060408385031215610a3857600080fd5b610a4183610974565b9150610a4f60208401610974565b90509250929050565b600181811c90821680610a6c57607f821691505b602082108103610aa5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b808201808211156102a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea164736f6c6343000813000a",
}
diff --git a/core/gethwrappers/shared/generated/link_token/link_token.go b/core/gethwrappers/shared/generated/link_token/link_token.go
index 14676806266..ff7d4dcec8b 100644
--- a/core/gethwrappers/shared/generated/link_token/link_token.go
+++ b/core/gethwrappers/shared/generated/link_token/link_token.go
@@ -31,7 +31,7 @@ var (
)
var LinkTokenMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decreaseApproval\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurners\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinters\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantBurnRole\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"grantMintAndBurnRoles\",\"inputs\":[{\"name\":\"burnAndMinter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"grantMintRole\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseApproval\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBurner\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"revokeBurnRole\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeMintRole\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferAndCall\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnAccessGranted\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnAccessRevoked\",\"inputs\":[{\"name\":\"burner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MintAccessGranted\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MintAccessRevoked\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxSupplyExceeded\",\"inputs\":[{\"name\":\"supplyAfterMint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"SenderNotBurner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"SenderNotMinter\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}]",
Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000338060008686818181600390816200007f91906200028c565b5060046200008e82826200028c565b5050506001600160a01b0384169150620000f190505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001245762000124816200013b565b50505060ff90911660805260a05250620003589050565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e8565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021257607f821691505b6020821081036200023357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028757600081815260208120601f850160051c81016020861015620002625750805b601f850160051c820191505b8181101562000283578281556001016200026e565b5050505b505050565b81516001600160401b03811115620002a857620002a8620001e7565b620002c081620002b98454620001fd565b8462000239565b602080601f831160018114620002f85760008415620002df5750858301515b600019600386901b1c1916600185901b17855562000283565b600085815260208120601f198616915b82811015620003295788860151825594840194600190910190840162000308565b5085821015620003485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200038c60003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a",
}
diff --git a/core/gethwrappers/ccip/generated/mock_v3_aggregator_contract/mock_v3_aggregator_contract.go b/core/gethwrappers/shared/generated/mock_v3_aggregator_contract/mock_v3_aggregator_contract.go
similarity index 83%
rename from core/gethwrappers/ccip/generated/mock_v3_aggregator_contract/mock_v3_aggregator_contract.go
rename to core/gethwrappers/shared/generated/mock_v3_aggregator_contract/mock_v3_aggregator_contract.go
index c3521d35151..616ffef18c3 100644
--- a/core/gethwrappers/ccip/generated/mock_v3_aggregator_contract/mock_v3_aggregator_contract.go
+++ b/core/gethwrappers/shared/generated/mock_v3_aggregator_contract/mock_v3_aggregator_contract.go
@@ -31,8 +31,8 @@ var (
)
var MockV3AggregatorMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"int256\",\"name\":\"_initialAnswer\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"current\",\"type\":\"int256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"}],\"name\":\"AnswerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"startedBy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"}],\"name\":\"NewRound\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"getAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint80\",\"name\":\"_roundId\",\"type\":\"uint80\"}],\"name\":\"getRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"_answer\",\"type\":\"int256\"}],\"name\":\"updateAnswer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint80\",\"name\":\"_roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"_answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startedAt\",\"type\":\"uint256\"}],\"name\":\"updateRoundData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b5060405161059638038061059683398101604081905261002f916100a4565b6000805460ff191660ff84161790556100478161004e565b50506100ff565b60018190554260025560038054906000610067836100d8565b9091555050600380546000908152600460209081526040808320949094558254825260058152838220429081905592548252600690529190912055565b600080604083850312156100b757600080fd5b825160ff811681146100c857600080fd5b6020939093015192949293505050565b6000600182016100f857634e487b7160e01b600052601160045260246000fd5b5060010190565b6104888061010e6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638205bf6a11610081578063b5ab58dc1161005b578063b5ab58dc1461025b578063b633620c1461027b578063feaf968c1461029b57600080fd5b80638205bf6a146101c15780639a6fc8f5146101ca578063a87a20ce1461024857600080fd5b806354fd4d50116100b257806354fd4d5014610171578063668a0f02146101795780637284e4161461018257600080fd5b8063313ce567146100d95780634aa2011f146100fd57806350d25bcd1461015a575b600080fd5b6000546100e69060ff1681565b60405160ff90911681526020015b60405180910390f35b61015861010b36600461033b565b69ffffffffffffffffffff90931660038181556001849055600283905560009182526004602090815260408084209590955581548352600581528483209390935554815260069091522055565b005b61016360015481565b6040519081526020016100f4565b610163600081565b61016360035481565b604080518082018252601f81527f76302e382f74657374732f4d6f636b563341676772656761746f722e736f6c00602082015290516100f49190610374565b61016360025481565b6102116101d83660046103e1565b69ffffffffffffffffffff8116600090815260046020908152604080832054600683528184205460059093529220549293919290918490565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016100f4565b610158610256366004610403565b6102c6565b610163610269366004610403565b60046020526000908152604090205481565b610163610289366004610403565b60056020526000908152604090205481565b6003546000818152600460209081526040808320546006835281842054600590935292205483610211565b600181905542600255600380549060006102df8361041c565b9091555050600380546000908152600460209081526040808320949094558254825260058152838220429081905592548252600690529190912055565b803569ffffffffffffffffffff8116811461033657600080fd5b919050565b6000806000806080858703121561035157600080fd5b61035a8561031c565b966020860135965060408601359560600135945092505050565b60006020808352835180602085015260005b818110156103a257858101830151858201604001528201610386565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b6000602082840312156103f357600080fd5b6103fc8261031c565b9392505050565b60006020828403121561041557600080fd5b5035919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610474577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c6343000818000a",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"_initialAnswer\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"description\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getAnswer\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoundData\",\"inputs\":[{\"name\":\"_roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"outputs\":[{\"name\":\"roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"},{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"startedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"answeredInRound\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTimestamp\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestAnswer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestRound\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestRoundData\",\"inputs\":[],\"outputs\":[{\"name\":\"roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"},{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"startedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"answeredInRound\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateAnswer\",\"inputs\":[{\"name\":\"_answer\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateRoundData\",\"inputs\":[{\"name\":\"_roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"},{\"name\":\"_answer\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"_timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startedAt\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AnswerUpdated\",\"inputs\":[{\"name\":\"current\",\"type\":\"int256\",\"indexed\":true,\"internalType\":\"int256\"},{\"name\":\"roundId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewRound\",\"inputs\":[{\"name\":\"roundId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"startedBy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"startedAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
+ Bin: "0x608060405234801561001057600080fd5b5060405161059538038061059583398101604081905261002f916100a4565b6000805460ff191660ff84161790556100478161004e565b50506100ff565b60018190554260025560038054906000610067836100d8565b9091555050600380546000908152600460209081526040808320949094558254825260058152838220429081905592548252600690529190912055565b600080604083850312156100b757600080fd5b825160ff811681146100c857600080fd5b6020939093015192949293505050565b6000600182016100f857634e487b7160e01b600052601160045260246000fd5b5060010190565b6104878061010e6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638205bf6a11610081578063b5ab58dc1161005b578063b5ab58dc1461025b578063b633620c1461027b578063feaf968c1461029b57600080fd5b80638205bf6a146101c15780639a6fc8f5146101ca578063a87a20ce1461024857600080fd5b806354fd4d50116100b257806354fd4d5014610171578063668a0f02146101795780637284e4161461018257600080fd5b8063313ce567146100d95780634aa2011f146100fd57806350d25bcd1461015a575b600080fd5b6000546100e69060ff1681565b60405160ff90911681526020015b60405180910390f35b61015861010b36600461033b565b69ffffffffffffffffffff90931660038181556001849055600283905560009182526004602090815260408084209590955581548352600581528483209390935554815260069091522055565b005b61016360015481565b6040519081526020016100f4565b610163600081565b61016360035481565b604080518082018252601f81527f76302e382f74657374732f4d6f636b563341676772656761746f722e736f6c00602082015290516100f49190610374565b61016360025481565b6102116101d83660046103e0565b69ffffffffffffffffffff8116600090815260046020908152604080832054600683528184205460059093529220549293919290918490565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016100f4565b610158610256366004610402565b6102c6565b610163610269366004610402565b60046020526000908152604090205481565b610163610289366004610402565b60056020526000908152604090205481565b6003546000818152600460209081526040808320546006835281842054600590935292205483610211565b600181905542600255600380549060006102df8361041b565b9091555050600380546000908152600460209081526040808320949094558254825260058152838220429081905592548252600690529190912055565b803569ffffffffffffffffffff8116811461033657600080fd5b919050565b6000806000806080858703121561035157600080fd5b61035a8561031c565b966020860135965060408601359560600135945092505050565b600060208083528351808285015260005b818110156103a157858101830151858201604001528201610385565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b6000602082840312156103f257600080fd5b6103fb8261031c565b9392505050565b60006020828403121561041457600080fd5b5035919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610473577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c6343000813000a",
}
var MockV3AggregatorABI = MockV3AggregatorMetaData.ABI
diff --git a/core/gethwrappers/shared/generated/multicall3/multicall3.go b/core/gethwrappers/shared/generated/multicall3/multicall3.go
index 91d612756b8..917d33f07f4 100644
--- a/core/gethwrappers/shared/generated/multicall3/multicall3.go
+++ b/core/gethwrappers/shared/generated/multicall3/multicall3.go
@@ -52,7 +52,7 @@ type Multicall3Result struct {
}
var Multicall3MetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"returnData\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowFailure\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call3[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate3\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowFailure\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call3Value[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate3Value\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"blockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBasefee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"basefee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"chainid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockCoinbase\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gaslimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getEthBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryAggregate\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryBlockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}]",
+ ABI: "[{\"type\":\"function\",\"name\":\"aggregate\",\"inputs\":[{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Call[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"returnData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"aggregate3\",\"inputs\":[{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Call3[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowFailure\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"callData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"returnData\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Result[]\",\"components\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"aggregate3Value\",\"inputs\":[{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Call3Value[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowFailure\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"callData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"returnData\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Result[]\",\"components\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"blockAndAggregate\",\"inputs\":[{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Call[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"returnData\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Result[]\",\"components\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getBasefee\",\"inputs\":[],\"outputs\":[{\"name\":\"basefee\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockHash\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChainId\",\"inputs\":[],\"outputs\":[{\"name\":\"chainid\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentBlockCoinbase\",\"inputs\":[],\"outputs\":[{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentBlockDifficulty\",\"inputs\":[],\"outputs\":[{\"name\":\"difficulty\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentBlockGasLimit\",\"inputs\":[],\"outputs\":[{\"name\":\"gaslimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentBlockTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEthBalance\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLastBlockHash\",\"inputs\":[],\"outputs\":[{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tryAggregate\",\"inputs\":[{\"name\":\"requireSuccess\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Call[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"returnData\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Result[]\",\"components\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"tryBlockAndAggregate\",\"inputs\":[{\"name\":\"requireSuccess\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Call[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"callData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"returnData\",\"type\":\"tuple[]\",\"internalType\":\"structMulticall3.Result[]\",\"components\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"payable\"}]",
Bin: "0x608060405234801561001057600080fd5b50610eb0806100206000396000f3fe6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bb7565b61014d610148366004610a85565b6104ef565b604051610111929190610bd1565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c59565b610690565b60405161011193929190610cb3565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610cdb565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c59565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d11565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d2a565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d59565b6020026020010151905087878381811061035d5761035d610d59565b905060200281019061036f9190610d88565b6040810135958601959093506103886020850185610cdb565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dc6565b6040516103ba929190610e2b565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d2a565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d59565b90506020028101906105749190610e3b565b92506105836020840184610cdb565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dc6565b6040516105b4929190610e2b565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d59565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d2a565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d59565b6020026020010151905086868381811061074c5761074c610d59565b905060200281019061075e9190610e6f565b925061076d6020840184610cdb565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dc6565b60405161079e929190610e2b565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d2a565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d59565b602002602001015190508686838181106108fb576108fb610d59565b905060200281019061090d9190610e3b565b925061091c6020840184610cdb565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dc6565b60405161094d929190610e2b565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b600082825180855260208086019550808260051b84010181860160005b84811015610baa578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9681860183610ac7565b9a86019a9450505090830190600101610b48565b5090979650505050505050565b602081526000610bca6020830184610b2b565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c4b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c39868351610ac7565b95509284019290840190600101610bff565b509398975050505050505050565b600080600060408486031215610c6e57600080fd5b83358015158114610c7e57600080fd5b9250602084013567ffffffffffffffff811115610c9a57600080fd5b610ca686828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd26060830184610b2b565b95945050505050565b600060208284031215610ced57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bca57600080fd5b600060208284031215610d2357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dbc57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610dfb57600080fd5b83018035915067ffffffffffffffff821115610e1657600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dbc57600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dbc57600080fdfea164736f6c6343000813000a",
}
diff --git a/core/gethwrappers/shared/generated/werc20_mock/werc20_mock.go b/core/gethwrappers/shared/generated/werc20_mock/werc20_mock.go
index c8ff3722755..64c227266b8 100644
--- a/core/gethwrappers/shared/generated/werc20_mock/werc20_mock.go
+++ b/core/gethwrappers/shared/generated/werc20_mock/werc20_mock.go
@@ -31,7 +31,7 @@ var (
)
var WERC20MockMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
+ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawal\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
Bin: "0x60806040523480156200001157600080fd5b506040518060400160405280600a8152602001695745524332304d6f636b60b01b815250604051806040016040528060048152602001635745524360e01b815250816003908162000063919062000120565b50600462000072828262000120565b505050620001ec565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000a657607f821691505b602082108103620000c757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200011b57600081815260208120601f850160051c81016020861015620000f65750805b601f850160051c820191505b81811015620001175782815560010162000102565b5050505b505050565b81516001600160401b038111156200013c576200013c6200007b565b62000154816200014d845462000091565b84620000cd565b602080601f8311600181146200018c5760008415620001735750858301515b600019600386901b1c1916600185901b17855562000117565b600085815260208120601f198616915b82811015620001bd578886015182559484019460019091019084016200019c565b5085821015620001dc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610fc980620001fc6000396000f3fe6080604052600436106100ec5760003560e01c806340c10f191161008a578063a457c2d711610059578063a457c2d71461028e578063a9059cbb146102ae578063d0e30db0146102ce578063dd62ed3e146102d657600080fd5b806340c10f19146101f657806370a082311461021657806395d89b41146102595780639dc29fac1461026e57600080fd5b806323b872dd116100c657806323b872dd1461017a5780632e1a7d4d1461019a578063313ce567146101ba57806339509351146101d657600080fd5b806306fdde0314610100578063095ea7b31461012b57806318160ddd1461015b57600080fd5b366100fb576100f9610329565b005b600080fd5b34801561010c57600080fd5b5061011561036a565b6040516101229190610dc6565b60405180910390f35b34801561013757600080fd5b5061014b610146366004610e5b565b6103fc565b6040519015158152602001610122565b34801561016757600080fd5b506002545b604051908152602001610122565b34801561018657600080fd5b5061014b610195366004610e85565b610416565b3480156101a657600080fd5b506100f96101b5366004610ec1565b61043a565b3480156101c657600080fd5b5060405160128152602001610122565b3480156101e257600080fd5b5061014b6101f1366004610e5b565b6104c6565b34801561020257600080fd5b506100f9610211366004610e5b565b610512565b34801561022257600080fd5b5061016c610231366004610eda565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b34801561026557600080fd5b50610115610520565b34801561027a57600080fd5b506100f9610289366004610e5b565b61052f565b34801561029a57600080fd5b5061014b6102a9366004610e5b565b610539565b3480156102ba57600080fd5b5061014b6102c9366004610e5b565b61060f565b6100f9610329565b3480156102e257600080fd5b5061016c6102f1366004610efc565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b610333333461061d565b60405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b60606003805461037990610f2f565b80601f01602080910402602001604051908101604052809291908181526020018280546103a590610f2f565b80156103f25780601f106103c7576101008083540402835291602001916103f2565b820191906000526020600020905b8154815290600101906020018083116103d557829003601f168201915b5050505050905090565b60003361040a818585610710565b60019150505b92915050565b6000336104248582856108c4565b61042f85858561099b565b506001949350505050565b3360009081526020819052604090205481111561045657600080fd5b6104603382610c0a565b604051339082156108fc029083906000818181858888f1935050505015801561048d573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061040a908290869061050d908790610f82565b610710565b61051c828261061d565b5050565b60606004805461037990610f2f565b61051c8282610c0a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610602576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61042f8286868403610710565b60003361040a81858561099b565b73ffffffffffffffffffffffffffffffffffffffff821661069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105f9565b80600260008282546106ac9190610f82565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff83166107b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105f9565b73ffffffffffffffffffffffffffffffffffffffff8216610855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105f9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109955781811015610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105f9565b6109958484848403610710565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105f9565b73ffffffffffffffffffffffffffffffffffffffff8216610ae1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105f9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105f9565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610995565b73ffffffffffffffffffffffffffffffffffffffff8216610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105f9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610d63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105f9565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016108b7565b600060208083528351808285015260005b81811015610df357858101830151858201604001528201610dd7565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e5657600080fd5b919050565b60008060408385031215610e6e57600080fd5b610e7783610e32565b946020939093013593505050565b600080600060608486031215610e9a57600080fd5b610ea384610e32565b9250610eb160208501610e32565b9150604084013590509250925092565b600060208284031215610ed357600080fd5b5035919050565b600060208284031215610eec57600080fd5b610ef582610e32565b9392505050565b60008060408385031215610f0f57600080fd5b610f1883610e32565b9150610f2660208401610e32565b90509250929050565b600181811c90821680610f4357607f821691505b602082108103610f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b80820180821115610410577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea164736f6c6343000813000a",
}
diff --git a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 470cd477fe0..1c333b653ef 100644
--- a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -1,7 +1,10 @@
GETH_VERSION: 1.14.11
-burn_mint_erc20: ../../../contracts/solc/v0.8.19/BurnMintERC20/BurnMintERC20.abi ../../../contracts/solc/v0.8.19/BurnMintERC20/BurnMintERC20.bin 9faa5e698c31f771907d9e8404f95fa33b61ecc18ca02cb379836206566331a5
-burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 405c9016171e614b17e10588653ef8d33dcea21dd569c3fddc596a46fcff68a3
-erc20: ../../../contracts/solc/v0.8.19/ERC20/ERC20.abi ../../../contracts/solc/v0.8.19/ERC20/ERC20.bin 5b1a93d9b24f250e49a730c96335a8113c3f7010365cba578f313b483001d4fc
-link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin c0ef9b507103aae541ebc31d87d051c2764ba9d843076b30ec505d37cdfffaba
-multicall3: ../../../contracts/solc/v0.8.19/Multicall3/Multicall3.abi ../../../contracts/solc/v0.8.19/Multicall3/Multicall3.bin 66fff7368bbd7dfe1cb20d31cf29efa917a24cf5344e2d79b34994b8c3b9530a
-werc20_mock: ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.abi ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.bin ff2ca3928b2aa9c412c892cb8226c4d754c73eeb291bb7481c32c48791b2aa94
+aggregator_v3_interface: ../../../contracts/solc/shared/AggregatorV3Interface/AggregatorV3Interface.sol/AggregatorV3Interface.abi.json ../../../contracts/solc/shared/AggregatorV3Interface/AggregatorV3Interface.sol/AggregatorV3Interface.bin 0294226c10dd4b77239d85074fcf05c39c5cbf513b45bb07f966a8733457d2cb
+burn_mint_erc20: ../../../contracts/solc/shared/BurnMintERC20/BurnMintERC20.sol/BurnMintERC20.abi.json ../../../contracts/solc/shared/BurnMintERC20/BurnMintERC20.sol/BurnMintERC20.bin 161d4fc00d3bd8759a82a11d2d0946653ed06853e67359049ac4176288090d22
+burn_mint_erc677: ../../../contracts/solc/shared/BurnMintERC677/BurnMintERC677.sol/BurnMintERC677.abi.json ../../../contracts/solc/shared/BurnMintERC677/BurnMintERC677.sol/BurnMintERC677.bin c510542f105686f93e6287a66a6466c10cd576781063fc787ef365b4a47f5cb8
+chain_reader_tester: ../../../contracts/solc/shared/ChainReaderTester/ChainReaderTester.sol/ChainReaderTester.abi.json ../../../contracts/solc/shared/ChainReaderTester/ChainReaderTester.sol/ChainReaderTester.bin 876c55e8d2556dc9cc953c786ae72b0430cb2c992f84573a2aae9680068f293d
+erc20: ../../../contracts/solc/vendor/ERC20/ERC20.sol/ERC20.abi.json ../../../contracts/solc/vendor/ERC20/ERC20.sol/ERC20.bin 9a5e3f7ec9fea385eeba374d184d6b83784304f537a90f6b81827c732d0b37c4
+link_token: ../../../contracts/solc/shared/LinkToken/LinkToken.sol/LinkToken.abi.json ../../../contracts/solc/shared/LinkToken/LinkToken.sol/LinkToken.bin 9d1c648233822b70b03bf4fdb1af4cffaead8f1391dd149a79b3072defbd0c62
+mock_v3_aggregator_contract: ../../../contracts/solc/tests/MockV3Aggregator/MockV3Aggregator.sol/MockV3Aggregator.abi.json ../../../contracts/solc/tests/MockV3Aggregator/MockV3Aggregator.sol/MockV3Aggregator.bin 76796e0faffb2981d49082d94f2f2c9ec87d8ad960b022993d0681f9c81a832d
+multicall3: ../../../contracts/solc/vendor/Multicall3/Multicall3.sol/Multicall3.abi.json ../../../contracts/solc/vendor/Multicall3/Multicall3.sol/Multicall3.bin 175cd8790a4c714790c3761c50b0e93694c71bb7f8897eb92150847e6d8a94f4
+werc20_mock: ../../../contracts/solc/shared/WERC20Mock/WERC20Mock.sol/WERC20Mock.abi.json ../../../contracts/solc/shared/WERC20Mock/WERC20Mock.sol/WERC20Mock.bin f5ba13fc99c248354508e3bab6cd0fb66607d3b7377f59a1e80b930e96ed4f48
diff --git a/core/gethwrappers/shared/go_generate.go b/core/gethwrappers/shared/go_generate.go
index 7fe9d6a8ef2..3ac9b8ac6e9 100644
--- a/core/gethwrappers/shared/go_generate.go
+++ b/core/gethwrappers/shared/go_generate.go
@@ -2,9 +2,13 @@
// golang packages, using abigen.
package gethwrappers
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin BurnMintERC677 burn_mint_erc677
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin LinkToken link_token
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/BurnMintERC20/BurnMintERC20.abi ../../../contracts/solc/v0.8.19/BurnMintERC20/BurnMintERC20.bin BurnMintERC20 burn_mint_erc20
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ERC20/ERC20.abi ../../../contracts/solc/v0.8.19/ERC20/ERC20.bin ERC20 erc20
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.abi ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.bin WERC20Mock werc20_mock
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/Multicall3/Multicall3.abi ../../../contracts/solc/v0.8.19/Multicall3/Multicall3.bin Multicall3 multicall3
+//go:generate go run ../generation/wrap.go shared BurnMintERC677 burn_mint_erc677
+//go:generate go run ../generation/wrap.go shared LinkToken link_token
+//go:generate go run ../generation/wrap.go shared BurnMintERC20 burn_mint_erc20
+//go:generate go run ../generation/wrap.go shared WERC20Mock werc20_mock
+//go:generate go run ../generation/wrap.go shared ChainReaderTester chain_reader_tester
+//go:generate go run ../generation/wrap.go shared AggregatorV3Interface aggregator_v3_interface
+
+//go:generate go run ../generation/wrap.go vendor ERC20 erc20
+//go:generate go run ../generation/wrap.go vendor Multicall3 multicall3
+//go:generate go run ../generation/wrap.go tests MockV3Aggregator mock_v3_aggregator_contract
diff --git a/core/gethwrappers/transmission/generated/entry_point/entry_point.go b/core/gethwrappers/transmission/generated/entry_point/entry_point.go
deleted file mode 100644
index 5a22214cb0e..00000000000
--- a/core/gethwrappers/transmission/generated/entry_point/entry_point.go
+++ /dev/null
@@ -1,1871 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package entry_point
-
-import (
- "errors"
- "fmt"
- "math/big"
- "strings"
-
- ethereum "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/event"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
-)
-
-var (
- _ = errors.New
- _ = big.NewInt
- _ = strings.NewReader
- _ = ethereum.NotFound
- _ = bind.Bind
- _ = common.Big1
- _ = types.BloomLookup
- _ = event.NewSubscription
- _ = abi.ConvertType
-)
-
-type EntryPointMemoryUserOp struct {
- Sender common.Address
- Nonce *big.Int
- CallGasLimit *big.Int
- VerificationGasLimit *big.Int
- PreVerificationGas *big.Int
- Paymaster common.Address
- MaxFeePerGas *big.Int
- MaxPriorityFeePerGas *big.Int
-}
-
-type EntryPointUserOpInfo struct {
- MUserOp EntryPointMemoryUserOp
- UserOpHash [32]byte
- Prefund *big.Int
- ContextOffset *big.Int
- PreOpGas *big.Int
-}
-
-type IEntryPointUserOpsPerAggregator struct {
- UserOps []UserOperation
- Aggregator common.Address
- Signature []byte
-}
-
-type IStakeManagerDepositInfo struct {
- Deposit *big.Int
- Staked bool
- Stake *big.Int
- UnstakeDelaySec uint32
- WithdrawTime *big.Int
-}
-
-type UserOperation struct {
- Sender common.Address
- Nonce *big.Int
- InitCode []byte
- CallData []byte
- CallGasLimit *big.Int
- VerificationGasLimit *big.Int
- PreVerificationGas *big.Int
- MaxFeePerGas *big.Int
- MaxPriorityFeePerGas *big.Int
- PaymasterAndData []byte
- Signature []byte
-}
-
-var EntryPointMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bool\",\"name\":\"targetSuccess\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"targetResult\",\"type\":\"bytes\"}],\"name\":\"ExecutionResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"opIndex\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"FailedOp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderAddressResult\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureValidationFailed\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"structIEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"structIStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"structIStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"structIStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResult\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"sigFailed\",\"type\":\"bool\"},{\"internalType\":\"uint48\",\"name\":\"validAfter\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"validUntil\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"paymasterContext\",\"type\":\"bytes\"}],\"internalType\":\"structIEntryPoint.ReturnInfo\",\"name\":\"returnInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"structIStakeManager.StakeInfo\",\"name\":\"senderInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"structIStakeManager.StakeInfo\",\"name\":\"factoryInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"structIStakeManager.StakeInfo\",\"name\":\"paymasterInfo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"internalType\":\"structIStakeManager.StakeInfo\",\"name\":\"stakeInfo\",\"type\":\"tuple\"}],\"internalType\":\"structIEntryPoint.AggregatorStakeInfo\",\"name\":\"aggregatorInfo\",\"type\":\"tuple\"}],\"name\":\"ValidationResultWithAggregation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"}],\"name\":\"AccountDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalDeposit\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"SignatureAggregatorChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalStaked\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unstakeDelaySec\",\"type\":\"uint256\"}],\"name\":\"StakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawTime\",\"type\":\"uint256\"}],\"name\":\"StakeUnlocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualGasUsed\",\"type\":\"uint256\"}],\"name\":\"UserOperationEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"revertReason\",\"type\":\"bytes\"}],\"name\":\"UserOperationRevertReason\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SIG_VALIDATION_FAILED\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"}],\"name\":\"_validateSenderAndPaymaster\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"}],\"name\":\"addStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getDepositInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint112\",\"name\":\"deposit\",\"type\":\"uint112\"},{\"internalType\":\"bool\",\"name\":\"staked\",\"type\":\"bool\"},{\"internalType\":\"uint112\",\"name\":\"stake\",\"type\":\"uint112\"},{\"internalType\":\"uint32\",\"name\":\"unstakeDelaySec\",\"type\":\"uint32\"},{\"internalType\":\"uint48\",\"name\":\"withdrawTime\",\"type\":\"uint48\"}],\"internalType\":\"structIStakeManager.DepositInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"getSenderAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"getUserOpHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structUserOperation[]\",\"name\":\"userOps\",\"type\":\"tuple[]\"},{\"internalType\":\"contractIAggregator\",\"name\":\"aggregator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIEntryPoint.UserOpsPerAggregator[]\",\"name\":\"opsPerAggregator\",\"type\":\"tuple[]\"},{\"internalType\":\"addresspayable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleAggregatedOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structUserOperation[]\",\"name\":\"ops\",\"type\":\"tuple[]\"},{\"internalType\":\"addresspayable\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"handleOps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"}],\"internalType\":\"structEntryPoint.MemoryUserOp\",\"name\":\"mUserOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"prefund\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"contextOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preOpGas\",\"type\":\"uint256\"}],\"internalType\":\"structEntryPoint.UserOpInfo\",\"name\":\"opInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"}],\"name\":\"innerHandleOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structUserOperation\",\"name\":\"op\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"targetCallData\",\"type\":\"bytes\"}],\"name\":\"simulateHandleOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"}],\"name\":\"simulateValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"withdrawAddress\",\"type\":\"address\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"withdrawAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"withdrawAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
- Bin: "0x60a0604052604051620000129062000050565b604051809103906000f0801580156200002f573d6000803e3d6000fd5b506001600160a01b03166080523480156200004957600080fd5b506200005e565b61020a8062004b0483390190565b608051614a83620000816000396000818161146e015261363e0152614a836000f3fe6080604052600436106101125760003560e01c8063957122ab116100a5578063bb9fe6bf11610074578063d6383f9411610059578063d6383f941461042c578063ee2194231461044c578063fc7e286d1461046c57600080fd5b8063bb9fe6bf146103f7578063c23a5cea1461040c57600080fd5b8063957122ab146103845780639b249f69146103a4578063a6193531146103c4578063b760faf9146103e457600080fd5b80634b1d7cf5116100e15780634b1d7cf5146101ad5780635287ce12146101cd57806370a082311461031c5780638f41ec5a1461036f57600080fd5b80630396cb60146101275780631d7327561461013a5780631fad948c1461016d578063205c28781461018d57600080fd5b366101225761012033610546565b005b600080fd5b6101206101353660046139b1565b6105c1565b34801561014657600080fd5b5061015a610155366004613c28565b610944565b6040519081526020015b60405180910390f35b34801561017957600080fd5b50610120610188366004613d33565b610af7565b34801561019957600080fd5b506101206101a8366004613d8a565b610c38565b3480156101b957600080fd5b506101206101c8366004613d33565b610e3a565b3480156101d957600080fd5b506102bd6101e8366004613db6565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091525073ffffffffffffffffffffffffffffffffffffffff1660009081526020818152604091829020825160a08101845281546dffffffffffffffffffffffffffff80821683526e010000000000000000000000000000820460ff161515948301949094526f0100000000000000000000000000000090049092169282019290925260019091015463ffffffff81166060830152640100000000900465ffffffffffff16608082015290565b6040805182516dffffffffffffffffffffffffffff908116825260208085015115159083015283830151169181019190915260608083015163ffffffff169082015260809182015165ffffffffffff169181019190915260a001610164565b34801561032857600080fd5b5061015a610337366004613db6565b73ffffffffffffffffffffffffffffffffffffffff166000908152602081905260409020546dffffffffffffffffffffffffffff1690565b34801561037b57600080fd5b5061015a600181565b34801561039057600080fd5b5061012061039f366004613dd3565b6112d9565b3480156103b057600080fd5b506101206103bf366004613e58565b611431565b3480156103d057600080fd5b5061015a6103df366004613eb3565b611533565b6101206103f2366004613db6565b610546565b34801561040357600080fd5b50610120611575565b34801561041857600080fd5b50610120610427366004613db6565b61172c565b34801561043857600080fd5b50610120610447366004613ee8565b611a2c565b34801561045857600080fd5b50610120610467366004613eb3565b611b5a565b34801561047857600080fd5b506104f9610487366004613db6565b600060208190529081526040902080546001909101546dffffffffffffffffffffffffffff808316926e010000000000000000000000000000810460ff16926f010000000000000000000000000000009091049091169063ffffffff811690640100000000900465ffffffffffff1685565b604080516dffffffffffffffffffffffffffff96871681529415156020860152929094169183019190915263ffffffff16606082015265ffffffffffff909116608082015260a001610164565b6105508134611ec2565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020818152604091829020805492516dffffffffffffffffffffffffffff909316835292917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c491015b60405180910390a25050565b33600090815260208190526040902063ffffffff8216610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c617900000000000060448201526064015b60405180910390fd5b600181015463ffffffff90811690831610156106ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152606401610639565b80546000906106ed9034906f0100000000000000000000000000000090046dffffffffffffffffffffffffffff16613f79565b905060008111610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152606401610639565b6dffffffffffffffffffffffffffff8111156107d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152606401610639565b6040805160a08101825283546dffffffffffffffffffffffffffff90811682526001602080840182815286841685870190815263ffffffff808b16606088019081526000608089018181523380835296829052908a9020985189549551945189166f01000000000000000000000000000000027fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff9515156e010000000000000000000000000000027fffffffffffffffffffffffffffffffffff0000000000000000000000000000009097169190991617949094179290921695909517865551949092018054925165ffffffffffff16640100000000027fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000909316949093169390931717905590517fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0190610937908490879091825263ffffffff16602082015260400190565b60405180910390a2505050565b6000805a90503330146109b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152606401610639565b8451604081015160608201518101611388015a10156109f6577fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b875160009015610a97576000610a13846000015160008c86611fbf565b905080610a95576000610a27610800611fd7565b805190915015610a8f57846000015173ffffffffffffffffffffffffffffffffffffffff168a602001517f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201876020015184604051610a86929190613ffa565b60405180910390a35b60019250505b505b600088608001515a8603019050610ae96000838b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250889250612003915050565b9a9950505050505050505050565b8160008167ffffffffffffffff811115610b1357610b136139d7565b604051908082528060200260200182016040528015610b4c57816020015b610b3961390d565b815260200190600190039081610b315790505b50905060005b82811015610bc5576000828281518110610b6e57610b6e614013565b60200260200101519050600080610ba9848a8a87818110610b9157610b91614013565b9050602002810190610ba39190614042565b856123e1565b91509150610bba84838360006125a3565b505050600101610b52565b506000805b83811015610c2557610c1981888884818110610be857610be8614013565b9050602002810190610bfa9190614042565b858481518110610c0c57610c0c614013565b60200260200101516127f8565b90910190600101610bca565b50610c30848261297d565b505050505050565b33600090815260208190526040902080546dffffffffffffffffffffffffffff16821115610cc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152606401610639565b8054610cdf9083906dffffffffffffffffffffffffffff16614080565b81547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff919091161781556040805173ffffffffffffffffffffffffffffffffffffffff851681526020810184905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb910160405180910390a260008373ffffffffffffffffffffffffffffffffffffffff168360405160006040518083038185875af1925050503d8060008114610dc4576040519150601f19603f3d011682016040523d82523d6000602084013e610dc9565b606091505b5050905080610e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152606401610639565b50505050565b816000805b828110156110335736868683818110610e5a57610e5a614013565b9050602002810190610e6c9190614093565b9050366000610e7b83806140c7565b90925090506000610e926040850160208601613db6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff821601610f33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152606401610639565b73ffffffffffffffffffffffffffffffffffffffff8116156110105773ffffffffffffffffffffffffffffffffffffffff811663e3563a4f8484610f7a604089018961412f565b6040518563ffffffff1660e01b8152600401610f999493929190614345565b60006040518083038186803b158015610fb157600080fd5b505afa925050508015610fc2575060015b611010576040517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610639565b61101a8287613f79565b955050505050808061102b906143fc565b915050610e3f565b5060008167ffffffffffffffff81111561104f5761104f6139d7565b60405190808252806020026020018201604052801561108857816020015b61107561390d565b81526020019060019003908161106d5790505b5090506000805b8481101561117357368888838181106110aa576110aa614013565b90506020028101906110bc9190614093565b90503660006110cb83806140c7565b909250905060006110e26040850160208601613db6565b90508160005b8181101561115a57600089898151811061110457611104614013565b602002602001015190506000806111278b898987818110610b9157610b91614013565b91509150611137848383896125a3565b8a611141816143fc565b9b50505050508080611152906143fc565b9150506110e8565b505050505050808061116b906143fc565b91505061108f565b50600080915060005b85811015611299573689898381811061119757611197614013565b90506020028101906111a99190614093565b90506111bb6040820160208301613db6565b73ffffffffffffffffffffffffffffffffffffffff167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d60405160405180910390a236600061120a83806140c7565b90925090508060005b81811015611281576112558885858481811061123157611231614013565b90506020028101906112439190614042565b8b8b81518110610c0c57610c0c614013565b61125f9088613f79565b96508761126b816143fc565b9850508080611279906143fc565b915050611213565b50505050508080611291906143fc565b91505061117c565b506040516000907f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d908290a26112cf868261297d565b5050505050505050565b831580156112fc575073ffffffffffffffffffffffffffffffffffffffff83163b155b15611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f41413230206163636f756e74206e6f74206465706c6f796564000000000000006044820152606401610639565b601481106113f557600061137a6014828486614434565b6113839161445e565b60601c9050803b6000036113f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f41413330207061796d6173746572206e6f74206465706c6f79656400000000006044820152606401610639565b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260006024820152604401610639565b6040517f570e1a3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063570e1a36906114a590859085906004016144a6565b6020604051808303816000875af11580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e891906144ba565b6040517f6ca7b80600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610639565b600061153e82612ac9565b6040805160208101929092523090820152466060820152608001604051602081830303815290604052805190602001209050919050565b3360009081526020819052604081206001810154909163ffffffff90911690036115fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152606401610639565b80546e010000000000000000000000000000900460ff16611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152606401610639565b60018101546000906116909063ffffffff16426144d7565b6001830180547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff1664010000000065ffffffffffff84169081029190911790915583547fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff16845560405190815290915033907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a906020016105b5565b33600090815260208190526040902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff16806117c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152606401610639565b6001820154640100000000900465ffffffffffff16611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152606401610639565b60018201544264010000000090910465ffffffffffff1611156118c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152606401610639565b6001820180547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000016905581547fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff1682556040805173ffffffffffffffffffffffffffffffffffffffff851681526020810183905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3910160405180910390a260008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146119bc576040519150601f19603f3d011682016040523d82523d6000602084013e6119c1565b606091505b5050905080610e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152606401610639565b611a3461390d565b611a3d85612ae2565b600080611a4c600088856123e1565b915091506000611a5c8383612bd5565b9050611a6743600052565b6000611a7560008a876127f8565b9050611a8043600052565b6000606073ffffffffffffffffffffffffffffffffffffffff8a1615611b10578973ffffffffffffffffffffffffffffffffffffffff168989604051611ac79291906144fd565b6000604051808303816000865af19150503d8060008114611b04576040519150601f19603f3d011682016040523d82523d6000602084013e611b09565b606091505b5090925090505b8660800151838560200151866040015185856040517f8b7ac9800000000000000000000000000000000000000000000000000000000081526004016106399695949392919061450d565b611b6261390d565b611b6b82612ae2565b600080611b7a600085856123e1565b845160a001516040805180820182526000808252602080830182815273ffffffffffffffffffffffffffffffffffffffff958616835282825284832080546dffffffffffffffffffffffffffff6f01000000000000000000000000000000918290048116875260019283015463ffffffff9081169094528d51518851808a018a5287815280870188815291909a16875286865288872080549390930490911689529101549091169052835180850190945281845283015293955091935090366000611c4860408a018a61412f565b909250905060006014821015611c5f576000611c7a565b611c6d601460008486614434565b611c769161445e565b60601c5b6040805180820182526000808252602080830182815273ffffffffffffffffffffffffffffffffffffffff861683529082905292902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff1682526001015463ffffffff1690915290915093505050506000611cf88686612bd5565b90506000816000015190506000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905060006040518060c001604052808b6080015181526020018b6040015181526020018315158152602001856020015165ffffffffffff168152602001856040015165ffffffffffff168152602001611d8f8c6060015190565b9052905073ffffffffffffffffffffffffffffffffffffffff831615801590611dcf575073ffffffffffffffffffffffffffffffffffffffff8316600114155b15611e885760408051808201825273ffffffffffffffffffffffffffffffffffffffff851680825282518084018452600080825260208083018281529382528181529085902080546f0100000000000000000000000000000090046dffffffffffffffffffffffffffff1683526001015463ffffffff169092529082015290517ffaecb4e4000000000000000000000000000000000000000000000000000000008152610639908390899089908c9086906004016145af565b808686896040517fe0cff05f000000000000000000000000000000000000000000000000000000008152600401610639949392919061463c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054909190611f079084906dffffffffffffffffffffffffffff16613f79565b90506dffffffffffffffffffffffffffff811115611f81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152606401610639565b81547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff919091161790555050565b6000806000845160208601878987f195945050505050565b60603d82811115611fe55750815b604051602082018101604052818152816000602083013e9392505050565b6000805a85519091506000908161201982612cbc565b60a083015190915073ffffffffffffffffffffffffffffffffffffffff81166120455782519350612293565b80935060008851111561229357868202955060028a600281111561206b5761206b614693565b146121035760608301516040517fa9a2340900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169163a9a23409916120cb908e908d908c906004016146c2565b600060405180830381600088803b1580156120e557600080fd5b5087f11580156120f9573d6000803e3d6000fd5b5050505050612293565b60608301516040517fa9a2340900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169163a9a234099161215e908e908d908c906004016146c2565b600060405180830381600088803b15801561217857600080fd5b5087f19350505050801561218a575060015b61229357612196614722565b806308c379a00361222657506121aa61473e565b806121b55750612228565b8b816040516020016121c791906147e6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f220266b60000000000000000000000000000000000000000000000000000000082526106399291600401613ffa565b505b8a6040517f220266b60000000000000000000000000000000000000000000000000000000081526004016106399181526040602082018190526012908201527f4141353020706f73744f70207265766572740000000000000000000000000000606082015260800190565b5a85038701965081870295508589604001511015612315578a6040517f220266b600000000000000000000000000000000000000000000000000000000815260040161063991815260406020808301829052908201527f414135312070726566756e642062656c6f772061637475616c476173436f7374606082015260800190565b60408901518690036123278582611ec2565b6000808c600281111561233c5761233c614693565b1490508460a0015173ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff168c602001517f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f8860200151858d8f6040516123c9949392919093845291151560208401526040830152606082015260800190565b60405180910390a45050505050505095945050505050565b60008060005a84519091506123f68682612cec565b6123ff86611533565b6020860152604081015160608201516080830151171760e087013517610100870135176effffffffffffffffffffffffffffff81111561249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152606401610639565b6000806124a784612e0c565b90506124b58a8a8a84612e66565b975091506124c243600052565b60a084015160609073ffffffffffffffffffffffffffffffffffffffff16156124f7576124f28b8b8b858761317c565b975090505b60005a87039050808b60a001351015612575578b6040517f220266b6000000000000000000000000000000000000000000000000000000008152600401610639918152604060208201819052601e908201527f41413430206f76657220766572696669636174696f6e4761734c696d69740000606082015260800190565b60408a018390528160608b015260c08b01355a8803018a608001818152505050505050505050935093915050565b6000806125af8561343f565b915091508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461265157856040517f220266b60000000000000000000000000000000000000000000000000000000081526004016106399181526040602082018190526014908201527f41413234207369676e6174757265206572726f72000000000000000000000000606082015260800190565b80156126c257856040517f220266b60000000000000000000000000000000000000000000000000000000081526004016106399181526040602082018190526017908201527f414132322065787069726564206f72206e6f7420647565000000000000000000606082015260800190565b60006126cd8561343f565b9250905073ffffffffffffffffffffffffffffffffffffffff81161561275857866040517f220266b60000000000000000000000000000000000000000000000000000000081526004016106399181526040602082018190526014908201527f41413334207369676e6174757265206572726f72000000000000000000000000606082015260800190565b81156127ef57866040517f220266b60000000000000000000000000000000000000000000000000000000081526004016106399181526040602082018190526021908201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560608201527f6500000000000000000000000000000000000000000000000000000000000000608082015260a00190565b50505050505050565b6000805a9050600061280b846060015190565b905030631d732756612820606088018861412f565b87856040518563ffffffff1660e01b8152600401612841949392919061482b565b6020604051808303816000875af192505050801561289a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612897918101906148ec565b60015b61297157600060206000803e506000517f2152215300000000000000000000000000000000000000000000000000000000810161293c57866040517f220266b6000000000000000000000000000000000000000000000000000000008152600401610639918152604060208201819052600f908201527f41413935206f7574206f66206761730000000000000000000000000000000000606082015260800190565b600085608001515a61294e9086614080565b6129589190613f79565b9050612968886002888685612003565b94505050612974565b92505b50509392505050565b73ffffffffffffffffffffffffffffffffffffffff82166129fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152606401610639565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612a54576040519150601f19603f3d011682016040523d82523d6000602084013e612a59565b606091505b5050905080612ac4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152606401610639565b505050565b6000612ad482613492565b805190602001209050919050565b3063957122ab612af5604084018461412f565b612b026020860186613db6565b612b1061012087018761412f565b6040518663ffffffff1660e01b8152600401612b30959493929190614905565b60006040518083038186803b158015612b4857600080fd5b505afa925050508015612b59575060015b612bd257612b65614722565b806308c379a003612bc65750612b7961473e565b80612b845750612bc8565b805115612bc2576000816040517f220266b6000000000000000000000000000000000000000000000000000000008152600401610639929190613ffa565b5050565b505b3d6000803e3d6000fd5b50565b6040805160608101825260008082526020820181905291810182905290612bfb846134d1565b90506000612c08846134d1565b825190915073ffffffffffffffffffffffffffffffffffffffff8116612c2c575080515b602080840151604080860151928501519085015191929165ffffffffffff8083169085161015612c5a578193505b8065ffffffffffff168365ffffffffffff161115612c76578092505b50506040805160608101825273ffffffffffffffffffffffffffffffffffffffff909416845265ffffffffffff9283166020850152911690820152925050505b92915050565b60c081015160e082015160009190808203612cd8575092915050565b612ce48248830161354f565b949350505050565b612cf96020830183613db6565b73ffffffffffffffffffffffffffffffffffffffff16815260208083013590820152608080830135604083015260a0830135606083015260c0808401359183019190915260e0808401359183019190915261010083013590820152366000612d6561012085018561412f565b90925090508015612dff576014811015612ddb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152606401610639565b612de9601460008385614434565b612df29161445e565b60601c60a0840152610e34565b600060a084015250505050565b60a0810151600090819073ffffffffffffffffffffffffffffffffffffffff16612e37576001612e3a565b60035b60ff16905060008360800151828560600151028560400151010190508360c00151810292505050919050565b60008060005a8551805191925090612e8b8988612e8660408c018c61412f565b613567565b60a0820151612e9943600052565b600073ffffffffffffffffffffffffffffffffffffffff8216612f025773ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020546dffffffffffffffffffffffffffff16888111612efb57808903612efe565b60005b9150505b606084015160208a01516040517f3a871cdd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861692633a871cdd929091612f62918f918790600401614948565b60206040518083038160008887f193505050508015612fbc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612fb9918101906148ec565b60015b61306657612fc8614722565b806308c379a003612ff95750612fdc61473e565b80612fe75750612ffb565b8b816040516020016121c7919061496d565b505b8a6040517f220266b60000000000000000000000000000000000000000000000000000000081526004016106399181526040602082018190526016908201527f4141323320726576657274656420286f72204f4f472900000000000000000000606082015260800190565b955073ffffffffffffffffffffffffffffffffffffffff82166131695773ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902080546dffffffffffffffffffffffffffff16808a111561312d578c6040517f220266b60000000000000000000000000000000000000000000000000000000081526004016106399181526040602082018190526017908201527f41413231206469646e2774207061792070726566756e64000000000000000000606082015260800190565b81547fffffffffffffffffffffffffffffffffffff000000000000000000000000000016908a90036dffffffffffffffffffffffffffff161790555b5a85039650505050505094509492505050565b825160608181015190916000918481116131f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152606401610639565b60a082015173ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080548784039291906dffffffffffffffffffffffffffff16898110156132a7578c6040517f220266b6000000000000000000000000000000000000000000000000000000008152600401610639918152604060208201819052601e908201527f41413331207061796d6173746572206465706f73697420746f6f206c6f770000606082015260800190565b8981038260000160006101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff1663f465c77e858e8e602001518e6040518563ffffffff1660e01b815260040161332293929190614948565b60006040518083038160008887f19350505050801561338157506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261337e91908101906149b2565b60015b61342b5761338d614722565b806308c379a0036133be57506133a161473e565b806133ac57506133c0565b8d816040516020016121c79190614a3e565b505b8c6040517f220266b60000000000000000000000000000000000000000000000000000000081526004016106399181526040602082018190526016908201527f4141333320726576657274656420286f72204f4f472900000000000000000000606082015260800190565b909e909d509b505050505050505050505050565b6000808260000361345557506000928392509050565b6000613460846134d1565b9050806040015165ffffffffffff164211806134875750806020015165ffffffffffff1642105b905194909350915050565b60603660006134a561014085018561412f565b915091508360208184030360405194506020810185016040528085528082602087013750505050919050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff811660000361350d575065ffffffffffff5b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff909316835260d09490941c602083015265ffffffffffff16928101929092525090565b600081831061355e5781613560565b825b9392505050565b8015610e345782515173ffffffffffffffffffffffffffffffffffffffff81163b156135f857846040517f220266b6000000000000000000000000000000000000000000000000000000008152600401610639918152604060208201819052601f908201527f414131302073656e64657220616c726561647920636f6e737472756374656400606082015260800190565b8351606001516040517f570e1a3600000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163570e1a36919061367690889088906004016144a6565b60206040518083038160008887f1158015613695573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906136ba91906144ba565b905073ffffffffffffffffffffffffffffffffffffffff811661374257856040517f220266b6000000000000000000000000000000000000000000000000000000008152600401610639918152604060208201819052601b908201527f4141313320696e6974436f6465206661696c6564206f72204f4f470000000000606082015260800190565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146137df57856040517f220266b600000000000000000000000000000000000000000000000000000000815260040161063991815260406020808301829052908201527f4141313420696e6974436f6465206d7573742072657475726e2073656e646572606082015260800190565b8073ffffffffffffffffffffffffffffffffffffffff163b60000361386857856040517f220266b600000000000000000000000000000000000000000000000000000000815260040161063991815260406020808301829052908201527f4141313520696e6974436f6465206d757374206372656174652073656e646572606082015260800190565b60006138776014828688614434565b6138809161445e565b60601c90508273ffffffffffffffffffffffffffffffffffffffff1686602001517fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d83896000015160a001516040516138fc92919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b60405180910390a350505050505050565b6040518060a0016040528061398c604051806101000160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b8152602001600080191681526020016000815260200160008152602001600081525090565b6000602082840312156139c357600080fd5b813563ffffffff8116811461356057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810181811067ffffffffffffffff82111715613a2657613a266139d7565b60405250565b610100810181811067ffffffffffffffff82111715613a2657613a266139d7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715613a9157613a916139d7565b6040525050565b600067ffffffffffffffff821115613ab257613ab26139d7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b73ffffffffffffffffffffffffffffffffffffffff81168114612bd257600080fd5b8035613b0b81613ade565b919050565b6000818303610180811215613b2457600080fd5b604051613b3081613a06565b80925061010080831215613b4357600080fd5b6040519250613b5183613a2c565b613b5a85613b00565b835260208501356020840152604085013560408401526060850135606084015260808501356080840152613b9060a08601613b00565b60a084015260c085013560c084015260e085013560e084015282825280850135602083015250610120840135604082015261014084013560608201526101608401356080820152505092915050565b60008083601f840112613bf157600080fd5b50813567ffffffffffffffff811115613c0957600080fd5b602083019150836020828501011115613c2157600080fd5b9250929050565b6000806000806101c08587031215613c3f57600080fd5b843567ffffffffffffffff80821115613c5757600080fd5b818701915087601f830112613c6b57600080fd5b8135613c7681613a98565b604051613c838282613a4d565b8281528a6020848701011115613c9857600080fd5b82602086016020830137600060208483010152809850505050613cbe8860208901613b10565b94506101a0870135915080821115613cd557600080fd5b50613ce287828801613bdf565b95989497509550505050565b60008083601f840112613d0057600080fd5b50813567ffffffffffffffff811115613d1857600080fd5b6020830191508360208260051b8501011115613c2157600080fd5b600080600060408486031215613d4857600080fd5b833567ffffffffffffffff811115613d5f57600080fd5b613d6b86828701613cee565b9094509250506020840135613d7f81613ade565b809150509250925092565b60008060408385031215613d9d57600080fd5b8235613da881613ade565b946020939093013593505050565b600060208284031215613dc857600080fd5b813561356081613ade565b600080600080600060608688031215613deb57600080fd5b853567ffffffffffffffff80821115613e0357600080fd5b613e0f89838a01613bdf565b909750955060208801359150613e2482613ade565b90935060408701359080821115613e3a57600080fd5b50613e4788828901613bdf565b969995985093965092949392505050565b60008060208385031215613e6b57600080fd5b823567ffffffffffffffff811115613e8257600080fd5b613e8e85828601613bdf565b90969095509350505050565b60006101608284031215613ead57600080fd5b50919050565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b612ce484828501613e9a565b60008060008060608587031215613efe57600080fd5b843567ffffffffffffffff80821115613f1657600080fd5b613f2288838901613e9a565b955060208701359150613f3482613ade565b90935060408601359080821115613cd557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115612cb657612cb6613f4a565b60005b83811015613fa7578181015183820152602001613f8f565b50506000910152565b60008151808452613fc8816020860160208601613f8c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b828152604060208201526000612ce46040830184613fb0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea183360301811261407657600080fd5b9190910192915050565b81810381811115612cb657612cb6613f4a565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261407657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126140fc57600080fd5b83018035915067ffffffffffffffff82111561411757600080fd5b6020019150600581901b3603821315613c2157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261416457600080fd5b83018035915067ffffffffffffffff82111561417f57600080fd5b602001915036819003821315613c2157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126141c957600080fd5b830160208101925035905067ffffffffffffffff8111156141e957600080fd5b803603821315613c2157600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061016061426d8461425385613b00565b73ffffffffffffffffffffffffffffffffffffffff169052565b602083013560208501526142846040840184614194565b82604087015261429783870182846141f8565b925050506142a86060840184614194565b85830360608701526142bb8382846141f8565b925050506080830135608085015260a083013560a085015260c083013560c085015260e083013560e085015261010080840135818601525061012061430281850185614194565b868403838801526143148482846141f8565b935050505061014061432881850185614194565b8684038388015261433a8482846141f8565b979650505050505050565b6040808252810184905260006060600586901b830181019083018783805b898110156143e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa087860301845282357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18c36030181126143c3578283fd5b6143cf868d8301614241565b9550506020938401939290920191600101614363565b50505050828103602084015261433a8185876141f8565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361442d5761442d613f4a565b5060010190565b6000808585111561444457600080fd5b8386111561445157600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561449e5780818660140360031b1b83161692505b505092915050565b602081526000612ce46020830184866141f8565b6000602082840312156144cc57600080fd5b815161356081613ade565b65ffffffffffff8181168382160190808211156144f6576144f6613f4a565b5092915050565b8183823760009101908152919050565b868152856020820152600065ffffffffffff8087166040840152808616606084015250831515608083015260c060a083015261454c60c0830184613fb0565b98975050505050505050565b80518252602081015160208301526040810151151560408301526000606082015165ffffffffffff8082166060860152806080850151166080860152505060a082015160c060a0850152612ce460c0850182613fb0565b60006101408083526145c381840189614558565b9150506145dd602083018780518252602090810151910152565b845160608301526020948501516080830152835160a08301529284015160c0820152815173ffffffffffffffffffffffffffffffffffffffff1660e0820152908301518051610100830152909201516101209092019190915292915050565b60e08152600061464f60e0830187614558565b9050614668602083018680518252602090810151910152565b8351606083015260208401516080830152825160a0830152602083015160c083015295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000600385106146fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b848252606060208301526147126060830185613fb0565b9050826040830152949350505050565b600060033d111561473b5760046000803e5060005160e01c5b90565b600060443d101561474c5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561479a57505050505090565b82850191508151818111156147b25750505050505090565b843d87010160208285010111156147cc5750505050505090565b6147db60208286010187613a4d565b509095945050505050565b7f4141353020706f73744f702072657665727465643a200000000000000000000081526000825161481e816016850160208701613f8c565b9190910160160192915050565b60006101c080835261484081840187896141f8565b9050845173ffffffffffffffffffffffffffffffffffffffff808251166020860152602082015160408601526040820151606086015260608201516080860152608082015160a08601528060a08301511660c08601525060c081015160e085015260e08101516101008501525060208501516101208401526040850151610140840152606085015161016084015260808501516101808401528281036101a084015261433a8185613fb0565b6000602082840312156148fe57600080fd5b5051919050565b6060815260006149196060830187896141f8565b73ffffffffffffffffffffffffffffffffffffffff86166020840152828103604084015261454c8185876141f8565b60608152600061495b6060830186614241565b60208301949094525060400152919050565b7f414132332072657665727465643a2000000000000000000000000000000000008152600082516149a581600f850160208701613f8c565b91909101600f0192915050565b600080604083850312156149c557600080fd5b825167ffffffffffffffff8111156149dc57600080fd5b8301601f810185136149ed57600080fd5b80516149f881613a98565b604051614a058282613a4d565b828152876020848601011115614a1a57600080fd5b614a2b836020830160208701613f8c565b6020969096015195979596505050505050565b7f414133332072657665727465643a2000000000000000000000000000000000008152600082516149a581600f850160208701613f8c56fea164736f6c6343000813000a608060405234801561001057600080fd5b506101ea806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063570e1a3614610030575b600080fd5b61004361003e3660046100f9565b61006c565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60008061007c601482858761016b565b61008591610195565b60601c90506000610099846014818861016b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509360209350849250905082850182875af190506000519350806100f057600093505b50505092915050565b6000806020838503121561010c57600080fd5b823567ffffffffffffffff8082111561012457600080fd5b818501915085601f83011261013857600080fd5b81358181111561014757600080fd5b86602082850101111561015957600080fd5b60209290920196919550909350505050565b6000808585111561017b57600080fd5b8386111561018857600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081358181169160148510156101d55780818660140360031b1b83161692505b50509291505056fea164736f6c6343000813000a",
-}
-
-var EntryPointABI = EntryPointMetaData.ABI
-
-var EntryPointBin = EntryPointMetaData.Bin
-
-func DeployEntryPoint(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *EntryPoint, error) {
- parsed, err := EntryPointMetaData.GetAbi()
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- if parsed == nil {
- return common.Address{}, nil, nil, errors.New("GetABI returned nil")
- }
-
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EntryPointBin), backend)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &EntryPoint{address: address, abi: *parsed, EntryPointCaller: EntryPointCaller{contract: contract}, EntryPointTransactor: EntryPointTransactor{contract: contract}, EntryPointFilterer: EntryPointFilterer{contract: contract}}, nil
-}
-
-type EntryPoint struct {
- address common.Address
- abi abi.ABI
- EntryPointCaller
- EntryPointTransactor
- EntryPointFilterer
-}
-
-type EntryPointCaller struct {
- contract *bind.BoundContract
-}
-
-type EntryPointTransactor struct {
- contract *bind.BoundContract
-}
-
-type EntryPointFilterer struct {
- contract *bind.BoundContract
-}
-
-type EntryPointSession struct {
- Contract *EntryPoint
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type EntryPointCallerSession struct {
- Contract *EntryPointCaller
- CallOpts bind.CallOpts
-}
-
-type EntryPointTransactorSession struct {
- Contract *EntryPointTransactor
- TransactOpts bind.TransactOpts
-}
-
-type EntryPointRaw struct {
- Contract *EntryPoint
-}
-
-type EntryPointCallerRaw struct {
- Contract *EntryPointCaller
-}
-
-type EntryPointTransactorRaw struct {
- Contract *EntryPointTransactor
-}
-
-func NewEntryPoint(address common.Address, backend bind.ContractBackend) (*EntryPoint, error) {
- abi, err := abi.JSON(strings.NewReader(EntryPointABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindEntryPoint(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &EntryPoint{address: address, abi: abi, EntryPointCaller: EntryPointCaller{contract: contract}, EntryPointTransactor: EntryPointTransactor{contract: contract}, EntryPointFilterer: EntryPointFilterer{contract: contract}}, nil
-}
-
-func NewEntryPointCaller(address common.Address, caller bind.ContractCaller) (*EntryPointCaller, error) {
- contract, err := bindEntryPoint(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &EntryPointCaller{contract: contract}, nil
-}
-
-func NewEntryPointTransactor(address common.Address, transactor bind.ContractTransactor) (*EntryPointTransactor, error) {
- contract, err := bindEntryPoint(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &EntryPointTransactor{contract: contract}, nil
-}
-
-func NewEntryPointFilterer(address common.Address, filterer bind.ContractFilterer) (*EntryPointFilterer, error) {
- contract, err := bindEntryPoint(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &EntryPointFilterer{contract: contract}, nil
-}
-
-func bindEntryPoint(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := EntryPointMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_EntryPoint *EntryPointRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _EntryPoint.Contract.EntryPointCaller.contract.Call(opts, result, method, params...)
-}
-
-func (_EntryPoint *EntryPointRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _EntryPoint.Contract.EntryPointTransactor.contract.Transfer(opts)
-}
-
-func (_EntryPoint *EntryPointRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _EntryPoint.Contract.EntryPointTransactor.contract.Transact(opts, method, params...)
-}
-
-func (_EntryPoint *EntryPointCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _EntryPoint.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_EntryPoint *EntryPointTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _EntryPoint.Contract.contract.Transfer(opts)
-}
-
-func (_EntryPoint *EntryPointTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _EntryPoint.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_EntryPoint *EntryPointCaller) SIGVALIDATIONFAILED(opts *bind.CallOpts) (*big.Int, error) {
- var out []interface{}
- err := _EntryPoint.contract.Call(opts, &out, "SIG_VALIDATION_FAILED")
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_EntryPoint *EntryPointSession) SIGVALIDATIONFAILED() (*big.Int, error) {
- return _EntryPoint.Contract.SIGVALIDATIONFAILED(&_EntryPoint.CallOpts)
-}
-
-func (_EntryPoint *EntryPointCallerSession) SIGVALIDATIONFAILED() (*big.Int, error) {
- return _EntryPoint.Contract.SIGVALIDATIONFAILED(&_EntryPoint.CallOpts)
-}
-
-func (_EntryPoint *EntryPointCaller) ValidateSenderAndPaymaster(opts *bind.CallOpts, initCode []byte, sender common.Address, paymasterAndData []byte) error {
- var out []interface{}
- err := _EntryPoint.contract.Call(opts, &out, "_validateSenderAndPaymaster", initCode, sender, paymasterAndData)
-
- if err != nil {
- return err
- }
-
- return err
-
-}
-
-func (_EntryPoint *EntryPointSession) ValidateSenderAndPaymaster(initCode []byte, sender common.Address, paymasterAndData []byte) error {
- return _EntryPoint.Contract.ValidateSenderAndPaymaster(&_EntryPoint.CallOpts, initCode, sender, paymasterAndData)
-}
-
-func (_EntryPoint *EntryPointCallerSession) ValidateSenderAndPaymaster(initCode []byte, sender common.Address, paymasterAndData []byte) error {
- return _EntryPoint.Contract.ValidateSenderAndPaymaster(&_EntryPoint.CallOpts, initCode, sender, paymasterAndData)
-}
-
-func (_EntryPoint *EntryPointCaller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) {
- var out []interface{}
- err := _EntryPoint.contract.Call(opts, &out, "balanceOf", account)
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_EntryPoint *EntryPointSession) BalanceOf(account common.Address) (*big.Int, error) {
- return _EntryPoint.Contract.BalanceOf(&_EntryPoint.CallOpts, account)
-}
-
-func (_EntryPoint *EntryPointCallerSession) BalanceOf(account common.Address) (*big.Int, error) {
- return _EntryPoint.Contract.BalanceOf(&_EntryPoint.CallOpts, account)
-}
-
-func (_EntryPoint *EntryPointCaller) Deposits(opts *bind.CallOpts, arg0 common.Address) (Deposits,
-
- error) {
- var out []interface{}
- err := _EntryPoint.contract.Call(opts, &out, "deposits", arg0)
-
- outstruct := new(Deposits)
- if err != nil {
- return *outstruct, err
- }
-
- outstruct.Deposit = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
- outstruct.Staked = *abi.ConvertType(out[1], new(bool)).(*bool)
- outstruct.Stake = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
- outstruct.UnstakeDelaySec = *abi.ConvertType(out[3], new(uint32)).(*uint32)
- outstruct.WithdrawTime = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int)
-
- return *outstruct, err
-
-}
-
-func (_EntryPoint *EntryPointSession) Deposits(arg0 common.Address) (Deposits,
-
- error) {
- return _EntryPoint.Contract.Deposits(&_EntryPoint.CallOpts, arg0)
-}
-
-func (_EntryPoint *EntryPointCallerSession) Deposits(arg0 common.Address) (Deposits,
-
- error) {
- return _EntryPoint.Contract.Deposits(&_EntryPoint.CallOpts, arg0)
-}
-
-func (_EntryPoint *EntryPointCaller) GetDepositInfo(opts *bind.CallOpts, account common.Address) (IStakeManagerDepositInfo, error) {
- var out []interface{}
- err := _EntryPoint.contract.Call(opts, &out, "getDepositInfo", account)
-
- if err != nil {
- return *new(IStakeManagerDepositInfo), err
- }
-
- out0 := *abi.ConvertType(out[0], new(IStakeManagerDepositInfo)).(*IStakeManagerDepositInfo)
-
- return out0, err
-
-}
-
-func (_EntryPoint *EntryPointSession) GetDepositInfo(account common.Address) (IStakeManagerDepositInfo, error) {
- return _EntryPoint.Contract.GetDepositInfo(&_EntryPoint.CallOpts, account)
-}
-
-func (_EntryPoint *EntryPointCallerSession) GetDepositInfo(account common.Address) (IStakeManagerDepositInfo, error) {
- return _EntryPoint.Contract.GetDepositInfo(&_EntryPoint.CallOpts, account)
-}
-
-func (_EntryPoint *EntryPointCaller) GetUserOpHash(opts *bind.CallOpts, userOp UserOperation) ([32]byte, error) {
- var out []interface{}
- err := _EntryPoint.contract.Call(opts, &out, "getUserOpHash", userOp)
-
- if err != nil {
- return *new([32]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
- return out0, err
-
-}
-
-func (_EntryPoint *EntryPointSession) GetUserOpHash(userOp UserOperation) ([32]byte, error) {
- return _EntryPoint.Contract.GetUserOpHash(&_EntryPoint.CallOpts, userOp)
-}
-
-func (_EntryPoint *EntryPointCallerSession) GetUserOpHash(userOp UserOperation) ([32]byte, error) {
- return _EntryPoint.Contract.GetUserOpHash(&_EntryPoint.CallOpts, userOp)
-}
-
-func (_EntryPoint *EntryPointTransactor) AddStake(opts *bind.TransactOpts, unstakeDelaySec uint32) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "addStake", unstakeDelaySec)
-}
-
-func (_EntryPoint *EntryPointSession) AddStake(unstakeDelaySec uint32) (*types.Transaction, error) {
- return _EntryPoint.Contract.AddStake(&_EntryPoint.TransactOpts, unstakeDelaySec)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) AddStake(unstakeDelaySec uint32) (*types.Transaction, error) {
- return _EntryPoint.Contract.AddStake(&_EntryPoint.TransactOpts, unstakeDelaySec)
-}
-
-func (_EntryPoint *EntryPointTransactor) DepositTo(opts *bind.TransactOpts, account common.Address) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "depositTo", account)
-}
-
-func (_EntryPoint *EntryPointSession) DepositTo(account common.Address) (*types.Transaction, error) {
- return _EntryPoint.Contract.DepositTo(&_EntryPoint.TransactOpts, account)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) DepositTo(account common.Address) (*types.Transaction, error) {
- return _EntryPoint.Contract.DepositTo(&_EntryPoint.TransactOpts, account)
-}
-
-func (_EntryPoint *EntryPointTransactor) GetSenderAddress(opts *bind.TransactOpts, initCode []byte) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "getSenderAddress", initCode)
-}
-
-func (_EntryPoint *EntryPointSession) GetSenderAddress(initCode []byte) (*types.Transaction, error) {
- return _EntryPoint.Contract.GetSenderAddress(&_EntryPoint.TransactOpts, initCode)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) GetSenderAddress(initCode []byte) (*types.Transaction, error) {
- return _EntryPoint.Contract.GetSenderAddress(&_EntryPoint.TransactOpts, initCode)
-}
-
-func (_EntryPoint *EntryPointTransactor) HandleAggregatedOps(opts *bind.TransactOpts, opsPerAggregator []IEntryPointUserOpsPerAggregator, beneficiary common.Address) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "handleAggregatedOps", opsPerAggregator, beneficiary)
-}
-
-func (_EntryPoint *EntryPointSession) HandleAggregatedOps(opsPerAggregator []IEntryPointUserOpsPerAggregator, beneficiary common.Address) (*types.Transaction, error) {
- return _EntryPoint.Contract.HandleAggregatedOps(&_EntryPoint.TransactOpts, opsPerAggregator, beneficiary)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) HandleAggregatedOps(opsPerAggregator []IEntryPointUserOpsPerAggregator, beneficiary common.Address) (*types.Transaction, error) {
- return _EntryPoint.Contract.HandleAggregatedOps(&_EntryPoint.TransactOpts, opsPerAggregator, beneficiary)
-}
-
-func (_EntryPoint *EntryPointTransactor) HandleOps(opts *bind.TransactOpts, ops []UserOperation, beneficiary common.Address) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "handleOps", ops, beneficiary)
-}
-
-func (_EntryPoint *EntryPointSession) HandleOps(ops []UserOperation, beneficiary common.Address) (*types.Transaction, error) {
- return _EntryPoint.Contract.HandleOps(&_EntryPoint.TransactOpts, ops, beneficiary)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) HandleOps(ops []UserOperation, beneficiary common.Address) (*types.Transaction, error) {
- return _EntryPoint.Contract.HandleOps(&_EntryPoint.TransactOpts, ops, beneficiary)
-}
-
-func (_EntryPoint *EntryPointTransactor) InnerHandleOp(opts *bind.TransactOpts, callData []byte, opInfo EntryPointUserOpInfo, context []byte) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "innerHandleOp", callData, opInfo, context)
-}
-
-func (_EntryPoint *EntryPointSession) InnerHandleOp(callData []byte, opInfo EntryPointUserOpInfo, context []byte) (*types.Transaction, error) {
- return _EntryPoint.Contract.InnerHandleOp(&_EntryPoint.TransactOpts, callData, opInfo, context)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) InnerHandleOp(callData []byte, opInfo EntryPointUserOpInfo, context []byte) (*types.Transaction, error) {
- return _EntryPoint.Contract.InnerHandleOp(&_EntryPoint.TransactOpts, callData, opInfo, context)
-}
-
-func (_EntryPoint *EntryPointTransactor) SimulateHandleOp(opts *bind.TransactOpts, op UserOperation, target common.Address, targetCallData []byte) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "simulateHandleOp", op, target, targetCallData)
-}
-
-func (_EntryPoint *EntryPointSession) SimulateHandleOp(op UserOperation, target common.Address, targetCallData []byte) (*types.Transaction, error) {
- return _EntryPoint.Contract.SimulateHandleOp(&_EntryPoint.TransactOpts, op, target, targetCallData)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) SimulateHandleOp(op UserOperation, target common.Address, targetCallData []byte) (*types.Transaction, error) {
- return _EntryPoint.Contract.SimulateHandleOp(&_EntryPoint.TransactOpts, op, target, targetCallData)
-}
-
-func (_EntryPoint *EntryPointTransactor) SimulateValidation(opts *bind.TransactOpts, userOp UserOperation) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "simulateValidation", userOp)
-}
-
-func (_EntryPoint *EntryPointSession) SimulateValidation(userOp UserOperation) (*types.Transaction, error) {
- return _EntryPoint.Contract.SimulateValidation(&_EntryPoint.TransactOpts, userOp)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) SimulateValidation(userOp UserOperation) (*types.Transaction, error) {
- return _EntryPoint.Contract.SimulateValidation(&_EntryPoint.TransactOpts, userOp)
-}
-
-func (_EntryPoint *EntryPointTransactor) UnlockStake(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "unlockStake")
-}
-
-func (_EntryPoint *EntryPointSession) UnlockStake() (*types.Transaction, error) {
- return _EntryPoint.Contract.UnlockStake(&_EntryPoint.TransactOpts)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) UnlockStake() (*types.Transaction, error) {
- return _EntryPoint.Contract.UnlockStake(&_EntryPoint.TransactOpts)
-}
-
-func (_EntryPoint *EntryPointTransactor) WithdrawStake(opts *bind.TransactOpts, withdrawAddress common.Address) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "withdrawStake", withdrawAddress)
-}
-
-func (_EntryPoint *EntryPointSession) WithdrawStake(withdrawAddress common.Address) (*types.Transaction, error) {
- return _EntryPoint.Contract.WithdrawStake(&_EntryPoint.TransactOpts, withdrawAddress)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) WithdrawStake(withdrawAddress common.Address) (*types.Transaction, error) {
- return _EntryPoint.Contract.WithdrawStake(&_EntryPoint.TransactOpts, withdrawAddress)
-}
-
-func (_EntryPoint *EntryPointTransactor) WithdrawTo(opts *bind.TransactOpts, withdrawAddress common.Address, withdrawAmount *big.Int) (*types.Transaction, error) {
- return _EntryPoint.contract.Transact(opts, "withdrawTo", withdrawAddress, withdrawAmount)
-}
-
-func (_EntryPoint *EntryPointSession) WithdrawTo(withdrawAddress common.Address, withdrawAmount *big.Int) (*types.Transaction, error) {
- return _EntryPoint.Contract.WithdrawTo(&_EntryPoint.TransactOpts, withdrawAddress, withdrawAmount)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) WithdrawTo(withdrawAddress common.Address, withdrawAmount *big.Int) (*types.Transaction, error) {
- return _EntryPoint.Contract.WithdrawTo(&_EntryPoint.TransactOpts, withdrawAddress, withdrawAmount)
-}
-
-func (_EntryPoint *EntryPointTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _EntryPoint.contract.RawTransact(opts, nil)
-}
-
-func (_EntryPoint *EntryPointSession) Receive() (*types.Transaction, error) {
- return _EntryPoint.Contract.Receive(&_EntryPoint.TransactOpts)
-}
-
-func (_EntryPoint *EntryPointTransactorSession) Receive() (*types.Transaction, error) {
- return _EntryPoint.Contract.Receive(&_EntryPoint.TransactOpts)
-}
-
-type EntryPointAccountDeployedIterator struct {
- Event *EntryPointAccountDeployed
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointAccountDeployedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointAccountDeployed)
- 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(EntryPointAccountDeployed)
- 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 *EntryPointAccountDeployedIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointAccountDeployedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointAccountDeployed struct {
- UserOpHash [32]byte
- Sender common.Address
- Factory common.Address
- Paymaster common.Address
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterAccountDeployed(opts *bind.FilterOpts, userOpHash [][32]byte, sender []common.Address) (*EntryPointAccountDeployedIterator, error) {
-
- var userOpHashRule []interface{}
- for _, userOpHashItem := range userOpHash {
- userOpHashRule = append(userOpHashRule, userOpHashItem)
- }
- var senderRule []interface{}
- for _, senderItem := range sender {
- senderRule = append(senderRule, senderItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "AccountDeployed", userOpHashRule, senderRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointAccountDeployedIterator{contract: _EntryPoint.contract, event: "AccountDeployed", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchAccountDeployed(opts *bind.WatchOpts, sink chan<- *EntryPointAccountDeployed, userOpHash [][32]byte, sender []common.Address) (event.Subscription, error) {
-
- var userOpHashRule []interface{}
- for _, userOpHashItem := range userOpHash {
- userOpHashRule = append(userOpHashRule, userOpHashItem)
- }
- var senderRule []interface{}
- for _, senderItem := range sender {
- senderRule = append(senderRule, senderItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "AccountDeployed", userOpHashRule, senderRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointAccountDeployed)
- if err := _EntryPoint.contract.UnpackLog(event, "AccountDeployed", 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 (_EntryPoint *EntryPointFilterer) ParseAccountDeployed(log types.Log) (*EntryPointAccountDeployed, error) {
- event := new(EntryPointAccountDeployed)
- if err := _EntryPoint.contract.UnpackLog(event, "AccountDeployed", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type EntryPointDepositedIterator struct {
- Event *EntryPointDeposited
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointDepositedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointDeposited)
- 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(EntryPointDeposited)
- 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 *EntryPointDepositedIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointDepositedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointDeposited struct {
- Account common.Address
- TotalDeposit *big.Int
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterDeposited(opts *bind.FilterOpts, account []common.Address) (*EntryPointDepositedIterator, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "Deposited", accountRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointDepositedIterator{contract: _EntryPoint.contract, event: "Deposited", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchDeposited(opts *bind.WatchOpts, sink chan<- *EntryPointDeposited, account []common.Address) (event.Subscription, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "Deposited", accountRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointDeposited)
- if err := _EntryPoint.contract.UnpackLog(event, "Deposited", 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 (_EntryPoint *EntryPointFilterer) ParseDeposited(log types.Log) (*EntryPointDeposited, error) {
- event := new(EntryPointDeposited)
- if err := _EntryPoint.contract.UnpackLog(event, "Deposited", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type EntryPointSignatureAggregatorChangedIterator struct {
- Event *EntryPointSignatureAggregatorChanged
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointSignatureAggregatorChangedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointSignatureAggregatorChanged)
- 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(EntryPointSignatureAggregatorChanged)
- 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 *EntryPointSignatureAggregatorChangedIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointSignatureAggregatorChangedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointSignatureAggregatorChanged struct {
- Aggregator common.Address
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterSignatureAggregatorChanged(opts *bind.FilterOpts, aggregator []common.Address) (*EntryPointSignatureAggregatorChangedIterator, error) {
-
- var aggregatorRule []interface{}
- for _, aggregatorItem := range aggregator {
- aggregatorRule = append(aggregatorRule, aggregatorItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "SignatureAggregatorChanged", aggregatorRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointSignatureAggregatorChangedIterator{contract: _EntryPoint.contract, event: "SignatureAggregatorChanged", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchSignatureAggregatorChanged(opts *bind.WatchOpts, sink chan<- *EntryPointSignatureAggregatorChanged, aggregator []common.Address) (event.Subscription, error) {
-
- var aggregatorRule []interface{}
- for _, aggregatorItem := range aggregator {
- aggregatorRule = append(aggregatorRule, aggregatorItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "SignatureAggregatorChanged", aggregatorRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointSignatureAggregatorChanged)
- if err := _EntryPoint.contract.UnpackLog(event, "SignatureAggregatorChanged", 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 (_EntryPoint *EntryPointFilterer) ParseSignatureAggregatorChanged(log types.Log) (*EntryPointSignatureAggregatorChanged, error) {
- event := new(EntryPointSignatureAggregatorChanged)
- if err := _EntryPoint.contract.UnpackLog(event, "SignatureAggregatorChanged", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type EntryPointStakeLockedIterator struct {
- Event *EntryPointStakeLocked
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointStakeLockedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointStakeLocked)
- 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(EntryPointStakeLocked)
- 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 *EntryPointStakeLockedIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointStakeLockedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointStakeLocked struct {
- Account common.Address
- TotalStaked *big.Int
- UnstakeDelaySec *big.Int
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterStakeLocked(opts *bind.FilterOpts, account []common.Address) (*EntryPointStakeLockedIterator, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "StakeLocked", accountRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointStakeLockedIterator{contract: _EntryPoint.contract, event: "StakeLocked", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchStakeLocked(opts *bind.WatchOpts, sink chan<- *EntryPointStakeLocked, account []common.Address) (event.Subscription, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "StakeLocked", accountRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointStakeLocked)
- if err := _EntryPoint.contract.UnpackLog(event, "StakeLocked", 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 (_EntryPoint *EntryPointFilterer) ParseStakeLocked(log types.Log) (*EntryPointStakeLocked, error) {
- event := new(EntryPointStakeLocked)
- if err := _EntryPoint.contract.UnpackLog(event, "StakeLocked", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type EntryPointStakeUnlockedIterator struct {
- Event *EntryPointStakeUnlocked
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointStakeUnlockedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointStakeUnlocked)
- 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(EntryPointStakeUnlocked)
- 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 *EntryPointStakeUnlockedIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointStakeUnlockedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointStakeUnlocked struct {
- Account common.Address
- WithdrawTime *big.Int
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterStakeUnlocked(opts *bind.FilterOpts, account []common.Address) (*EntryPointStakeUnlockedIterator, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "StakeUnlocked", accountRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointStakeUnlockedIterator{contract: _EntryPoint.contract, event: "StakeUnlocked", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchStakeUnlocked(opts *bind.WatchOpts, sink chan<- *EntryPointStakeUnlocked, account []common.Address) (event.Subscription, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "StakeUnlocked", accountRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointStakeUnlocked)
- if err := _EntryPoint.contract.UnpackLog(event, "StakeUnlocked", 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 (_EntryPoint *EntryPointFilterer) ParseStakeUnlocked(log types.Log) (*EntryPointStakeUnlocked, error) {
- event := new(EntryPointStakeUnlocked)
- if err := _EntryPoint.contract.UnpackLog(event, "StakeUnlocked", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type EntryPointStakeWithdrawnIterator struct {
- Event *EntryPointStakeWithdrawn
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointStakeWithdrawnIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointStakeWithdrawn)
- 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(EntryPointStakeWithdrawn)
- 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 *EntryPointStakeWithdrawnIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointStakeWithdrawnIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointStakeWithdrawn struct {
- Account common.Address
- WithdrawAddress common.Address
- Amount *big.Int
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterStakeWithdrawn(opts *bind.FilterOpts, account []common.Address) (*EntryPointStakeWithdrawnIterator, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "StakeWithdrawn", accountRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointStakeWithdrawnIterator{contract: _EntryPoint.contract, event: "StakeWithdrawn", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchStakeWithdrawn(opts *bind.WatchOpts, sink chan<- *EntryPointStakeWithdrawn, account []common.Address) (event.Subscription, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "StakeWithdrawn", accountRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointStakeWithdrawn)
- if err := _EntryPoint.contract.UnpackLog(event, "StakeWithdrawn", 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 (_EntryPoint *EntryPointFilterer) ParseStakeWithdrawn(log types.Log) (*EntryPointStakeWithdrawn, error) {
- event := new(EntryPointStakeWithdrawn)
- if err := _EntryPoint.contract.UnpackLog(event, "StakeWithdrawn", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type EntryPointUserOperationEventIterator struct {
- Event *EntryPointUserOperationEvent
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointUserOperationEventIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointUserOperationEvent)
- 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(EntryPointUserOperationEvent)
- 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 *EntryPointUserOperationEventIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointUserOperationEventIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointUserOperationEvent struct {
- UserOpHash [32]byte
- Sender common.Address
- Paymaster common.Address
- Nonce *big.Int
- Success bool
- ActualGasCost *big.Int
- ActualGasUsed *big.Int
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterUserOperationEvent(opts *bind.FilterOpts, userOpHash [][32]byte, sender []common.Address, paymaster []common.Address) (*EntryPointUserOperationEventIterator, error) {
-
- var userOpHashRule []interface{}
- for _, userOpHashItem := range userOpHash {
- userOpHashRule = append(userOpHashRule, userOpHashItem)
- }
- var senderRule []interface{}
- for _, senderItem := range sender {
- senderRule = append(senderRule, senderItem)
- }
- var paymasterRule []interface{}
- for _, paymasterItem := range paymaster {
- paymasterRule = append(paymasterRule, paymasterItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "UserOperationEvent", userOpHashRule, senderRule, paymasterRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointUserOperationEventIterator{contract: _EntryPoint.contract, event: "UserOperationEvent", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchUserOperationEvent(opts *bind.WatchOpts, sink chan<- *EntryPointUserOperationEvent, userOpHash [][32]byte, sender []common.Address, paymaster []common.Address) (event.Subscription, error) {
-
- var userOpHashRule []interface{}
- for _, userOpHashItem := range userOpHash {
- userOpHashRule = append(userOpHashRule, userOpHashItem)
- }
- var senderRule []interface{}
- for _, senderItem := range sender {
- senderRule = append(senderRule, senderItem)
- }
- var paymasterRule []interface{}
- for _, paymasterItem := range paymaster {
- paymasterRule = append(paymasterRule, paymasterItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "UserOperationEvent", userOpHashRule, senderRule, paymasterRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointUserOperationEvent)
- if err := _EntryPoint.contract.UnpackLog(event, "UserOperationEvent", 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 (_EntryPoint *EntryPointFilterer) ParseUserOperationEvent(log types.Log) (*EntryPointUserOperationEvent, error) {
- event := new(EntryPointUserOperationEvent)
- if err := _EntryPoint.contract.UnpackLog(event, "UserOperationEvent", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type EntryPointUserOperationRevertReasonIterator struct {
- Event *EntryPointUserOperationRevertReason
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointUserOperationRevertReasonIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointUserOperationRevertReason)
- 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(EntryPointUserOperationRevertReason)
- 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 *EntryPointUserOperationRevertReasonIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointUserOperationRevertReasonIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointUserOperationRevertReason struct {
- UserOpHash [32]byte
- Sender common.Address
- Nonce *big.Int
- RevertReason []byte
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterUserOperationRevertReason(opts *bind.FilterOpts, userOpHash [][32]byte, sender []common.Address) (*EntryPointUserOperationRevertReasonIterator, error) {
-
- var userOpHashRule []interface{}
- for _, userOpHashItem := range userOpHash {
- userOpHashRule = append(userOpHashRule, userOpHashItem)
- }
- var senderRule []interface{}
- for _, senderItem := range sender {
- senderRule = append(senderRule, senderItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "UserOperationRevertReason", userOpHashRule, senderRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointUserOperationRevertReasonIterator{contract: _EntryPoint.contract, event: "UserOperationRevertReason", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchUserOperationRevertReason(opts *bind.WatchOpts, sink chan<- *EntryPointUserOperationRevertReason, userOpHash [][32]byte, sender []common.Address) (event.Subscription, error) {
-
- var userOpHashRule []interface{}
- for _, userOpHashItem := range userOpHash {
- userOpHashRule = append(userOpHashRule, userOpHashItem)
- }
- var senderRule []interface{}
- for _, senderItem := range sender {
- senderRule = append(senderRule, senderItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "UserOperationRevertReason", userOpHashRule, senderRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointUserOperationRevertReason)
- if err := _EntryPoint.contract.UnpackLog(event, "UserOperationRevertReason", 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 (_EntryPoint *EntryPointFilterer) ParseUserOperationRevertReason(log types.Log) (*EntryPointUserOperationRevertReason, error) {
- event := new(EntryPointUserOperationRevertReason)
- if err := _EntryPoint.contract.UnpackLog(event, "UserOperationRevertReason", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type EntryPointWithdrawnIterator struct {
- Event *EntryPointWithdrawn
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EntryPointWithdrawnIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EntryPointWithdrawn)
- 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(EntryPointWithdrawn)
- 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 *EntryPointWithdrawnIterator) Error() error {
- return it.fail
-}
-
-func (it *EntryPointWithdrawnIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EntryPointWithdrawn struct {
- Account common.Address
- WithdrawAddress common.Address
- Amount *big.Int
- Raw types.Log
-}
-
-func (_EntryPoint *EntryPointFilterer) FilterWithdrawn(opts *bind.FilterOpts, account []common.Address) (*EntryPointWithdrawnIterator, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.FilterLogs(opts, "Withdrawn", accountRule)
- if err != nil {
- return nil, err
- }
- return &EntryPointWithdrawnIterator{contract: _EntryPoint.contract, event: "Withdrawn", logs: logs, sub: sub}, nil
-}
-
-func (_EntryPoint *EntryPointFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *EntryPointWithdrawn, account []common.Address) (event.Subscription, error) {
-
- var accountRule []interface{}
- for _, accountItem := range account {
- accountRule = append(accountRule, accountItem)
- }
-
- logs, sub, err := _EntryPoint.contract.WatchLogs(opts, "Withdrawn", accountRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EntryPointWithdrawn)
- if err := _EntryPoint.contract.UnpackLog(event, "Withdrawn", 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 (_EntryPoint *EntryPointFilterer) ParseWithdrawn(log types.Log) (*EntryPointWithdrawn, error) {
- event := new(EntryPointWithdrawn)
- if err := _EntryPoint.contract.UnpackLog(event, "Withdrawn", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type Deposits struct {
- Deposit *big.Int
- Staked bool
- Stake *big.Int
- UnstakeDelaySec uint32
- WithdrawTime *big.Int
-}
-
-func (_EntryPoint *EntryPoint) ParseLog(log types.Log) (generated.AbigenLog, error) {
- switch log.Topics[0] {
- case _EntryPoint.abi.Events["AccountDeployed"].ID:
- return _EntryPoint.ParseAccountDeployed(log)
- case _EntryPoint.abi.Events["Deposited"].ID:
- return _EntryPoint.ParseDeposited(log)
- case _EntryPoint.abi.Events["SignatureAggregatorChanged"].ID:
- return _EntryPoint.ParseSignatureAggregatorChanged(log)
- case _EntryPoint.abi.Events["StakeLocked"].ID:
- return _EntryPoint.ParseStakeLocked(log)
- case _EntryPoint.abi.Events["StakeUnlocked"].ID:
- return _EntryPoint.ParseStakeUnlocked(log)
- case _EntryPoint.abi.Events["StakeWithdrawn"].ID:
- return _EntryPoint.ParseStakeWithdrawn(log)
- case _EntryPoint.abi.Events["UserOperationEvent"].ID:
- return _EntryPoint.ParseUserOperationEvent(log)
- case _EntryPoint.abi.Events["UserOperationRevertReason"].ID:
- return _EntryPoint.ParseUserOperationRevertReason(log)
- case _EntryPoint.abi.Events["Withdrawn"].ID:
- return _EntryPoint.ParseWithdrawn(log)
-
- default:
- return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
- }
-}
-
-func (EntryPointAccountDeployed) Topic() common.Hash {
- return common.HexToHash("0xd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d")
-}
-
-func (EntryPointDeposited) Topic() common.Hash {
- return common.HexToHash("0x2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4")
-}
-
-func (EntryPointSignatureAggregatorChanged) Topic() common.Hash {
- return common.HexToHash("0x575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d")
-}
-
-func (EntryPointStakeLocked) Topic() common.Hash {
- return common.HexToHash("0xa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01")
-}
-
-func (EntryPointStakeUnlocked) Topic() common.Hash {
- return common.HexToHash("0xfa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a")
-}
-
-func (EntryPointStakeWithdrawn) Topic() common.Hash {
- return common.HexToHash("0xb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3")
-}
-
-func (EntryPointUserOperationEvent) Topic() common.Hash {
- return common.HexToHash("0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f")
-}
-
-func (EntryPointUserOperationRevertReason) Topic() common.Hash {
- return common.HexToHash("0x1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201")
-}
-
-func (EntryPointWithdrawn) Topic() common.Hash {
- return common.HexToHash("0xd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb")
-}
-
-func (_EntryPoint *EntryPoint) Address() common.Address {
- return _EntryPoint.address
-}
-
-type EntryPointInterface interface {
- SIGVALIDATIONFAILED(opts *bind.CallOpts) (*big.Int, error)
-
- ValidateSenderAndPaymaster(opts *bind.CallOpts, initCode []byte, sender common.Address, paymasterAndData []byte) error
-
- BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error)
-
- Deposits(opts *bind.CallOpts, arg0 common.Address) (Deposits,
-
- error)
-
- GetDepositInfo(opts *bind.CallOpts, account common.Address) (IStakeManagerDepositInfo, error)
-
- GetUserOpHash(opts *bind.CallOpts, userOp UserOperation) ([32]byte, error)
-
- AddStake(opts *bind.TransactOpts, unstakeDelaySec uint32) (*types.Transaction, error)
-
- DepositTo(opts *bind.TransactOpts, account common.Address) (*types.Transaction, error)
-
- GetSenderAddress(opts *bind.TransactOpts, initCode []byte) (*types.Transaction, error)
-
- HandleAggregatedOps(opts *bind.TransactOpts, opsPerAggregator []IEntryPointUserOpsPerAggregator, beneficiary common.Address) (*types.Transaction, error)
-
- HandleOps(opts *bind.TransactOpts, ops []UserOperation, beneficiary common.Address) (*types.Transaction, error)
-
- InnerHandleOp(opts *bind.TransactOpts, callData []byte, opInfo EntryPointUserOpInfo, context []byte) (*types.Transaction, error)
-
- SimulateHandleOp(opts *bind.TransactOpts, op UserOperation, target common.Address, targetCallData []byte) (*types.Transaction, error)
-
- SimulateValidation(opts *bind.TransactOpts, userOp UserOperation) (*types.Transaction, error)
-
- UnlockStake(opts *bind.TransactOpts) (*types.Transaction, error)
-
- WithdrawStake(opts *bind.TransactOpts, withdrawAddress common.Address) (*types.Transaction, error)
-
- WithdrawTo(opts *bind.TransactOpts, withdrawAddress common.Address, withdrawAmount *big.Int) (*types.Transaction, error)
-
- Receive(opts *bind.TransactOpts) (*types.Transaction, error)
-
- FilterAccountDeployed(opts *bind.FilterOpts, userOpHash [][32]byte, sender []common.Address) (*EntryPointAccountDeployedIterator, error)
-
- WatchAccountDeployed(opts *bind.WatchOpts, sink chan<- *EntryPointAccountDeployed, userOpHash [][32]byte, sender []common.Address) (event.Subscription, error)
-
- ParseAccountDeployed(log types.Log) (*EntryPointAccountDeployed, error)
-
- FilterDeposited(opts *bind.FilterOpts, account []common.Address) (*EntryPointDepositedIterator, error)
-
- WatchDeposited(opts *bind.WatchOpts, sink chan<- *EntryPointDeposited, account []common.Address) (event.Subscription, error)
-
- ParseDeposited(log types.Log) (*EntryPointDeposited, error)
-
- FilterSignatureAggregatorChanged(opts *bind.FilterOpts, aggregator []common.Address) (*EntryPointSignatureAggregatorChangedIterator, error)
-
- WatchSignatureAggregatorChanged(opts *bind.WatchOpts, sink chan<- *EntryPointSignatureAggregatorChanged, aggregator []common.Address) (event.Subscription, error)
-
- ParseSignatureAggregatorChanged(log types.Log) (*EntryPointSignatureAggregatorChanged, error)
-
- FilterStakeLocked(opts *bind.FilterOpts, account []common.Address) (*EntryPointStakeLockedIterator, error)
-
- WatchStakeLocked(opts *bind.WatchOpts, sink chan<- *EntryPointStakeLocked, account []common.Address) (event.Subscription, error)
-
- ParseStakeLocked(log types.Log) (*EntryPointStakeLocked, error)
-
- FilterStakeUnlocked(opts *bind.FilterOpts, account []common.Address) (*EntryPointStakeUnlockedIterator, error)
-
- WatchStakeUnlocked(opts *bind.WatchOpts, sink chan<- *EntryPointStakeUnlocked, account []common.Address) (event.Subscription, error)
-
- ParseStakeUnlocked(log types.Log) (*EntryPointStakeUnlocked, error)
-
- FilterStakeWithdrawn(opts *bind.FilterOpts, account []common.Address) (*EntryPointStakeWithdrawnIterator, error)
-
- WatchStakeWithdrawn(opts *bind.WatchOpts, sink chan<- *EntryPointStakeWithdrawn, account []common.Address) (event.Subscription, error)
-
- ParseStakeWithdrawn(log types.Log) (*EntryPointStakeWithdrawn, error)
-
- FilterUserOperationEvent(opts *bind.FilterOpts, userOpHash [][32]byte, sender []common.Address, paymaster []common.Address) (*EntryPointUserOperationEventIterator, error)
-
- WatchUserOperationEvent(opts *bind.WatchOpts, sink chan<- *EntryPointUserOperationEvent, userOpHash [][32]byte, sender []common.Address, paymaster []common.Address) (event.Subscription, error)
-
- ParseUserOperationEvent(log types.Log) (*EntryPointUserOperationEvent, error)
-
- FilterUserOperationRevertReason(opts *bind.FilterOpts, userOpHash [][32]byte, sender []common.Address) (*EntryPointUserOperationRevertReasonIterator, error)
-
- WatchUserOperationRevertReason(opts *bind.WatchOpts, sink chan<- *EntryPointUserOperationRevertReason, userOpHash [][32]byte, sender []common.Address) (event.Subscription, error)
-
- ParseUserOperationRevertReason(log types.Log) (*EntryPointUserOperationRevertReason, error)
-
- FilterWithdrawn(opts *bind.FilterOpts, account []common.Address) (*EntryPointWithdrawnIterator, error)
-
- WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *EntryPointWithdrawn, account []common.Address) (event.Subscription, error)
-
- ParseWithdrawn(log types.Log) (*EntryPointWithdrawn, error)
-
- ParseLog(log types.Log) (generated.AbigenLog, error)
-
- Address() common.Address
-}
diff --git a/core/gethwrappers/transmission/generated/greeter_wrapper/greeter_wrapper.go b/core/gethwrappers/transmission/generated/greeter_wrapper/greeter_wrapper.go
deleted file mode 100644
index 0f9e4a7719d..00000000000
--- a/core/gethwrappers/transmission/generated/greeter_wrapper/greeter_wrapper.go
+++ /dev/null
@@ -1,216 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package greeter_wrapper
-
-import (
- "errors"
- "math/big"
- "strings"
-
- ethereum "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/event"
-)
-
-var (
- _ = errors.New
- _ = big.NewInt
- _ = strings.NewReader
- _ = ethereum.NotFound
- _ = bind.Bind
- _ = common.Big1
- _ = types.BloomLookup
- _ = event.NewSubscription
- _ = abi.ConvertType
-)
-
-var GreeterMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"name\":\"getGreeting\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"greeting\",\"type\":\"string\"}],\"name\":\"setGreeting\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b50610443806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063fe50cc7214610050575b600080fd5b61004e61004936600461013f565b61006e565b005b61005861007e565b604051610065919061020e565b60405180910390f35b600061007a828261031c565b5050565b60606000805461008d9061027a565b80601f01602080910402602001604051908101604052809291908181526020018280546100b99061027a565b80156101065780601f106100db57610100808354040283529160200191610106565b820191906000526020600020905b8154815290600101906020018083116100e957829003601f168201915b5050505050905090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561015157600080fd5b813567ffffffffffffffff8082111561016957600080fd5b818401915084601f83011261017d57600080fd5b81358181111561018f5761018f610110565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101d5576101d5610110565b816040528281528760208487010111156101ee57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561023b5785810183015185820160400152820161021f565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b600181811c9082168061028e57607f821691505b6020821081036102c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561031757600081815260208120601f850160051c810160208610156102f45750805b601f850160051c820191505b8181101561031357828155600101610300565b5050505b505050565b815167ffffffffffffffff81111561033657610336610110565b61034a81610344845461027a565b846102cd565b602080601f83116001811461039d57600084156103675750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610313565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156103ea578886015182559484019460019091019084016103cb565b508582101561042657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000813000a",
-}
-
-var GreeterABI = GreeterMetaData.ABI
-
-var GreeterBin = GreeterMetaData.Bin
-
-func DeployGreeter(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Greeter, error) {
- parsed, err := GreeterMetaData.GetAbi()
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- if parsed == nil {
- return common.Address{}, nil, nil, errors.New("GetABI returned nil")
- }
-
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(GreeterBin), backend)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &Greeter{address: address, abi: *parsed, GreeterCaller: GreeterCaller{contract: contract}, GreeterTransactor: GreeterTransactor{contract: contract}, GreeterFilterer: GreeterFilterer{contract: contract}}, nil
-}
-
-type Greeter struct {
- address common.Address
- abi abi.ABI
- GreeterCaller
- GreeterTransactor
- GreeterFilterer
-}
-
-type GreeterCaller struct {
- contract *bind.BoundContract
-}
-
-type GreeterTransactor struct {
- contract *bind.BoundContract
-}
-
-type GreeterFilterer struct {
- contract *bind.BoundContract
-}
-
-type GreeterSession struct {
- Contract *Greeter
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type GreeterCallerSession struct {
- Contract *GreeterCaller
- CallOpts bind.CallOpts
-}
-
-type GreeterTransactorSession struct {
- Contract *GreeterTransactor
- TransactOpts bind.TransactOpts
-}
-
-type GreeterRaw struct {
- Contract *Greeter
-}
-
-type GreeterCallerRaw struct {
- Contract *GreeterCaller
-}
-
-type GreeterTransactorRaw struct {
- Contract *GreeterTransactor
-}
-
-func NewGreeter(address common.Address, backend bind.ContractBackend) (*Greeter, error) {
- abi, err := abi.JSON(strings.NewReader(GreeterABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindGreeter(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &Greeter{address: address, abi: abi, GreeterCaller: GreeterCaller{contract: contract}, GreeterTransactor: GreeterTransactor{contract: contract}, GreeterFilterer: GreeterFilterer{contract: contract}}, nil
-}
-
-func NewGreeterCaller(address common.Address, caller bind.ContractCaller) (*GreeterCaller, error) {
- contract, err := bindGreeter(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &GreeterCaller{contract: contract}, nil
-}
-
-func NewGreeterTransactor(address common.Address, transactor bind.ContractTransactor) (*GreeterTransactor, error) {
- contract, err := bindGreeter(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &GreeterTransactor{contract: contract}, nil
-}
-
-func NewGreeterFilterer(address common.Address, filterer bind.ContractFilterer) (*GreeterFilterer, error) {
- contract, err := bindGreeter(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &GreeterFilterer{contract: contract}, nil
-}
-
-func bindGreeter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := GreeterMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_Greeter *GreeterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _Greeter.Contract.GreeterCaller.contract.Call(opts, result, method, params...)
-}
-
-func (_Greeter *GreeterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Greeter.Contract.GreeterTransactor.contract.Transfer(opts)
-}
-
-func (_Greeter *GreeterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Greeter.Contract.GreeterTransactor.contract.Transact(opts, method, params...)
-}
-
-func (_Greeter *GreeterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _Greeter.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_Greeter *GreeterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Greeter.Contract.contract.Transfer(opts)
-}
-
-func (_Greeter *GreeterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Greeter.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_Greeter *GreeterCaller) GetGreeting(opts *bind.CallOpts) (string, error) {
- var out []interface{}
- err := _Greeter.contract.Call(opts, &out, "getGreeting")
-
- if err != nil {
- return *new(string), err
- }
-
- out0 := *abi.ConvertType(out[0], new(string)).(*string)
-
- return out0, err
-
-}
-
-func (_Greeter *GreeterSession) GetGreeting() (string, error) {
- return _Greeter.Contract.GetGreeting(&_Greeter.CallOpts)
-}
-
-func (_Greeter *GreeterCallerSession) GetGreeting() (string, error) {
- return _Greeter.Contract.GetGreeting(&_Greeter.CallOpts)
-}
-
-func (_Greeter *GreeterTransactor) SetGreeting(opts *bind.TransactOpts, greeting string) (*types.Transaction, error) {
- return _Greeter.contract.Transact(opts, "setGreeting", greeting)
-}
-
-func (_Greeter *GreeterSession) SetGreeting(greeting string) (*types.Transaction, error) {
- return _Greeter.Contract.SetGreeting(&_Greeter.TransactOpts, greeting)
-}
-
-func (_Greeter *GreeterTransactorSession) SetGreeting(greeting string) (*types.Transaction, error) {
- return _Greeter.Contract.SetGreeting(&_Greeter.TransactOpts, greeting)
-}
-
-func (_Greeter *Greeter) Address() common.Address {
- return _Greeter.address
-}
-
-type GreeterInterface interface {
- GetGreeting(opts *bind.CallOpts) (string, error)
-
- SetGreeting(opts *bind.TransactOpts, greeting string) (*types.Transaction, error)
-
- Address() common.Address
-}
diff --git a/core/gethwrappers/transmission/generated/paymaster_wrapper/paymaster_wrapper.go b/core/gethwrappers/transmission/generated/paymaster_wrapper/paymaster_wrapper.go
deleted file mode 100644
index 63a2712ca3f..00000000000
--- a/core/gethwrappers/transmission/generated/paymaster_wrapper/paymaster_wrapper.go
+++ /dev/null
@@ -1,719 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package paymaster_wrapper
-
-import (
- "errors"
- "fmt"
- "math/big"
- "strings"
-
- ethereum "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/event"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
-)
-
-var (
- _ = errors.New
- _ = big.NewInt
- _ = strings.NewReader
- _ = ethereum.NotFound
- _ = bind.Bind
- _ = common.Big1
- _ = types.BloomLookup
- _ = event.NewSubscription
- _ = abi.ConvertType
-)
-
-type UserOperation struct {
- Sender common.Address
- Nonce *big.Int
- InitCode []byte
- CallData []byte
- CallGasLimit *big.Int
- VerificationGasLimit *big.Int
- PreVerificationGas *big.Int
- MaxFeePerGas *big.Int
- MaxPriorityFeePerGas *big.Int
- PaymasterAndData []byte
- Signature []byte
-}
-
-var PaymasterMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"linkEthFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"juelsNeeded\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"subscriptionBalance\",\"type\":\"uint256\"}],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"}],\"name\":\"UserOperationAlreadyTried\",\"type\":\"error\"},{\"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\":[],\"name\":\"i_entryPoint\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_linkEthFeed\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_linkToken\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enumIPaymaster.PostOpMode\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"actualGasCost\",\"type\":\"uint256\"}],\"name\":\"postOp\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"validatePaymasterUserOp\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b50604051620014c4380380620014c48339810160408190526200003491620001a3565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000df565b5050506001600160a01b0392831660805290821660a0521660c052620001f7565b336001600160a01b03821603620001395760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b0381168114620001a057600080fd5b50565b600080600060608486031215620001b957600080fd5b8351620001c6816200018a565b6020850151909350620001d9816200018a565b6040850151909250620001ec816200018a565b809150509250925092565b60805160a05160c0516112656200025f600039600081816101080152818161049f01528181610507015281816105cd015261063501526000818161018f0152610cb60152600081816101dc015281816103a201528181610ac90152610b8101526112656000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80639b9bd4de11610081578063db37983b1161005b578063db37983b146101d7578063f2fde38b146101fe578063f465c77e1461021157600080fd5b80639b9bd4de1461018a578063a4c0ed36146101b1578063a9a23409146101c457600080fd5b806379ba5097116100b257806379ba50971461014f5780638a38f365146101595780638da5cb5b1461016c57600080fd5b8063088070f5146100ce578063140fcfb114610103575b600080fd5b6002546003546100e29163ffffffff169082565b6040805163ffffffff90931683526020830191909152015b60405180910390f35b61012a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fa565b610157610232565b005b610157610167366004610d5b565b610334565b60005473ffffffffffffffffffffffffffffffffffffffff1661012a565b61012a7f000000000000000000000000000000000000000000000000000000000000000081565b6101576101bf366004610dfb565b61038a565b6101576101d2366004610e57565b610487565b61012a7f000000000000000000000000000000000000000000000000000000000000000081565b61015761020c366004610eb7565b61059d565b61022461021f366004610edb565b6105b1565b6040516100fa929190610f2f565b60015473ffffffffffffffffffffffffffffffffffffffff1633146102b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61033c610849565b6040805180820190915263ffffffff9092168083526020909201819052600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000016909217909155600355565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103f9576040517f44b0e3c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208114610433576040517f8129bbcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061044182840184610eb7565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081208054929350869290919061047b908490610fd1565b90915550505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610534576040517f295a81c100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016102af565b60008061054384860186610fe4565b9150915080610551846108cc565b61055b9190610fd1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604081208054909190610590908490611002565b9091555050505050505050565b6105a5610849565b6105ae816108f8565b50565b606060003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610662576040517f295a81c100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016102af565b60008481526004602052604090205460ff16156106ae576040517f7413dcf8000000000000000000000000000000000000000000000000000000008152600481018590526024016102af565b60006106b9866109ed565b90506000816106c7866108cc565b6106d19190610fd1565b905080600560006106e560208b018b610eb7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156107b057806005600061073860208b018b610eb7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040517f03eb8b540000000000000000000000000000000000000000000000000000000081526004016102af929190918252602082015260400190565b600086815260046020908152604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107f690880188610eb7565b6040805173ffffffffffffffffffffffffffffffffffffffff9092166020830152810183905260600160405160208183030381529060405261083b6000806000610c29565b935093505050935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016102af565b565b60006108d6610c61565b6108e883670de0b6b3a7640000611015565b6108f2919061102c565b92915050565b3373ffffffffffffffffffffffffffffffffffffffff821603610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016102af565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006109fd610120830183611067565b9050601403610a0e57506000919050565b6000610a1e610120840184611067565b6014818110610a2f57610a2f6110cc565b919091013560f81c9150819050610c23576000610a50610120850185611067565b610a5e9160159082906110fb565b810190610a6b9190611125565b90508060200151600014158015610b385750602081015181516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3691906111ae565b105b15610c2157805160408083015190517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263a9059cbb92610bd59260040173ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1891906111c7565b50806040015192505b505b50919050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610c51576000610c54565b60015b60ff161717949350505050565b600254604080517ffeaf968c000000000000000000000000000000000000000000000000000000008152905160009263ffffffff1691821515918491829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163feaf968c9160048083019260a09291908290030181865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d259190611208565b509450909250849150508015610d495750610d408242611002565b8463ffffffff16105b15610d5357506003545b949350505050565b60008060408385031215610d6e57600080fd5b823563ffffffff81168114610d8257600080fd5b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff811681146105ae57600080fd5b60008083601f840112610dc457600080fd5b50813567ffffffffffffffff811115610ddc57600080fd5b602083019150836020828501011115610df457600080fd5b9250929050565b60008060008060608587031215610e1157600080fd5b8435610e1c81610d90565b935060208501359250604085013567ffffffffffffffff811115610e3f57600080fd5b610e4b87828801610db2565b95989497509550505050565b60008060008060608587031215610e6d57600080fd5b843560038110610e7c57600080fd5b9350602085013567ffffffffffffffff811115610e9857600080fd5b610ea487828801610db2565b9598909750949560400135949350505050565b600060208284031215610ec957600080fd5b8135610ed481610d90565b9392505050565b600080600060608486031215610ef057600080fd5b833567ffffffffffffffff811115610f0757600080fd5b84016101608187031215610f1a57600080fd5b95602085013595506040909401359392505050565b604081526000835180604084015260005b81811015610f5d5760208187018101516060868401015201610f40565b5060006060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156108f2576108f2610fa2565b60008060408385031215610ff757600080fd5b8235610d8281610d90565b818103818111156108f2576108f2610fa2565b80820281158282048414176108f2576108f2610fa2565b600082611062577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261109c57600080fd5b83018035915067ffffffffffffffff8211156110b757600080fd5b602001915036819003821315610df457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000808585111561110b57600080fd5b8386111561111857600080fd5b5050820193919092039150565b60006060828403121561113757600080fd5b6040516060810181811067ffffffffffffffff82111715611181577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823561118f81610d90565b8152602083810135908201526040928301359281019290925250919050565b6000602082840312156111c057600080fd5b5051919050565b6000602082840312156111d957600080fd5b81518015158114610ed457600080fd5b805169ffffffffffffffffffff8116811461120357600080fd5b919050565b600080600080600060a0868803121561122057600080fd5b611229866111e9565b945060208601519350604086015192506060860151915061124c608087016111e9565b9050929550929590935056fea164736f6c6343000813000a",
-}
-
-var PaymasterABI = PaymasterMetaData.ABI
-
-var PaymasterBin = PaymasterMetaData.Bin
-
-func DeployPaymaster(auth *bind.TransactOpts, backend bind.ContractBackend, linkToken common.Address, linkEthFeed common.Address, entryPoint common.Address) (common.Address, *types.Transaction, *Paymaster, error) {
- parsed, err := PaymasterMetaData.GetAbi()
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- if parsed == nil {
- return common.Address{}, nil, nil, errors.New("GetABI returned nil")
- }
-
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PaymasterBin), backend, linkToken, linkEthFeed, entryPoint)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &Paymaster{address: address, abi: *parsed, PaymasterCaller: PaymasterCaller{contract: contract}, PaymasterTransactor: PaymasterTransactor{contract: contract}, PaymasterFilterer: PaymasterFilterer{contract: contract}}, nil
-}
-
-type Paymaster struct {
- address common.Address
- abi abi.ABI
- PaymasterCaller
- PaymasterTransactor
- PaymasterFilterer
-}
-
-type PaymasterCaller struct {
- contract *bind.BoundContract
-}
-
-type PaymasterTransactor struct {
- contract *bind.BoundContract
-}
-
-type PaymasterFilterer struct {
- contract *bind.BoundContract
-}
-
-type PaymasterSession struct {
- Contract *Paymaster
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type PaymasterCallerSession struct {
- Contract *PaymasterCaller
- CallOpts bind.CallOpts
-}
-
-type PaymasterTransactorSession struct {
- Contract *PaymasterTransactor
- TransactOpts bind.TransactOpts
-}
-
-type PaymasterRaw struct {
- Contract *Paymaster
-}
-
-type PaymasterCallerRaw struct {
- Contract *PaymasterCaller
-}
-
-type PaymasterTransactorRaw struct {
- Contract *PaymasterTransactor
-}
-
-func NewPaymaster(address common.Address, backend bind.ContractBackend) (*Paymaster, error) {
- abi, err := abi.JSON(strings.NewReader(PaymasterABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindPaymaster(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &Paymaster{address: address, abi: abi, PaymasterCaller: PaymasterCaller{contract: contract}, PaymasterTransactor: PaymasterTransactor{contract: contract}, PaymasterFilterer: PaymasterFilterer{contract: contract}}, nil
-}
-
-func NewPaymasterCaller(address common.Address, caller bind.ContractCaller) (*PaymasterCaller, error) {
- contract, err := bindPaymaster(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &PaymasterCaller{contract: contract}, nil
-}
-
-func NewPaymasterTransactor(address common.Address, transactor bind.ContractTransactor) (*PaymasterTransactor, error) {
- contract, err := bindPaymaster(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &PaymasterTransactor{contract: contract}, nil
-}
-
-func NewPaymasterFilterer(address common.Address, filterer bind.ContractFilterer) (*PaymasterFilterer, error) {
- contract, err := bindPaymaster(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &PaymasterFilterer{contract: contract}, nil
-}
-
-func bindPaymaster(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := PaymasterMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_Paymaster *PaymasterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _Paymaster.Contract.PaymasterCaller.contract.Call(opts, result, method, params...)
-}
-
-func (_Paymaster *PaymasterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Paymaster.Contract.PaymasterTransactor.contract.Transfer(opts)
-}
-
-func (_Paymaster *PaymasterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Paymaster.Contract.PaymasterTransactor.contract.Transact(opts, method, params...)
-}
-
-func (_Paymaster *PaymasterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _Paymaster.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_Paymaster *PaymasterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Paymaster.Contract.contract.Transfer(opts)
-}
-
-func (_Paymaster *PaymasterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _Paymaster.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_Paymaster *PaymasterCaller) IEntryPoint(opts *bind.CallOpts) (common.Address, error) {
- var out []interface{}
- err := _Paymaster.contract.Call(opts, &out, "i_entryPoint")
-
- if err != nil {
- return *new(common.Address), err
- }
-
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
- return out0, err
-
-}
-
-func (_Paymaster *PaymasterSession) IEntryPoint() (common.Address, error) {
- return _Paymaster.Contract.IEntryPoint(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCallerSession) IEntryPoint() (common.Address, error) {
- return _Paymaster.Contract.IEntryPoint(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCaller) ILinkEthFeed(opts *bind.CallOpts) (common.Address, error) {
- var out []interface{}
- err := _Paymaster.contract.Call(opts, &out, "i_linkEthFeed")
-
- if err != nil {
- return *new(common.Address), err
- }
-
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
- return out0, err
-
-}
-
-func (_Paymaster *PaymasterSession) ILinkEthFeed() (common.Address, error) {
- return _Paymaster.Contract.ILinkEthFeed(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCallerSession) ILinkEthFeed() (common.Address, error) {
- return _Paymaster.Contract.ILinkEthFeed(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCaller) ILinkToken(opts *bind.CallOpts) (common.Address, error) {
- var out []interface{}
- err := _Paymaster.contract.Call(opts, &out, "i_linkToken")
-
- if err != nil {
- return *new(common.Address), err
- }
-
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
- return out0, err
-
-}
-
-func (_Paymaster *PaymasterSession) ILinkToken() (common.Address, error) {
- return _Paymaster.Contract.ILinkToken(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCallerSession) ILinkToken() (common.Address, error) {
- return _Paymaster.Contract.ILinkToken(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
- var out []interface{}
- err := _Paymaster.contract.Call(opts, &out, "owner")
-
- if err != nil {
- return *new(common.Address), err
- }
-
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
- return out0, err
-
-}
-
-func (_Paymaster *PaymasterSession) Owner() (common.Address, error) {
- return _Paymaster.Contract.Owner(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCallerSession) Owner() (common.Address, error) {
- return _Paymaster.Contract.Owner(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCaller) SConfig(opts *bind.CallOpts) (SConfig,
-
- error) {
- var out []interface{}
- err := _Paymaster.contract.Call(opts, &out, "s_config")
-
- outstruct := new(SConfig)
- if err != nil {
- return *outstruct, err
- }
-
- outstruct.StalenessSeconds = *abi.ConvertType(out[0], new(uint32)).(*uint32)
- outstruct.FallbackWeiPerUnitLink = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
-
- return *outstruct, err
-
-}
-
-func (_Paymaster *PaymasterSession) SConfig() (SConfig,
-
- error) {
- return _Paymaster.Contract.SConfig(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterCallerSession) SConfig() (SConfig,
-
- error) {
- return _Paymaster.Contract.SConfig(&_Paymaster.CallOpts)
-}
-
-func (_Paymaster *PaymasterTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _Paymaster.contract.Transact(opts, "acceptOwnership")
-}
-
-func (_Paymaster *PaymasterSession) AcceptOwnership() (*types.Transaction, error) {
- return _Paymaster.Contract.AcceptOwnership(&_Paymaster.TransactOpts)
-}
-
-func (_Paymaster *PaymasterTransactorSession) AcceptOwnership() (*types.Transaction, error) {
- return _Paymaster.Contract.AcceptOwnership(&_Paymaster.TransactOpts)
-}
-
-func (_Paymaster *PaymasterTransactor) OnTokenTransfer(opts *bind.TransactOpts, arg0 common.Address, _amount *big.Int, _data []byte) (*types.Transaction, error) {
- return _Paymaster.contract.Transact(opts, "onTokenTransfer", arg0, _amount, _data)
-}
-
-func (_Paymaster *PaymasterSession) OnTokenTransfer(arg0 common.Address, _amount *big.Int, _data []byte) (*types.Transaction, error) {
- return _Paymaster.Contract.OnTokenTransfer(&_Paymaster.TransactOpts, arg0, _amount, _data)
-}
-
-func (_Paymaster *PaymasterTransactorSession) OnTokenTransfer(arg0 common.Address, _amount *big.Int, _data []byte) (*types.Transaction, error) {
- return _Paymaster.Contract.OnTokenTransfer(&_Paymaster.TransactOpts, arg0, _amount, _data)
-}
-
-func (_Paymaster *PaymasterTransactor) PostOp(opts *bind.TransactOpts, arg0 uint8, context []byte, actualGasCost *big.Int) (*types.Transaction, error) {
- return _Paymaster.contract.Transact(opts, "postOp", arg0, context, actualGasCost)
-}
-
-func (_Paymaster *PaymasterSession) PostOp(arg0 uint8, context []byte, actualGasCost *big.Int) (*types.Transaction, error) {
- return _Paymaster.Contract.PostOp(&_Paymaster.TransactOpts, arg0, context, actualGasCost)
-}
-
-func (_Paymaster *PaymasterTransactorSession) PostOp(arg0 uint8, context []byte, actualGasCost *big.Int) (*types.Transaction, error) {
- return _Paymaster.Contract.PostOp(&_Paymaster.TransactOpts, arg0, context, actualGasCost)
-}
-
-func (_Paymaster *PaymasterTransactor) SetConfig(opts *bind.TransactOpts, stalenessSeconds uint32, fallbackWeiPerUnitLink *big.Int) (*types.Transaction, error) {
- return _Paymaster.contract.Transact(opts, "setConfig", stalenessSeconds, fallbackWeiPerUnitLink)
-}
-
-func (_Paymaster *PaymasterSession) SetConfig(stalenessSeconds uint32, fallbackWeiPerUnitLink *big.Int) (*types.Transaction, error) {
- return _Paymaster.Contract.SetConfig(&_Paymaster.TransactOpts, stalenessSeconds, fallbackWeiPerUnitLink)
-}
-
-func (_Paymaster *PaymasterTransactorSession) SetConfig(stalenessSeconds uint32, fallbackWeiPerUnitLink *big.Int) (*types.Transaction, error) {
- return _Paymaster.Contract.SetConfig(&_Paymaster.TransactOpts, stalenessSeconds, fallbackWeiPerUnitLink)
-}
-
-func (_Paymaster *PaymasterTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
- return _Paymaster.contract.Transact(opts, "transferOwnership", to)
-}
-
-func (_Paymaster *PaymasterSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
- return _Paymaster.Contract.TransferOwnership(&_Paymaster.TransactOpts, to)
-}
-
-func (_Paymaster *PaymasterTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
- return _Paymaster.Contract.TransferOwnership(&_Paymaster.TransactOpts, to)
-}
-
-func (_Paymaster *PaymasterTransactor) ValidatePaymasterUserOp(opts *bind.TransactOpts, userOp UserOperation, userOpHash [32]byte, maxCost *big.Int) (*types.Transaction, error) {
- return _Paymaster.contract.Transact(opts, "validatePaymasterUserOp", userOp, userOpHash, maxCost)
-}
-
-func (_Paymaster *PaymasterSession) ValidatePaymasterUserOp(userOp UserOperation, userOpHash [32]byte, maxCost *big.Int) (*types.Transaction, error) {
- return _Paymaster.Contract.ValidatePaymasterUserOp(&_Paymaster.TransactOpts, userOp, userOpHash, maxCost)
-}
-
-func (_Paymaster *PaymasterTransactorSession) ValidatePaymasterUserOp(userOp UserOperation, userOpHash [32]byte, maxCost *big.Int) (*types.Transaction, error) {
- return _Paymaster.Contract.ValidatePaymasterUserOp(&_Paymaster.TransactOpts, userOp, userOpHash, maxCost)
-}
-
-type PaymasterOwnershipTransferRequestedIterator struct {
- Event *PaymasterOwnershipTransferRequested
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *PaymasterOwnershipTransferRequestedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(PaymasterOwnershipTransferRequested)
- 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(PaymasterOwnershipTransferRequested)
- 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 *PaymasterOwnershipTransferRequestedIterator) Error() error {
- return it.fail
-}
-
-func (it *PaymasterOwnershipTransferRequestedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type PaymasterOwnershipTransferRequested struct {
- From common.Address
- To common.Address
- Raw types.Log
-}
-
-func (_Paymaster *PaymasterFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PaymasterOwnershipTransferRequestedIterator, error) {
-
- var fromRule []interface{}
- for _, fromItem := range from {
- fromRule = append(fromRule, fromItem)
- }
- var toRule []interface{}
- for _, toItem := range to {
- toRule = append(toRule, toItem)
- }
-
- logs, sub, err := _Paymaster.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
- if err != nil {
- return nil, err
- }
- return &PaymasterOwnershipTransferRequestedIterator{contract: _Paymaster.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
-}
-
-func (_Paymaster *PaymasterFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *PaymasterOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
-
- var fromRule []interface{}
- for _, fromItem := range from {
- fromRule = append(fromRule, fromItem)
- }
- var toRule []interface{}
- for _, toItem := range to {
- toRule = append(toRule, toItem)
- }
-
- logs, sub, err := _Paymaster.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(PaymasterOwnershipTransferRequested)
- if err := _Paymaster.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
- return err
- }
- event.Raw = log
-
- select {
- case sink <- event:
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- }
- }), nil
-}
-
-func (_Paymaster *PaymasterFilterer) ParseOwnershipTransferRequested(log types.Log) (*PaymasterOwnershipTransferRequested, error) {
- event := new(PaymasterOwnershipTransferRequested)
- if err := _Paymaster.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type PaymasterOwnershipTransferredIterator struct {
- Event *PaymasterOwnershipTransferred
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *PaymasterOwnershipTransferredIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(PaymasterOwnershipTransferred)
- 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(PaymasterOwnershipTransferred)
- 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 *PaymasterOwnershipTransferredIterator) Error() error {
- return it.fail
-}
-
-func (it *PaymasterOwnershipTransferredIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type PaymasterOwnershipTransferred struct {
- From common.Address
- To common.Address
- Raw types.Log
-}
-
-func (_Paymaster *PaymasterFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PaymasterOwnershipTransferredIterator, error) {
-
- var fromRule []interface{}
- for _, fromItem := range from {
- fromRule = append(fromRule, fromItem)
- }
- var toRule []interface{}
- for _, toItem := range to {
- toRule = append(toRule, toItem)
- }
-
- logs, sub, err := _Paymaster.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
- if err != nil {
- return nil, err
- }
- return &PaymasterOwnershipTransferredIterator{contract: _Paymaster.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
-}
-
-func (_Paymaster *PaymasterFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PaymasterOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
-
- var fromRule []interface{}
- for _, fromItem := range from {
- fromRule = append(fromRule, fromItem)
- }
- var toRule []interface{}
- for _, toItem := range to {
- toRule = append(toRule, toItem)
- }
-
- logs, sub, err := _Paymaster.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(PaymasterOwnershipTransferred)
- if err := _Paymaster.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
- return err
- }
- event.Raw = log
-
- select {
- case sink <- event:
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- }
- }), nil
-}
-
-func (_Paymaster *PaymasterFilterer) ParseOwnershipTransferred(log types.Log) (*PaymasterOwnershipTransferred, error) {
- event := new(PaymasterOwnershipTransferred)
- if err := _Paymaster.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type SConfig struct {
- StalenessSeconds uint32
- FallbackWeiPerUnitLink *big.Int
-}
-
-func (_Paymaster *Paymaster) ParseLog(log types.Log) (generated.AbigenLog, error) {
- switch log.Topics[0] {
- case _Paymaster.abi.Events["OwnershipTransferRequested"].ID:
- return _Paymaster.ParseOwnershipTransferRequested(log)
- case _Paymaster.abi.Events["OwnershipTransferred"].ID:
- return _Paymaster.ParseOwnershipTransferred(log)
-
- default:
- return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
- }
-}
-
-func (PaymasterOwnershipTransferRequested) Topic() common.Hash {
- return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
-}
-
-func (PaymasterOwnershipTransferred) Topic() common.Hash {
- return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
-}
-
-func (_Paymaster *Paymaster) Address() common.Address {
- return _Paymaster.address
-}
-
-type PaymasterInterface interface {
- IEntryPoint(opts *bind.CallOpts) (common.Address, error)
-
- ILinkEthFeed(opts *bind.CallOpts) (common.Address, error)
-
- ILinkToken(opts *bind.CallOpts) (common.Address, error)
-
- Owner(opts *bind.CallOpts) (common.Address, error)
-
- SConfig(opts *bind.CallOpts) (SConfig,
-
- error)
-
- AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
-
- OnTokenTransfer(opts *bind.TransactOpts, arg0 common.Address, _amount *big.Int, _data []byte) (*types.Transaction, error)
-
- PostOp(opts *bind.TransactOpts, arg0 uint8, context []byte, actualGasCost *big.Int) (*types.Transaction, error)
-
- SetConfig(opts *bind.TransactOpts, stalenessSeconds uint32, fallbackWeiPerUnitLink *big.Int) (*types.Transaction, error)
-
- TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
-
- ValidatePaymasterUserOp(opts *bind.TransactOpts, userOp UserOperation, userOpHash [32]byte, maxCost *big.Int) (*types.Transaction, error)
-
- FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PaymasterOwnershipTransferRequestedIterator, error)
-
- WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *PaymasterOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
-
- ParseOwnershipTransferRequested(log types.Log) (*PaymasterOwnershipTransferRequested, error)
-
- FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PaymasterOwnershipTransferredIterator, error)
-
- WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PaymasterOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
-
- ParseOwnershipTransferred(log types.Log) (*PaymasterOwnershipTransferred, error)
-
- ParseLog(log types.Log) (generated.AbigenLog, error)
-
- Address() common.Address
-}
diff --git a/core/gethwrappers/transmission/generated/sca_wrapper/sca_wrapper.go b/core/gethwrappers/transmission/generated/sca_wrapper/sca_wrapper.go
deleted file mode 100644
index 989e4058685..00000000000
--- a/core/gethwrappers/transmission/generated/sca_wrapper/sca_wrapper.go
+++ /dev/null
@@ -1,292 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package sca_wrapper
-
-import (
- "errors"
- "math/big"
- "strings"
-
- ethereum "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/event"
-)
-
-var (
- _ = errors.New
- _ = big.NewInt
- _ = strings.NewReader
- _ = ethereum.NotFound
- _ = bind.Bind
- _ = common.Big1
- _ = types.BloomLookup
- _ = event.NewSubscription
- _ = abi.ConvertType
-)
-
-type UserOperation struct {
- Sender common.Address
- Nonce *big.Int
- InitCode []byte
- CallData []byte
- CallGasLimit *big.Int
- VerificationGasLimit *big.Int
- PreVerificationGas *big.Int
- MaxFeePerGas *big.Int
- MaxPriorityFeePerGas *big.Int
- PaymasterAndData []byte
- Signature []byte
-}
-
-var SCAMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadFormatOrOOG\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentNonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonceGiven\",\"type\":\"uint256\"}],\"name\":\"IncorrectNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operationHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"NotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint48\",\"name\":\"deadline\",\"type\":\"uint48\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"executeTransactionFromEntryPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_entryPoint\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"callGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"verificationGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validationData\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60c060405234801561001057600080fd5b50604051610acb380380610acb83398101604081905261002f91610062565b6001600160a01b039182166080521660a052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610a046100c760003960008181607101526102b801526000818161010101526101e30152610a046000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80637eccf63e116100505780637eccf63e146100de57806389553be4146100e7578063dba6335f146100fc57600080fd5b8063140fcfb11461006c5780633a871cdd146100bd575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100d06100cb366004610646565b610123565b6040519081526020016100b4565b6100d060005481565b6100fa6100f53660046106da565b6102a0565b005b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60008054846020013514610179576000546040517f7ba633940000000000000000000000000000000000000000000000000000000081526004810191909152602085013560248201526044015b60405180910390fd5b60006101858430610439565b90506000610197610140870187610777565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016915061021190508284610550565b73ffffffffffffffffffffffffffffffffffffffff161461024257610239600160008061060e565b92505050610299565b60008054908061025183610812565b90915550600090506102666060880188610777565b61027491600490829061084a565b81019061028191906108a3565b5092505050610293600082600061060e565b93505050505b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610311576040517f4a0bfec1000000000000000000000000000000000000000000000000000000008152336004820152602401610170565b65ffffffffffff83161580159061032f57508265ffffffffffff1642115b15610376576040517f300249d700000000000000000000000000000000000000000000000000000000815265ffffffffffff84166004820152426024820152604401610170565b6000808673ffffffffffffffffffffffffffffffffffffffff168685856040516103a192919061099f565b60006040518083038185875af1925050503d80600081146103de576040519150601f19603f3d011682016040523d82523d6000602084013e6103e3565b606091505b509150915081610430578051600003610428576040517f20e9b5d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b50505050505050565b604080517f4750045d47fce615521b32cee713ff8db50147e98aec5ca94926b52651ca3fa0602080830191909152818301859052825180830384018152606080840185528151918301919091207f190000000000000000000000000000000000000000000000000000000000000060808501527f010000000000000000000000000000000000000000000000000000000000000060818501527f1c7d3b72b37a35523e273aaadd7b4cd66f618bb81429ab053412d51f50ccea6160828501524660a28501529085901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660c284015260d6808401919091528351808403909101815260f690920190925280519101205b92915050565b602082015160408084015184516000939284918791908110610574576105746109af565b016020015160f81c905060018561058c83601b6109de565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156105db573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610636576000610639565b60015b60ff161717949350505050565b60008060006060848603121561065b57600080fd5b833567ffffffffffffffff81111561067257600080fd5b8401610160818703121561068557600080fd5b95602085013595506040909401359392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146106bc57600080fd5b50565b803565ffffffffffff811681146106d557600080fd5b919050565b6000806000806000608086880312156106f257600080fd5b85356106fd8161069a565b945060208601359350610712604087016106bf565b9250606086013567ffffffffffffffff8082111561072f57600080fd5b818801915088601f83011261074357600080fd5b81358181111561075257600080fd5b89602082850101111561076457600080fd5b9699959850939650602001949392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126107ac57600080fd5b83018035915067ffffffffffffffff8211156107c757600080fd5b6020019150368190038213156107dc57600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610843576108436107e3565b5060010190565b6000808585111561085a57600080fd5b8386111561086757600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600080608085870312156108b957600080fd5b84356108c48161069a565b9350602085013592506108d9604086016106bf565b9150606085013567ffffffffffffffff808211156108f657600080fd5b818701915087601f83011261090a57600080fd5b81358181111561091c5761091c610874565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561096257610962610874565b816040528281528a602084870101111561097b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60ff818116838216019081111561054a5761054a6107e356fea164736f6c6343000813000a",
-}
-
-var SCAABI = SCAMetaData.ABI
-
-var SCABin = SCAMetaData.Bin
-
-func DeploySCA(auth *bind.TransactOpts, backend bind.ContractBackend, owner common.Address, entryPoint common.Address) (common.Address, *types.Transaction, *SCA, error) {
- parsed, err := SCAMetaData.GetAbi()
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- if parsed == nil {
- return common.Address{}, nil, nil, errors.New("GetABI returned nil")
- }
-
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(SCABin), backend, owner, entryPoint)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &SCA{address: address, abi: *parsed, SCACaller: SCACaller{contract: contract}, SCATransactor: SCATransactor{contract: contract}, SCAFilterer: SCAFilterer{contract: contract}}, nil
-}
-
-type SCA struct {
- address common.Address
- abi abi.ABI
- SCACaller
- SCATransactor
- SCAFilterer
-}
-
-type SCACaller struct {
- contract *bind.BoundContract
-}
-
-type SCATransactor struct {
- contract *bind.BoundContract
-}
-
-type SCAFilterer struct {
- contract *bind.BoundContract
-}
-
-type SCASession struct {
- Contract *SCA
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type SCACallerSession struct {
- Contract *SCACaller
- CallOpts bind.CallOpts
-}
-
-type SCATransactorSession struct {
- Contract *SCATransactor
- TransactOpts bind.TransactOpts
-}
-
-type SCARaw struct {
- Contract *SCA
-}
-
-type SCACallerRaw struct {
- Contract *SCACaller
-}
-
-type SCATransactorRaw struct {
- Contract *SCATransactor
-}
-
-func NewSCA(address common.Address, backend bind.ContractBackend) (*SCA, error) {
- abi, err := abi.JSON(strings.NewReader(SCAABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindSCA(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &SCA{address: address, abi: abi, SCACaller: SCACaller{contract: contract}, SCATransactor: SCATransactor{contract: contract}, SCAFilterer: SCAFilterer{contract: contract}}, nil
-}
-
-func NewSCACaller(address common.Address, caller bind.ContractCaller) (*SCACaller, error) {
- contract, err := bindSCA(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &SCACaller{contract: contract}, nil
-}
-
-func NewSCATransactor(address common.Address, transactor bind.ContractTransactor) (*SCATransactor, error) {
- contract, err := bindSCA(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &SCATransactor{contract: contract}, nil
-}
-
-func NewSCAFilterer(address common.Address, filterer bind.ContractFilterer) (*SCAFilterer, error) {
- contract, err := bindSCA(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &SCAFilterer{contract: contract}, nil
-}
-
-func bindSCA(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := SCAMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_SCA *SCARaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _SCA.Contract.SCACaller.contract.Call(opts, result, method, params...)
-}
-
-func (_SCA *SCARaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _SCA.Contract.SCATransactor.contract.Transfer(opts)
-}
-
-func (_SCA *SCARaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _SCA.Contract.SCATransactor.contract.Transact(opts, method, params...)
-}
-
-func (_SCA *SCACallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _SCA.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_SCA *SCATransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _SCA.Contract.contract.Transfer(opts)
-}
-
-func (_SCA *SCATransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _SCA.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_SCA *SCACaller) IEntryPoint(opts *bind.CallOpts) (common.Address, error) {
- var out []interface{}
- err := _SCA.contract.Call(opts, &out, "i_entryPoint")
-
- if err != nil {
- return *new(common.Address), err
- }
-
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
- return out0, err
-
-}
-
-func (_SCA *SCASession) IEntryPoint() (common.Address, error) {
- return _SCA.Contract.IEntryPoint(&_SCA.CallOpts)
-}
-
-func (_SCA *SCACallerSession) IEntryPoint() (common.Address, error) {
- return _SCA.Contract.IEntryPoint(&_SCA.CallOpts)
-}
-
-func (_SCA *SCACaller) IOwner(opts *bind.CallOpts) (common.Address, error) {
- var out []interface{}
- err := _SCA.contract.Call(opts, &out, "i_owner")
-
- if err != nil {
- return *new(common.Address), err
- }
-
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
- return out0, err
-
-}
-
-func (_SCA *SCASession) IOwner() (common.Address, error) {
- return _SCA.Contract.IOwner(&_SCA.CallOpts)
-}
-
-func (_SCA *SCACallerSession) IOwner() (common.Address, error) {
- return _SCA.Contract.IOwner(&_SCA.CallOpts)
-}
-
-func (_SCA *SCACaller) SNonce(opts *bind.CallOpts) (*big.Int, error) {
- var out []interface{}
- err := _SCA.contract.Call(opts, &out, "s_nonce")
-
- if err != nil {
- return *new(*big.Int), err
- }
-
- out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
-
- return out0, err
-
-}
-
-func (_SCA *SCASession) SNonce() (*big.Int, error) {
- return _SCA.Contract.SNonce(&_SCA.CallOpts)
-}
-
-func (_SCA *SCACallerSession) SNonce() (*big.Int, error) {
- return _SCA.Contract.SNonce(&_SCA.CallOpts)
-}
-
-func (_SCA *SCATransactor) ExecuteTransactionFromEntryPoint(opts *bind.TransactOpts, to common.Address, value *big.Int, deadline *big.Int, data []byte) (*types.Transaction, error) {
- return _SCA.contract.Transact(opts, "executeTransactionFromEntryPoint", to, value, deadline, data)
-}
-
-func (_SCA *SCASession) ExecuteTransactionFromEntryPoint(to common.Address, value *big.Int, deadline *big.Int, data []byte) (*types.Transaction, error) {
- return _SCA.Contract.ExecuteTransactionFromEntryPoint(&_SCA.TransactOpts, to, value, deadline, data)
-}
-
-func (_SCA *SCATransactorSession) ExecuteTransactionFromEntryPoint(to common.Address, value *big.Int, deadline *big.Int, data []byte) (*types.Transaction, error) {
- return _SCA.Contract.ExecuteTransactionFromEntryPoint(&_SCA.TransactOpts, to, value, deadline, data)
-}
-
-func (_SCA *SCATransactor) ValidateUserOp(opts *bind.TransactOpts, userOp UserOperation, userOpHash [32]byte, arg2 *big.Int) (*types.Transaction, error) {
- return _SCA.contract.Transact(opts, "validateUserOp", userOp, userOpHash, arg2)
-}
-
-func (_SCA *SCASession) ValidateUserOp(userOp UserOperation, userOpHash [32]byte, arg2 *big.Int) (*types.Transaction, error) {
- return _SCA.Contract.ValidateUserOp(&_SCA.TransactOpts, userOp, userOpHash, arg2)
-}
-
-func (_SCA *SCATransactorSession) ValidateUserOp(userOp UserOperation, userOpHash [32]byte, arg2 *big.Int) (*types.Transaction, error) {
- return _SCA.Contract.ValidateUserOp(&_SCA.TransactOpts, userOp, userOpHash, arg2)
-}
-
-func (_SCA *SCA) Address() common.Address {
- return _SCA.address
-}
-
-type SCAInterface interface {
- IEntryPoint(opts *bind.CallOpts) (common.Address, error)
-
- IOwner(opts *bind.CallOpts) (common.Address, error)
-
- SNonce(opts *bind.CallOpts) (*big.Int, error)
-
- ExecuteTransactionFromEntryPoint(opts *bind.TransactOpts, to common.Address, value *big.Int, deadline *big.Int, data []byte) (*types.Transaction, error)
-
- ValidateUserOp(opts *bind.TransactOpts, userOp UserOperation, userOpHash [32]byte, arg2 *big.Int) (*types.Transaction, error)
-
- Address() common.Address
-}
diff --git a/core/gethwrappers/transmission/generated/smart_contract_account_factory/smart_contract_account_factory.go b/core/gethwrappers/transmission/generated/smart_contract_account_factory/smart_contract_account_factory.go
deleted file mode 100644
index aa9205641c5..00000000000
--- a/core/gethwrappers/transmission/generated/smart_contract_account_factory/smart_contract_account_factory.go
+++ /dev/null
@@ -1,333 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package smart_contract_account_factory
-
-import (
- "errors"
- "fmt"
- "math/big"
- "strings"
-
- ethereum "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/event"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
-)
-
-var (
- _ = errors.New
- _ = big.NewInt
- _ = strings.NewReader
- _ = ethereum.NotFound
- _ = bind.Bind
- _ = common.Big1
- _ = types.BloomLookup
- _ = event.NewSubscription
- _ = abi.ConvertType
-)
-
-var SmartContractAccountFactoryMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"name\":\"DeploymentFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"scaAddress\",\"type\":\"address\"}],\"name\":\"ContractCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"abiEncodedOwnerAddress\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"deploySmartContractAccount\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"scaAddress\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b5061021e806100206000396000f3fe60806040526004361061001e5760003560e01c80630af4926f14610023575b600080fd5b610036610031366004610138565b61005f565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000828251836020016000f5905073ffffffffffffffffffffffffffffffffffffffff81166100ba576040517f3011642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff821681527fcf78cf0d6f3d8371e1075c69c492ab4ec5d8cf23a1a239b6a51a1d00be7ca3129060200160405180910390a192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561014b57600080fd5b82359150602083013567ffffffffffffffff8082111561016a57600080fd5b818501915085601f83011261017e57600080fd5b81358181111561019057610190610109565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101d6576101d6610109565b816040528281528860208487010111156101ef57600080fd5b826020860160208301376000602084830101528095505050505050925092905056fea164736f6c6343000813000a",
-}
-
-var SmartContractAccountFactoryABI = SmartContractAccountFactoryMetaData.ABI
-
-var SmartContractAccountFactoryBin = SmartContractAccountFactoryMetaData.Bin
-
-func DeploySmartContractAccountFactory(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SmartContractAccountFactory, error) {
- parsed, err := SmartContractAccountFactoryMetaData.GetAbi()
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- if parsed == nil {
- return common.Address{}, nil, nil, errors.New("GetABI returned nil")
- }
-
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(SmartContractAccountFactoryBin), backend)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &SmartContractAccountFactory{address: address, abi: *parsed, SmartContractAccountFactoryCaller: SmartContractAccountFactoryCaller{contract: contract}, SmartContractAccountFactoryTransactor: SmartContractAccountFactoryTransactor{contract: contract}, SmartContractAccountFactoryFilterer: SmartContractAccountFactoryFilterer{contract: contract}}, nil
-}
-
-type SmartContractAccountFactory struct {
- address common.Address
- abi abi.ABI
- SmartContractAccountFactoryCaller
- SmartContractAccountFactoryTransactor
- SmartContractAccountFactoryFilterer
-}
-
-type SmartContractAccountFactoryCaller struct {
- contract *bind.BoundContract
-}
-
-type SmartContractAccountFactoryTransactor struct {
- contract *bind.BoundContract
-}
-
-type SmartContractAccountFactoryFilterer struct {
- contract *bind.BoundContract
-}
-
-type SmartContractAccountFactorySession struct {
- Contract *SmartContractAccountFactory
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type SmartContractAccountFactoryCallerSession struct {
- Contract *SmartContractAccountFactoryCaller
- CallOpts bind.CallOpts
-}
-
-type SmartContractAccountFactoryTransactorSession struct {
- Contract *SmartContractAccountFactoryTransactor
- TransactOpts bind.TransactOpts
-}
-
-type SmartContractAccountFactoryRaw struct {
- Contract *SmartContractAccountFactory
-}
-
-type SmartContractAccountFactoryCallerRaw struct {
- Contract *SmartContractAccountFactoryCaller
-}
-
-type SmartContractAccountFactoryTransactorRaw struct {
- Contract *SmartContractAccountFactoryTransactor
-}
-
-func NewSmartContractAccountFactory(address common.Address, backend bind.ContractBackend) (*SmartContractAccountFactory, error) {
- abi, err := abi.JSON(strings.NewReader(SmartContractAccountFactoryABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindSmartContractAccountFactory(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountFactory{address: address, abi: abi, SmartContractAccountFactoryCaller: SmartContractAccountFactoryCaller{contract: contract}, SmartContractAccountFactoryTransactor: SmartContractAccountFactoryTransactor{contract: contract}, SmartContractAccountFactoryFilterer: SmartContractAccountFactoryFilterer{contract: contract}}, nil
-}
-
-func NewSmartContractAccountFactoryCaller(address common.Address, caller bind.ContractCaller) (*SmartContractAccountFactoryCaller, error) {
- contract, err := bindSmartContractAccountFactory(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountFactoryCaller{contract: contract}, nil
-}
-
-func NewSmartContractAccountFactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*SmartContractAccountFactoryTransactor, error) {
- contract, err := bindSmartContractAccountFactory(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountFactoryTransactor{contract: contract}, nil
-}
-
-func NewSmartContractAccountFactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*SmartContractAccountFactoryFilterer, error) {
- contract, err := bindSmartContractAccountFactory(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountFactoryFilterer{contract: contract}, nil
-}
-
-func bindSmartContractAccountFactory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := SmartContractAccountFactoryMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _SmartContractAccountFactory.Contract.SmartContractAccountFactoryCaller.contract.Call(opts, result, method, params...)
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _SmartContractAccountFactory.Contract.SmartContractAccountFactoryTransactor.contract.Transfer(opts)
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _SmartContractAccountFactory.Contract.SmartContractAccountFactoryTransactor.contract.Transact(opts, method, params...)
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _SmartContractAccountFactory.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _SmartContractAccountFactory.Contract.contract.Transfer(opts)
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _SmartContractAccountFactory.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryTransactor) DeploySmartContractAccount(opts *bind.TransactOpts, abiEncodedOwnerAddress [32]byte, initCode []byte) (*types.Transaction, error) {
- return _SmartContractAccountFactory.contract.Transact(opts, "deploySmartContractAccount", abiEncodedOwnerAddress, initCode)
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactorySession) DeploySmartContractAccount(abiEncodedOwnerAddress [32]byte, initCode []byte) (*types.Transaction, error) {
- return _SmartContractAccountFactory.Contract.DeploySmartContractAccount(&_SmartContractAccountFactory.TransactOpts, abiEncodedOwnerAddress, initCode)
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryTransactorSession) DeploySmartContractAccount(abiEncodedOwnerAddress [32]byte, initCode []byte) (*types.Transaction, error) {
- return _SmartContractAccountFactory.Contract.DeploySmartContractAccount(&_SmartContractAccountFactory.TransactOpts, abiEncodedOwnerAddress, initCode)
-}
-
-type SmartContractAccountFactoryContractCreatedIterator struct {
- Event *SmartContractAccountFactoryContractCreated
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *SmartContractAccountFactoryContractCreatedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(SmartContractAccountFactoryContractCreated)
- 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(SmartContractAccountFactoryContractCreated)
- 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 *SmartContractAccountFactoryContractCreatedIterator) Error() error {
- return it.fail
-}
-
-func (it *SmartContractAccountFactoryContractCreatedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type SmartContractAccountFactoryContractCreated struct {
- ScaAddress common.Address
- Raw types.Log
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryFilterer) FilterContractCreated(opts *bind.FilterOpts) (*SmartContractAccountFactoryContractCreatedIterator, error) {
-
- logs, sub, err := _SmartContractAccountFactory.contract.FilterLogs(opts, "ContractCreated")
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountFactoryContractCreatedIterator{contract: _SmartContractAccountFactory.contract, event: "ContractCreated", logs: logs, sub: sub}, nil
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactoryFilterer) WatchContractCreated(opts *bind.WatchOpts, sink chan<- *SmartContractAccountFactoryContractCreated) (event.Subscription, error) {
-
- logs, sub, err := _SmartContractAccountFactory.contract.WatchLogs(opts, "ContractCreated")
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(SmartContractAccountFactoryContractCreated)
- if err := _SmartContractAccountFactory.contract.UnpackLog(event, "ContractCreated", 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 (_SmartContractAccountFactory *SmartContractAccountFactoryFilterer) ParseContractCreated(log types.Log) (*SmartContractAccountFactoryContractCreated, error) {
- event := new(SmartContractAccountFactoryContractCreated)
- if err := _SmartContractAccountFactory.contract.UnpackLog(event, "ContractCreated", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactory) ParseLog(log types.Log) (generated.AbigenLog, error) {
- switch log.Topics[0] {
- case _SmartContractAccountFactory.abi.Events["ContractCreated"].ID:
- return _SmartContractAccountFactory.ParseContractCreated(log)
-
- default:
- return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
- }
-}
-
-func (SmartContractAccountFactoryContractCreated) Topic() common.Hash {
- return common.HexToHash("0xcf78cf0d6f3d8371e1075c69c492ab4ec5d8cf23a1a239b6a51a1d00be7ca312")
-}
-
-func (_SmartContractAccountFactory *SmartContractAccountFactory) Address() common.Address {
- return _SmartContractAccountFactory.address
-}
-
-type SmartContractAccountFactoryInterface interface {
- DeploySmartContractAccount(opts *bind.TransactOpts, abiEncodedOwnerAddress [32]byte, initCode []byte) (*types.Transaction, error)
-
- FilterContractCreated(opts *bind.FilterOpts) (*SmartContractAccountFactoryContractCreatedIterator, error)
-
- WatchContractCreated(opts *bind.WatchOpts, sink chan<- *SmartContractAccountFactoryContractCreated) (event.Subscription, error)
-
- ParseContractCreated(log types.Log) (*SmartContractAccountFactoryContractCreated, error)
-
- ParseLog(log types.Log) (generated.AbigenLog, error)
-
- Address() common.Address
-}
diff --git a/core/gethwrappers/transmission/generated/smart_contract_account_helper/smart_contract_account_helper.go b/core/gethwrappers/transmission/generated/smart_contract_account_helper/smart_contract_account_helper.go
deleted file mode 100644
index 36e63e3683e..00000000000
--- a/core/gethwrappers/transmission/generated/smart_contract_account_helper/smart_contract_account_helper.go
+++ /dev/null
@@ -1,322 +0,0 @@
-// Code generated - DO NOT EDIT.
-// This file is a generated binding and any manual changes will be lost.
-
-package smart_contract_account_helper
-
-import (
- "errors"
- "math/big"
- "strings"
-
- ethereum "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/event"
-)
-
-var (
- _ = errors.New
- _ = big.NewInt
- _ = strings.NewReader
- _ = ethereum.NotFound
- _ = bind.Bind
- _ = common.Big1
- _ = types.BloomLookup
- _ = event.NewSubscription
- _ = abi.ConvertType
-)
-
-var SmartContractAccountHelperMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entryPoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"}],\"name\":\"calculateSmartContractAccountAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"topupThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"topupAmount\",\"type\":\"uint256\"}],\"name\":\"getAbiEncodedDirectRequestData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"endContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"getFullEndTxEncoding\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"encoding\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"scaAddress\",\"type\":\"address\"}],\"name\":\"getFullHashForSigning\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entryPoint\",\"type\":\"address\"}],\"name\":\"getInitCode\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"entryPoint\",\"type\":\"address\"}],\"name\":\"getSCAInitCodeWithConstructor\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x61161361003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061007c5760003560e01c8063e0237bef1161005a578063e0237bef14610134578063e464b3631461016c578063fc59bac31461017f57600080fd5b80632c86cb35146100815780634b770f561461010057806382311e3314610113575b600080fd5b6100ea61008f36600461076d565b604080516060808201835273ffffffffffffffffffffffffffffffffffffffff959095168082526020808301958652918301938452825191820152925183820152905182840152805180830390930183526080909101905290565b6040516100f7919061080e565b60405180910390f35b6100ea61010e366004610821565b610192565b610126610121366004610864565b610336565b6040519081526020016100f7565b610147610142366004610821565b610456565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f7565b6100ea61017a366004610890565b6105e1565b6100ea61018d3660046108e9565b61069f565b6040516060907fffffffffffffffffffffffffffffffffffffffff00000000000000000000000084831b16906000906101cd60208201610737565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff8881166020840152871690820152606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261026292916020016109dc565b60405160208183030381529060405290508560601b630af4926f60e01b8383604051602401610292929190610a0b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093525161031c939201610a2c565b604051602081830303815290604052925050509392505050565b600061044d8383604080517f4750045d47fce615521b32cee713ff8db50147e98aec5ca94926b52651ca3fa060208083019190915281830194909452815180820383018152606080830184528151918601919091207f190000000000000000000000000000000000000000000000000000000000000060808401527f010000000000000000000000000000000000000000000000000000000000000060818401527f1c7d3b72b37a35523e273aaadd7b4cd66f618bb81429ab053412d51f50ccea6160828401524660a284015293901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660c282015260d6808201939093528151808203909301835260f6019052805191012090565b90505b92915050565b6040516000907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1690829061049260208201610737565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff8981166020840152881690820152606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261052792916020016109dc565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201207fff000000000000000000000000000000000000000000000000000000000000008285015260609790971b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021840152603583019490945260558083019690965280518083039096018652607590910190525082519201919091209392505050565b6060604051806020016105f390610737565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815273ffffffffffffffffffffffffffffffffffffffff8681166020840152851690820152606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261068892916020016109dc565b604051602081830303815290604052905092915050565b60607f89553be40000000000000000000000000000000000000000000000000000000085856106ce8642610a74565b856040516020016106e29493929190610aae565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261071e9291602001610af3565b6040516020818303038152906040529050949350505050565b610acb80610b3c83390190565b803573ffffffffffffffffffffffffffffffffffffffff8116811461076857600080fd5b919050565b60008060006060848603121561078257600080fd5b61078b84610744565b95602085013595506040909401359392505050565b60005b838110156107bb5781810151838201526020016107a3565b50506000910152565b600081518084526107dc8160208601602086016107a0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061044d60208301846107c4565b60008060006060848603121561083657600080fd5b61083f84610744565b925061084d60208501610744565b915061085b60408501610744565b90509250925092565b6000806040838503121561087757600080fd5b8235915061088760208401610744565b90509250929050565b600080604083850312156108a357600080fd5b6108ac83610744565b915061088760208401610744565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600080608085870312156108ff57600080fd5b61090885610744565b93506020850135925060408501359150606085013567ffffffffffffffff8082111561093357600080fd5b818701915087601f83011261094757600080fd5b813581811115610959576109596108ba565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561099f5761099f6108ba565b816040528281528a60208487010111156109b857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600083516109ee8184602088016107a0565b835190830190610a028183602088016107a0565b01949350505050565b828152604060208201526000610a2460408301846107c4565b949350505050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008316815260008251610a668160148501602087016107a0565b919091016014019392505050565b80820180821115610450577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152826040820152608060608201526000610ae960808301846107c4565b9695505050505050565b7fffffffff000000000000000000000000000000000000000000000000000000008316815260008251610b2d8160048501602087016107a0565b91909101600401939250505056fe60c060405234801561001057600080fd5b50604051610acb380380610acb83398101604081905261002f91610062565b6001600160a01b039182166080521660a052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610a046100c760003960008181607101526102b801526000818161010101526101e30152610a046000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80637eccf63e116100505780637eccf63e146100de57806389553be4146100e7578063dba6335f146100fc57600080fd5b8063140fcfb11461006c5780633a871cdd146100bd575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100d06100cb366004610646565b610123565b6040519081526020016100b4565b6100d060005481565b6100fa6100f53660046106da565b6102a0565b005b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60008054846020013514610179576000546040517f7ba633940000000000000000000000000000000000000000000000000000000081526004810191909152602085013560248201526044015b60405180910390fd5b60006101858430610439565b90506000610197610140870187610777565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016915061021190508284610550565b73ffffffffffffffffffffffffffffffffffffffff161461024257610239600160008061060e565b92505050610299565b60008054908061025183610812565b90915550600090506102666060880188610777565b61027491600490829061084a565b81019061028191906108a3565b5092505050610293600082600061060e565b93505050505b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610311576040517f4a0bfec1000000000000000000000000000000000000000000000000000000008152336004820152602401610170565b65ffffffffffff83161580159061032f57508265ffffffffffff1642115b15610376576040517f300249d700000000000000000000000000000000000000000000000000000000815265ffffffffffff84166004820152426024820152604401610170565b6000808673ffffffffffffffffffffffffffffffffffffffff168685856040516103a192919061099f565b60006040518083038185875af1925050503d80600081146103de576040519150601f19603f3d011682016040523d82523d6000602084013e6103e3565b606091505b509150915081610430578051600003610428576040517f20e9b5d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b50505050505050565b604080517f4750045d47fce615521b32cee713ff8db50147e98aec5ca94926b52651ca3fa0602080830191909152818301859052825180830384018152606080840185528151918301919091207f190000000000000000000000000000000000000000000000000000000000000060808501527f010000000000000000000000000000000000000000000000000000000000000060818501527f1c7d3b72b37a35523e273aaadd7b4cd66f618bb81429ab053412d51f50ccea6160828501524660a28501529085901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660c284015260d6808401919091528351808403909101815260f690920190925280519101205b92915050565b602082015160408084015184516000939284918791908110610574576105746109af565b016020015160f81c905060018561058c83601b6109de565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156105db573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610636576000610639565b60015b60ff161717949350505050565b60008060006060848603121561065b57600080fd5b833567ffffffffffffffff81111561067257600080fd5b8401610160818703121561068557600080fd5b95602085013595506040909401359392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146106bc57600080fd5b50565b803565ffffffffffff811681146106d557600080fd5b919050565b6000806000806000608086880312156106f257600080fd5b85356106fd8161069a565b945060208601359350610712604087016106bf565b9250606086013567ffffffffffffffff8082111561072f57600080fd5b818801915088601f83011261074357600080fd5b81358181111561075257600080fd5b89602082850101111561076457600080fd5b9699959850939650602001949392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126107ac57600080fd5b83018035915067ffffffffffffffff8211156107c757600080fd5b6020019150368190038213156107dc57600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610843576108436107e3565b5060010190565b6000808585111561085a57600080fd5b8386111561086757600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600080608085870312156108b957600080fd5b84356108c48161069a565b9350602085013592506108d9604086016106bf565b9150606085013567ffffffffffffffff808211156108f657600080fd5b818701915087601f83011261090a57600080fd5b81358181111561091c5761091c610874565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561096257610962610874565b816040528281528a602084870101111561097b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60ff818116838216019081111561054a5761054a6107e356fea164736f6c6343000813000aa164736f6c6343000813000a",
-}
-
-var SmartContractAccountHelperABI = SmartContractAccountHelperMetaData.ABI
-
-var SmartContractAccountHelperBin = SmartContractAccountHelperMetaData.Bin
-
-func DeploySmartContractAccountHelper(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SmartContractAccountHelper, error) {
- parsed, err := SmartContractAccountHelperMetaData.GetAbi()
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- if parsed == nil {
- return common.Address{}, nil, nil, errors.New("GetABI returned nil")
- }
-
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(SmartContractAccountHelperBin), backend)
- if err != nil {
- return common.Address{}, nil, nil, err
- }
- return address, tx, &SmartContractAccountHelper{address: address, abi: *parsed, SmartContractAccountHelperCaller: SmartContractAccountHelperCaller{contract: contract}, SmartContractAccountHelperTransactor: SmartContractAccountHelperTransactor{contract: contract}, SmartContractAccountHelperFilterer: SmartContractAccountHelperFilterer{contract: contract}}, nil
-}
-
-type SmartContractAccountHelper struct {
- address common.Address
- abi abi.ABI
- SmartContractAccountHelperCaller
- SmartContractAccountHelperTransactor
- SmartContractAccountHelperFilterer
-}
-
-type SmartContractAccountHelperCaller struct {
- contract *bind.BoundContract
-}
-
-type SmartContractAccountHelperTransactor struct {
- contract *bind.BoundContract
-}
-
-type SmartContractAccountHelperFilterer struct {
- contract *bind.BoundContract
-}
-
-type SmartContractAccountHelperSession struct {
- Contract *SmartContractAccountHelper
- CallOpts bind.CallOpts
- TransactOpts bind.TransactOpts
-}
-
-type SmartContractAccountHelperCallerSession struct {
- Contract *SmartContractAccountHelperCaller
- CallOpts bind.CallOpts
-}
-
-type SmartContractAccountHelperTransactorSession struct {
- Contract *SmartContractAccountHelperTransactor
- TransactOpts bind.TransactOpts
-}
-
-type SmartContractAccountHelperRaw struct {
- Contract *SmartContractAccountHelper
-}
-
-type SmartContractAccountHelperCallerRaw struct {
- Contract *SmartContractAccountHelperCaller
-}
-
-type SmartContractAccountHelperTransactorRaw struct {
- Contract *SmartContractAccountHelperTransactor
-}
-
-func NewSmartContractAccountHelper(address common.Address, backend bind.ContractBackend) (*SmartContractAccountHelper, error) {
- abi, err := abi.JSON(strings.NewReader(SmartContractAccountHelperABI))
- if err != nil {
- return nil, err
- }
- contract, err := bindSmartContractAccountHelper(address, backend, backend, backend)
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountHelper{address: address, abi: abi, SmartContractAccountHelperCaller: SmartContractAccountHelperCaller{contract: contract}, SmartContractAccountHelperTransactor: SmartContractAccountHelperTransactor{contract: contract}, SmartContractAccountHelperFilterer: SmartContractAccountHelperFilterer{contract: contract}}, nil
-}
-
-func NewSmartContractAccountHelperCaller(address common.Address, caller bind.ContractCaller) (*SmartContractAccountHelperCaller, error) {
- contract, err := bindSmartContractAccountHelper(address, caller, nil, nil)
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountHelperCaller{contract: contract}, nil
-}
-
-func NewSmartContractAccountHelperTransactor(address common.Address, transactor bind.ContractTransactor) (*SmartContractAccountHelperTransactor, error) {
- contract, err := bindSmartContractAccountHelper(address, nil, transactor, nil)
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountHelperTransactor{contract: contract}, nil
-}
-
-func NewSmartContractAccountHelperFilterer(address common.Address, filterer bind.ContractFilterer) (*SmartContractAccountHelperFilterer, error) {
- contract, err := bindSmartContractAccountHelper(address, nil, nil, filterer)
- if err != nil {
- return nil, err
- }
- return &SmartContractAccountHelperFilterer{contract: contract}, nil
-}
-
-func bindSmartContractAccountHelper(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
- parsed, err := SmartContractAccountHelperMetaData.GetAbi()
- if err != nil {
- return nil, err
- }
- return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _SmartContractAccountHelper.Contract.SmartContractAccountHelperCaller.contract.Call(opts, result, method, params...)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _SmartContractAccountHelper.Contract.SmartContractAccountHelperTransactor.contract.Transfer(opts)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _SmartContractAccountHelper.Contract.SmartContractAccountHelperTransactor.contract.Transact(opts, method, params...)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
- return _SmartContractAccountHelper.Contract.contract.Call(opts, result, method, params...)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
- return _SmartContractAccountHelper.Contract.contract.Transfer(opts)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
- return _SmartContractAccountHelper.Contract.contract.Transact(opts, method, params...)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCaller) CalculateSmartContractAccountAddress(opts *bind.CallOpts, owner common.Address, entryPoint common.Address, factory common.Address) (common.Address, error) {
- var out []interface{}
- err := _SmartContractAccountHelper.contract.Call(opts, &out, "calculateSmartContractAccountAddress", owner, entryPoint, factory)
-
- if err != nil {
- return *new(common.Address), err
- }
-
- out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
-
- return out0, err
-
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperSession) CalculateSmartContractAccountAddress(owner common.Address, entryPoint common.Address, factory common.Address) (common.Address, error) {
- return _SmartContractAccountHelper.Contract.CalculateSmartContractAccountAddress(&_SmartContractAccountHelper.CallOpts, owner, entryPoint, factory)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCallerSession) CalculateSmartContractAccountAddress(owner common.Address, entryPoint common.Address, factory common.Address) (common.Address, error) {
- return _SmartContractAccountHelper.Contract.CalculateSmartContractAccountAddress(&_SmartContractAccountHelper.CallOpts, owner, entryPoint, factory)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCaller) GetAbiEncodedDirectRequestData(opts *bind.CallOpts, recipient common.Address, topupThreshold *big.Int, topupAmount *big.Int) ([]byte, error) {
- var out []interface{}
- err := _SmartContractAccountHelper.contract.Call(opts, &out, "getAbiEncodedDirectRequestData", recipient, topupThreshold, topupAmount)
-
- if err != nil {
- return *new([]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
-
- return out0, err
-
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperSession) GetAbiEncodedDirectRequestData(recipient common.Address, topupThreshold *big.Int, topupAmount *big.Int) ([]byte, error) {
- return _SmartContractAccountHelper.Contract.GetAbiEncodedDirectRequestData(&_SmartContractAccountHelper.CallOpts, recipient, topupThreshold, topupAmount)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCallerSession) GetAbiEncodedDirectRequestData(recipient common.Address, topupThreshold *big.Int, topupAmount *big.Int) ([]byte, error) {
- return _SmartContractAccountHelper.Contract.GetAbiEncodedDirectRequestData(&_SmartContractAccountHelper.CallOpts, recipient, topupThreshold, topupAmount)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCaller) GetFullEndTxEncoding(opts *bind.CallOpts, endContract common.Address, value *big.Int, deadline *big.Int, data []byte) ([]byte, error) {
- var out []interface{}
- err := _SmartContractAccountHelper.contract.Call(opts, &out, "getFullEndTxEncoding", endContract, value, deadline, data)
-
- if err != nil {
- return *new([]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
-
- return out0, err
-
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperSession) GetFullEndTxEncoding(endContract common.Address, value *big.Int, deadline *big.Int, data []byte) ([]byte, error) {
- return _SmartContractAccountHelper.Contract.GetFullEndTxEncoding(&_SmartContractAccountHelper.CallOpts, endContract, value, deadline, data)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCallerSession) GetFullEndTxEncoding(endContract common.Address, value *big.Int, deadline *big.Int, data []byte) ([]byte, error) {
- return _SmartContractAccountHelper.Contract.GetFullEndTxEncoding(&_SmartContractAccountHelper.CallOpts, endContract, value, deadline, data)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCaller) GetFullHashForSigning(opts *bind.CallOpts, userOpHash [32]byte, scaAddress common.Address) ([32]byte, error) {
- var out []interface{}
- err := _SmartContractAccountHelper.contract.Call(opts, &out, "getFullHashForSigning", userOpHash, scaAddress)
-
- if err != nil {
- return *new([32]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
-
- return out0, err
-
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperSession) GetFullHashForSigning(userOpHash [32]byte, scaAddress common.Address) ([32]byte, error) {
- return _SmartContractAccountHelper.Contract.GetFullHashForSigning(&_SmartContractAccountHelper.CallOpts, userOpHash, scaAddress)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCallerSession) GetFullHashForSigning(userOpHash [32]byte, scaAddress common.Address) ([32]byte, error) {
- return _SmartContractAccountHelper.Contract.GetFullHashForSigning(&_SmartContractAccountHelper.CallOpts, userOpHash, scaAddress)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCaller) GetInitCode(opts *bind.CallOpts, factory common.Address, owner common.Address, entryPoint common.Address) ([]byte, error) {
- var out []interface{}
- err := _SmartContractAccountHelper.contract.Call(opts, &out, "getInitCode", factory, owner, entryPoint)
-
- if err != nil {
- return *new([]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
-
- return out0, err
-
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperSession) GetInitCode(factory common.Address, owner common.Address, entryPoint common.Address) ([]byte, error) {
- return _SmartContractAccountHelper.Contract.GetInitCode(&_SmartContractAccountHelper.CallOpts, factory, owner, entryPoint)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCallerSession) GetInitCode(factory common.Address, owner common.Address, entryPoint common.Address) ([]byte, error) {
- return _SmartContractAccountHelper.Contract.GetInitCode(&_SmartContractAccountHelper.CallOpts, factory, owner, entryPoint)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCaller) GetSCAInitCodeWithConstructor(opts *bind.CallOpts, owner common.Address, entryPoint common.Address) ([]byte, error) {
- var out []interface{}
- err := _SmartContractAccountHelper.contract.Call(opts, &out, "getSCAInitCodeWithConstructor", owner, entryPoint)
-
- if err != nil {
- return *new([]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
-
- return out0, err
-
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperSession) GetSCAInitCodeWithConstructor(owner common.Address, entryPoint common.Address) ([]byte, error) {
- return _SmartContractAccountHelper.Contract.GetSCAInitCodeWithConstructor(&_SmartContractAccountHelper.CallOpts, owner, entryPoint)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelperCallerSession) GetSCAInitCodeWithConstructor(owner common.Address, entryPoint common.Address) ([]byte, error) {
- return _SmartContractAccountHelper.Contract.GetSCAInitCodeWithConstructor(&_SmartContractAccountHelper.CallOpts, owner, entryPoint)
-}
-
-func (_SmartContractAccountHelper *SmartContractAccountHelper) Address() common.Address {
- return _SmartContractAccountHelper.address
-}
-
-type SmartContractAccountHelperInterface interface {
- CalculateSmartContractAccountAddress(opts *bind.CallOpts, owner common.Address, entryPoint common.Address, factory common.Address) (common.Address, error)
-
- GetAbiEncodedDirectRequestData(opts *bind.CallOpts, recipient common.Address, topupThreshold *big.Int, topupAmount *big.Int) ([]byte, error)
-
- GetFullEndTxEncoding(opts *bind.CallOpts, endContract common.Address, value *big.Int, deadline *big.Int, data []byte) ([]byte, error)
-
- GetFullHashForSigning(opts *bind.CallOpts, userOpHash [32]byte, scaAddress common.Address) ([32]byte, error)
-
- GetInitCode(opts *bind.CallOpts, factory common.Address, owner common.Address, entryPoint common.Address) ([]byte, error)
-
- GetSCAInitCodeWithConstructor(opts *bind.CallOpts, owner common.Address, entryPoint common.Address) ([]byte, error)
-
- Address() common.Address
-}
diff --git a/core/gethwrappers/transmission/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/transmission/generation/generated-wrapper-dependency-versions-do-not-edit.txt
deleted file mode 100644
index 3ccf8656388..00000000000
--- a/core/gethwrappers/transmission/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-GETH_VERSION: 1.14.11
-entry_point: ../../../contracts/solc/v0.8.19/EntryPoint/EntryPoint.abi ../../../contracts/solc/v0.8.19/EntryPoint/EntryPoint.bin e43da0e61256471b317cab1c87f2425cecba9b81ac21633334f889bab2f0777d
-greeter: ../../../contracts/solc/v0.8.15/Greeter.abi ../../../contracts/solc/v0.8.15/Greeter.bin 653dcba5c33a46292073939ce1e639372cf521c0ec2814d4c9f20c72f796f18c
-greeter_wrapper: ../../../contracts/solc/v0.8.19/Greeter/Greeter.abi ../../../contracts/solc/v0.8.19/Greeter/Greeter.bin 7f6def58e337a53553a46cb7992cf2d75ec951014d79376fcb869a2b16b53f6d
-paymaster_wrapper: ../../../contracts/solc/v0.8.19/Paymaster/Paymaster.abi ../../../contracts/solc/v0.8.19/Paymaster/Paymaster.bin dbdd1341cfa2d5c09730e0decc32339f62d1a4ea89835a51ff774226ddfbd04b
-sca: ../../../contracts/solc/v0.8.15/SCA.abi ../../../contracts/solc/v0.8.15/SCA.bin ae0f860cdac87d4ac505edbd228bd3ea1108550453aba67aebcb61f09cf70d0b
-sca_wrapper: ../../../contracts/solc/v0.8.19/SCA/SCA.abi ../../../contracts/solc/v0.8.19/SCA/SCA.bin 6ef817bdefad1b5e84f06e0bdc40848000ab00e1a38371435b793946f425a8e6
-smart_contract_account_factory: ../../../contracts/solc/v0.8.19/SmartContractAccountFactory/SmartContractAccountFactory.abi ../../../contracts/solc/v0.8.19/SmartContractAccountFactory/SmartContractAccountFactory.bin a357132e2782c462fa31ed80c270fe002e666a48ecfe407b71c278fc3a0d3679
-smart_contract_account_helper: ../../../contracts/solc/v0.8.19/SmartContractAccountHelper/SmartContractAccountHelper.abi ../../../contracts/solc/v0.8.19/SmartContractAccountHelper/SmartContractAccountHelper.bin a06aff23aded74d53bd342fdc32d80c3b474ff38223df27f3395e9fd90abd12a
diff --git a/core/gethwrappers/transmission/go_generate.go b/core/gethwrappers/transmission/go_generate.go
deleted file mode 100644
index b3f2b4b0eb9..00000000000
--- a/core/gethwrappers/transmission/go_generate.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Package gethwrappers provides tools for wrapping solidity contracts with
-// golang packages, using abigen.
-package gethwrappers
-
-// Transmission
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/Greeter/Greeter.abi ../../../contracts/solc/v0.8.19/Greeter/Greeter.bin Greeter greeter_wrapper
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/SmartContractAccountFactory/SmartContractAccountFactory.abi ../../../contracts/solc/v0.8.19/SmartContractAccountFactory/SmartContractAccountFactory.bin SmartContractAccountFactory smart_contract_account_factory
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/EntryPoint/EntryPoint.abi ../../../contracts/solc/v0.8.19/EntryPoint/EntryPoint.bin EntryPoint entry_point
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/SmartContractAccountHelper/SmartContractAccountHelper.abi ../../../contracts/solc/v0.8.19/SmartContractAccountHelper/SmartContractAccountHelper.bin SmartContractAccountHelper smart_contract_account_helper
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/SCA/SCA.abi ../../../contracts/solc/v0.8.19/SCA/SCA.bin SCA sca_wrapper
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/Paymaster/Paymaster.abi ../../../contracts/solc/v0.8.19/Paymaster/Paymaster.bin Paymaster paymaster_wrapper
diff --git a/core/gethwrappers/workflow/generated/workflow_registry_wrapper/workflow_registry_wrapper.go b/core/gethwrappers/workflow/generated/workflow_registry_wrapper/workflow_registry_wrapper.go
index c87f59c0e7b..a81d69c343e 100644
--- a/core/gethwrappers/workflow/generated/workflow_registry_wrapper/workflow_registry_wrapper.go
+++ b/core/gethwrappers/workflow/generated/workflow_registry_wrapper/workflow_registry_wrapper.go
@@ -43,7 +43,7 @@ type WorkflowRegistryWorkflowMetadata struct {
var WorkflowRegistryMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AddressNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotWorkflowOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"}],\"name\":\"DONNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWorkflowID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryLocked\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"maxAllowedLength\",\"type\":\"uint8\"}],\"name\":\"URLTooLong\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WorkflowAlreadyInDesiredStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WorkflowAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WorkflowContentNotUpdated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WorkflowDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WorkflowIDAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WorkflowIDNotUpdated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"providedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"maxAllowedLength\",\"type\":\"uint8\"}],\"name\":\"WorkflowNameTooLong\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32[]\",\"name\":\"donIDs\",\"type\":\"uint32[]\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"AllowedDONsUpdatedV1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"AuthorizedAddressesUpdatedV1\",\"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\":\"lockedBy\",\"type\":\"address\"}],\"name\":\"RegistryLockedV1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"unlockedBy\",\"type\":\"address\"}],\"name\":\"RegistryUnlockedV1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"}],\"name\":\"WorkflowActivatedV1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"}],\"name\":\"WorkflowDeletedV1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"secretsURLHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"}],\"name\":\"WorkflowForceUpdateSecretsRequestedV1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"}],\"name\":\"WorkflowPausedV1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"workflowID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"enumWorkflowRegistry.WorkflowStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"binaryURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"configURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"secretsURL\",\"type\":\"string\"}],\"name\":\"WorkflowRegisteredV1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"oldWorkflowID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newWorkflowID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"binaryURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"configURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"secretsURL\",\"type\":\"string\"}],\"name\":\"WorkflowUpdatedV1\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"workflowKey\",\"type\":\"bytes32\"}],\"name\":\"activateWorkflow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"field\",\"type\":\"string\"}],\"name\":\"computeHashKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"workflowKey\",\"type\":\"bytes32\"}],\"name\":\"deleteWorkflow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAllowedDONs\",\"outputs\":[{\"internalType\":\"uint32[]\",\"name\":\"allowedDONs\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedAddresses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"authorizedAddresses\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"}],\"name\":\"getWorkflowMetadata\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"workflowID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"internalType\":\"enumWorkflowRegistry.WorkflowStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"binaryURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"configURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"secretsURL\",\"type\":\"string\"}],\"internalType\":\"structWorkflowRegistry.WorkflowMetadata\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getWorkflowMetadataListByDON\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"workflowID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"internalType\":\"enumWorkflowRegistry.WorkflowStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"binaryURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"configURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"secretsURL\",\"type\":\"string\"}],\"internalType\":\"structWorkflowRegistry.WorkflowMetadata[]\",\"name\":\"workflowMetadataList\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getWorkflowMetadataListByOwner\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"workflowID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"internalType\":\"enumWorkflowRegistry.WorkflowStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"binaryURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"configURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"secretsURL\",\"type\":\"string\"}],\"internalType\":\"structWorkflowRegistry.WorkflowMetadata[]\",\"name\":\"workflowMetadataList\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRegistryLocked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"workflowKey\",\"type\":\"bytes32\"}],\"name\":\"pauseWorkflow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"workflowName\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"workflowID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"donID\",\"type\":\"uint32\"},{\"internalType\":\"enumWorkflowRegistry.WorkflowStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"binaryURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"configURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"secretsURL\",\"type\":\"string\"}],\"name\":\"registerWorkflow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"secretsURL\",\"type\":\"string\"}],\"name\":\"requestForceUpdateSecrets\",\"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\":\"unlockRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"donIDs\",\"type\":\"uint32[]\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"updateAllowedDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"updateAuthorizedAddresses\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"workflowKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newWorkflowID\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"binaryURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"configURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"secretsURL\",\"type\":\"string\"}],\"name\":\"updateWorkflow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6080806040523461004a57331561003b57600180546001600160a01b03191633179055600a805460ff191690556040516133f390816100508239f35b639b15e16f60e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806308e7f63a14612096578063181f5a77146120075780632303348a14611eca5780632b596f6d14611e3c5780633ccd14ff14611502578063695e13401461135a5780636f35177114611281578063724c13dd1461118a5780637497066b1461106f57806379ba509714610f995780637ec0846d14610f0e5780638da5cb5b14610ebc5780639f4cb53414610e9b578063b87a019414610e45578063d4b89c7414610698578063db800092146105fd578063e3dce080146104d6578063e690f33214610362578063f2fde38b14610284578063f794bdeb146101495763f99ecb6b1461010357600080fd5b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457602060ff600a54166040519015158152f35b600080fd5b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610144576006805461018581612410565b6101926040519182612297565b81815261019e82612410565b916020937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401940136853760005b82811061023257505050906040519283926020840190602085525180915260408401929160005b82811061020557505050500390f35b835173ffffffffffffffffffffffffffffffffffffffff16855286955093810193928101926001016101f6565b6001908260005273ffffffffffffffffffffffffffffffffffffffff817ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01541661027d8287612542565b52016101cf565b346101445760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610144576102bb61237e565b6102c3612bdb565b73ffffffffffffffffffffffffffffffffffffffff8091169033821461033857817fffffffffffffffffffffffff00000000000000000000000000000000000000006000541617600055600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b60046040517fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b346101445760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760ff600a54166104ac576103a760043533612dc1565b600181019081549160ff8360c01c16600281101561047d576001146104535778010000000000000000000000000000000000000000000000007fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff841617905580547f6a0ed88e9cf3cb493ab4028fcb1dc7d18f0130fcdfba096edde0aadbfbf5e99f63ffffffff604051946020865260a01c16938061044e339560026020840191016125e4565b0390a4005b60046040517f6f861db1000000000000000000000000000000000000000000000000000000008152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60046040517f78a4e7d9000000000000000000000000000000000000000000000000000000008152fd5b34610144576104e436612306565b916104ed612bdb565b60ff600a54166104ac5760005b828110610589575060405191806040840160408552526060830191906000905b8082106105515785151560208601527f509460cccbb176edde6cac28895a4415a24961b8f3a0bd2617b9bb7b4e166c9b85850386a1005b90919283359073ffffffffffffffffffffffffffffffffffffffff82168092036101445760019181526020809101940192019061051a565b60019084156105cb576105c373ffffffffffffffffffffffffffffffffffffffff6105bd6105b8848888612a7b565b612bba565b16612f9c565b505b016104fa565b6105f773ffffffffffffffffffffffffffffffffffffffff6105f16105b8848888612a7b565b166131cd565b506105c5565b346101445761061d61060e366123a1565b91610617612428565b50612a9c565b6000526004602052604060002073ffffffffffffffffffffffffffffffffffffffff6001820154161561066e5761065661066a91612698565b604051918291602083526020830190612154565b0390f35b60046040517f871e01b2000000000000000000000000000000000000000000000000000000008152fd5b346101445760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760443567ffffffffffffffff8111610144576106e79036906004016122d8565b9060643567ffffffffffffffff8111610144576107089036906004016122d8565b9160843567ffffffffffffffff8111610144576107299036906004016122d8565b60ff600a94929454166104ac57610744818688602435612cd0565b61075060043533612dc1565b9163ffffffff600184015460a01c169561076a3388612c26565b8354946024358614610e1b576107a56040516107948161078d8160038b016125e4565b0382612297565b61079f368c8561284c565b90612e30565b6107c76040516107bc8161078d8160048c016125e4565b61079f36868861284c565b6107e96040516107de8161078d8160058d016125e4565b61079f36898d61284c565b918080610e14575b80610e0d575b610de357602435885515610c8e575b15610b3d575b15610890575b926108807f41161473ce2ed633d9f902aab9702d16a5531da27ec84e1939abeffe54ad7353959361044e93610872610864978d604051998a996024358b5260a060208c0152600260a08c0191016125e4565b9189830360408b015261290f565b91868303606088015261290f565b908382036080850152339761290f565b61089d6005860154612591565b610ad6575b67ffffffffffffffff8411610aa7576108cb846108c26005880154612591565b600588016128c8565b6000601f85116001146109a757928492610872610880938a9b9c61094f876108649b9a61044e9a7f41161473ce2ed633d9f902aab9702d16a5531da27ec84e1939abeffe54ad73539e9f60009261099c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b60058a01555b8c8780610972575b50509c9b9a9950935050929495509250610812565b61097c9133612a9c565b60005260056020526109946004356040600020612fee565b508c8761095d565b013590508f8061091d565b9860058601600052602060002060005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087168110610a8f5750926108726108809361044e969388968c7f41161473ce2ed633d9f902aab9702d16a5531da27ec84e1939abeffe54ad73539c9d9e9f897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06108649e9d1610610a57575b505050600187811b0160058a0155610955565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88b60031b161c199101351690558e8d81610a44565b898c0135825560209b8c019b600190920191016109b7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516020810190610b1c81610af060058a01338661294e565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612297565b5190206000526005602052610b376004356040600020613294565b506108a2565b67ffffffffffffffff8311610aa757610b6683610b5d6004890154612591565b600489016128c8565b600083601f8111600114610bc75780610bb292600091610bbc575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b600487015561080c565b90508601358d610b81565b506004870160005260206000209060005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086168110610c765750847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0811610610c3e575b5050600183811b01600487015561080c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19908601351690558a80610c2c565b9091602060018192858a013581550193019101610bd8565b67ffffffffffffffff8b11610aa757610cb78b610cae60038a0154612591565b60038a016128c8565b60008b601f8111600114610d175780610d0292600091610d0c57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b6003880155610806565b90508501358e610b81565b506003880160005260206000209060005b8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081168210610dca578091507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0811610610d91575b905060018092501b016003880155610806565b60f87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9160031b161c19908501351690558b808c610d7e565b5085820135835560019092019160209182019101610d28565b60046040517f6b4a810d000000000000000000000000000000000000000000000000000000008152fd5b50826107f7565b50816107f1565b60046040517f95406722000000000000000000000000000000000000000000000000000000008152fd5b346101445760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445761066a610e8f610e8261237e565b6044359060243590612af7565b604051918291826121f8565b34610144576020610eb4610eae366123a1565b91612a9c565b604051908152f35b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457610f45612bdb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00600a5416600a557f11a03e25ee25bf1459f9e1cb293ea03707d84917f54a65e32c9a7be2f2edd68a6020604051338152a1005b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760005473ffffffffffffffffffffffffffffffffffffffff808216330361104557600154917fffffffffffffffffffffffff0000000000000000000000000000000000000000903382851617600155166000553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60046040517f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457600880546110ab81612410565b6110b86040519182612297565b8181526110c482612410565b916020937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401940136853760005b82811061114857505050906040519283926020840190602085525180915260408401929160005b82811061112b57505050500390f35b835163ffffffff168552869550938101939281019260010161111c565b6001908260005263ffffffff817ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30154166111838287612542565b52016110f5565b346101445761119836612306565b916111a1612bdb565b60ff600a54166104ac5760005b82811061122d575060405191806040840160408552526060830191906000905b8082106112055785151560208601527fcab63bf31d1e656baa23cebef64e12033ea0ffbd44b1278c3747beec2d2f618c85850386a1005b90919283359063ffffffff8216809203610144576001918152602080910194019201906111ce565b600190841561125f5761125763ffffffff61125161124c848888612a7b565b612a8b565b16612ee3565b505b016111ae565b61127b63ffffffff61127561124c848888612a7b565b1661307a565b50611259565b346101445760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760ff600a54166104ac576112c660043533612dc1565b600181019081549163ffffffff8360a01c169260ff8160c01c16600281101561047d5715610453577fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff9061131a3386612c26565b16905580547f17b2d730bb5e064df3fbc6165c8aceb3b0d62c524c196c0bc1012209280bc9a6604051602081528061044e339560026020840191016125e4565b34610144576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610144576004359060ff600a54166104ac576113a28233612dc1565b916113ba336000526007602052604060002054151590565b156114d25760049233600052600283526113d8826040600020613294565b50600181019063ffffffff80835460a01c16600052600385526113ff846040600020613294565b506005820161140e8154612591565b61149e575b508154925460a01c16917f76ee2dfcae10cb8522e62e713e62660e09ecfaab08db15d9404de1914132257160405186815280611456339560028a840191016125e4565b0390a46000525261149c60056040600020600081556000600182015561147e60028201612a32565b61148a60038201612a32565b61149660048201612a32565b01612a32565b005b6040516114b381610af089820194338661294e565b519020600052600585526114cb846040600020613294565b5086611413565b60246040517f85982a00000000000000000000000000000000000000000000000000000000008152336004820152fd5b346101445760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760043567ffffffffffffffff8111610144576115519036906004016122d8565b6044359163ffffffff8316830361014457600260643510156101445760843567ffffffffffffffff81116101445761158d9036906004016122d8565b91909260a43567ffffffffffffffff8111610144576115b09036906004016122d8565b60c43567ffffffffffffffff8111610144576115d09036906004016122d8565b96909560ff600a54166104ac576115e7338a612c26565b60408511611e04576115fd888483602435612cd0565b611608858733612a9c565b80600052600460205273ffffffffffffffffffffffffffffffffffffffff60016040600020015416611dda57604051906116418261227a565b602435825233602083015263ffffffff8b16604083015261166760643560608401612585565b61167236888a61284c565b608083015261168236848661284c565b60a083015261169236868861284c565b60c08301526116a2368b8b61284c565b60e0830152806000526004602052604060002091805183556001830173ffffffffffffffffffffffffffffffffffffffff60208301511681549077ffffffff0000000000000000000000000000000000000000604085015160a01b16906060850151600281101561047d5778ff0000000000000000000000000000000000000000000000007fffffffffffffff000000000000000000000000000000000000000000000000009160c01b1693161717179055608081015180519067ffffffffffffffff8211610aa7576117858261177c6002880154612591565b600288016128c8565b602090601f8311600114611d0e576117d2929160009183611c375750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b60028401555b60a081015180519067ffffffffffffffff8211610aa757611809826118006003880154612591565b600388016128c8565b602090601f8311600114611c4257611856929160009183611c375750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b60038401555b60c081015180519067ffffffffffffffff8211610aa75761188d826118846004880154612591565b600488016128c8565b602090601f8311600114611b6a5791806118de9260e09594600092611a455750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b60048501555b015180519267ffffffffffffffff8411610aa757838d926119168e9661190d6005860154612591565b600586016128c8565b602090601f8311600114611a50579463ffffffff61087295819a957fc4399022965bad9b2b468bbd8c758a7e80cdde36ff3088ddbb7f93bdfb5623cb9f9e9d99946119a28761044e9f9b98600593611a069f9a600092611a455750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9101555b3360005260026020526119bd836040600020612fee565b501660005260036020526119d5816040600020612fee565b508d82611a1c575b5050506108646040519a8b9a6119f58c6064356120e9565b60a060208d015260a08c019161290f565b978389036080850152169633966024359661290f565b611a3c92611a2a9133612a9c565b60005260056020526040600020612fee565b508c8f8d6119dd565b01519050388061091d565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110611b4057506108729563ffffffff9a957fc4399022965bad9b2b468bbd8c758a7e80cdde36ff3088ddbb7f93bdfb5623cb9f9e9d999460018761044e9f9b96928f9693611a069f9a94837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06005971610611b09575b505050811b019101556119a6565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080611afb565b939550918194969750600160209291839285015181550194019201918f9492918f97969492611a61565b906004860160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110611c1f5750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060e098971610611be8575b505050811b0160048501556118e4565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558f8080611bd8565b91926020600181928685015181550194019201611b7b565b015190508f8061091d565b9190600386016000526020600020906000935b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084168510611cf35760019450837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0811610611cbc575b505050811b01600384015561185c565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080611cac565b81810151835560209485019460019093019290910190611c55565b9190600286016000526020600020906000935b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084168510611dbf5760019450837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0811610611d88575b505050811b0160028401556117d8565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080611d78565b81810151835560209485019460019093019290910190611d21565b60046040517fa0677dd0000000000000000000000000000000000000000000000000000000008152fd5b604485604051907f36a7c503000000000000000000000000000000000000000000000000000000008252600482015260406024820152fd5b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457611e73612bdb565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00600a541617600a557f2789711f6fd67d131ad68378617b5d1d21a2c92b34d7c3745d70b3957c08096c6020604051338152a1005b34610144576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760043567ffffffffffffffff811161014457611f1a9036906004016122d8565b60ff600a54166104ac57611f2e9133612a9c565b90816000526005602052604060002091825491821561066e5760005b838110611f5357005b80611f6060019287612ecb565b90549060031b1c60005260048352604060002063ffffffff8382015460a01c1660005260098452604060002054151580611fea575b611fa1575b5001611f4a565b7f95d94f817db4971aa99ba35d0fe019bd8cc39866fbe02b6d47b5f0f3727fb67360405186815260408682015280611fe1339460026040840191016125e4565b0390a286611f9a565b50612002336000526007602052604060002054151590565b611f95565b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457604051604081019080821067ffffffffffffffff831117610aa75761066a91604052601a81527f576f726b666c6f77526567697374727920312e302e302d64657600000000000060208201526040519182916020835260208301906120f6565b346101445760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760043563ffffffff8116810361014457610e8f61066a916044359060243590612757565b90600282101561047d5752565b919082519283825260005b8481106121405750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b602081830181015184830182015201612101565b6121f59160e06121e46121d26121c06101008651865273ffffffffffffffffffffffffffffffffffffffff602088015116602087015263ffffffff60408801511660408701526121ac606088015160608801906120e9565b6080870151908060808801528601906120f6565b60a086015185820360a08701526120f6565b60c085015184820360c08601526120f6565b9201519060e08184039101526120f6565b90565b6020808201906020835283518092526040830192602060408460051b8301019501936000915b84831061222e5750505050505090565b909192939495848061226a837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187528a51612154565b980193019301919493929061221e565b610100810190811067ffffffffffffffff821117610aa757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610aa757604052565b9181601f840112156101445782359167ffffffffffffffff8311610144576020838186019501011161014457565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126101445760043567ffffffffffffffff9283821161014457806023830112156101445781600401359384116101445760248460051b8301011161014457602401919060243580151581036101445790565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014457565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126101445760043573ffffffffffffffffffffffffffffffffffffffff8116810361014457916024359067ffffffffffffffff82116101445761240c916004016122d8565b9091565b67ffffffffffffffff8111610aa75760051b60200190565b604051906124358261227a565b606060e0836000815260006020820152600060408201526000838201528260808201528260a08201528260c08201520152565b6040516020810181811067ffffffffffffffff821117610aa7576040526000815290565b9061249682612410565b6124a36040519182612297565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06124d18294612410565b019060005b8281106124e257505050565b6020906124ed612428565b828285010152016124d6565b9190820180921161250657565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190820391821161250657565b80518210156125565760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600282101561047d5752565b90600182811c921680156125da575b60208310146125ab57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916125a0565b8054600093926125f382612591565b9182825260209360019160018116908160001461265b575060011461261a575b5050505050565b90939495506000929192528360002092846000945b83861061264757505050500101903880808080612613565b80548587018301529401938590820161262f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168685015250505090151560051b010191503880808080612613565b90600560e06040936127538551916126af8361227a565b61274c8397825485526126f960ff600185015473ffffffffffffffffffffffffffffffffffffffff8116602089015263ffffffff8160a01c168489015260c01c1660608701612585565b805161270c8161078d81600288016125e4565b608086015280516127248161078d81600388016125e4565b60a0860152805161273c8161078d81600488016125e4565b60c08601525180968193016125e4565b0384612297565b0152565b63ffffffff16916000838152600360209060036020526040936040842054908187101561283c576127ab918160648993118015612834575b61282c575b8161279f82856124f9565b111561281c5750612535565b946127b58661248c565b96845b8781106127ca57505050505050505090565b6001908287528486526127e98888206127e383876124f9565b90612ecb565b905490861b1c875260048652612800888820612698565b61280a828c612542565b52612815818b612542565b50016127b8565b6128279150826124f9565b612535565b506064612794565b50801561278f565b50505050505050506121f5612468565b92919267ffffffffffffffff8211610aa7576040519161289460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184612297565b829481845281830111610144578281602093846000960137010152565b8181106128bc575050565b600081556001016128b1565b9190601f81116128d757505050565b612903926000526020600020906020601f840160051c83019310612905575b601f0160051c01906128b1565b565b90915081906128f6565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b91907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009060601b16825260149060009281549261298a84612591565b926001946001811690816000146129f157506001146129ac575b505050505090565b9091929395945060005260209460206000206000905b8582106129de57505050506014929350010138808080806129a4565b80548583018501529087019082016129c2565b92505050601494507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00919350168383015280151502010138808080806129a4565b612a3c8154612591565b9081612a46575050565b81601f60009311600114612a58575055565b908083918252612a77601f60208420940160051c8401600185016128b1565b5555565b91908110156125565760051b0190565b3563ffffffff811681036101445790565b91906034612af191836040519485927fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602085019860601b168852848401378101600083820152036014810184520182612297565b51902090565b73ffffffffffffffffffffffffffffffffffffffff1691600083815260029260209060026020526040936040842054908183101561283c57612b4e9181606485931180156128345761282c578161279f82856124f9565b94612b588661248c565b96845b878110612b6d57505050505050505090565b600190828752838652612b868888206127e383886124f9565b90549060031b1c875260048652612b9e888820612698565b612ba8828c612542565b52612bb3818b612542565b5001612b5b565b3573ffffffffffffffffffffffffffffffffffffffff811681036101445790565b73ffffffffffffffffffffffffffffffffffffffff600154163303612bfc57565b60046040517f2b5c74de000000000000000000000000000000000000000000000000000000008152fd5b63ffffffff1680600052600960205260406000205415612c9f575073ffffffffffffffffffffffffffffffffffffffff1680600052600760205260406000205415612c6e5750565b602490604051907f85982a000000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907f8fe6d7e10000000000000000000000000000000000000000000000000000000082526004820152fd5b91909115612d975760c891828111612d615750818111612d2c5750808211612cf6575050565b60449250604051917ecd56a800000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b604491604051917ecd56a800000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449083604051917ecd56a800000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60046040517f7dc2f4e1000000000000000000000000000000000000000000000000000000008152fd5b90600052600460205260406000209073ffffffffffffffffffffffffffffffffffffffff8060018401541691821561066e5716809103612dff575090565b602490604051907f31ee6dc70000000000000000000000000000000000000000000000000000000082526004820152fd5b9081518151908181149384612e47575b5050505090565b6020929394508201209201201438808080612e40565b6008548110156125565760086000527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190600090565b6006548110156125565760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600090565b80548210156125565760005260206000200190600090565b600081815260096020526040812054612f975760085468010000000000000000811015612f6a579082612f56612f2184600160409601600855612e5d565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560085492815260096020522055600190565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b905090565b600081815260076020526040812054612f975760065468010000000000000000811015612f6a579082612fda612f2184600160409601600655612e94565b905560065492815260076020522055600190565b9190600183016000908282528060205260408220541560001461307457845494680100000000000000008610156130475783613037612f21886001604098999a01855584612ecb565b9055549382526020522055600190565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50925050565b60008181526009602052604081205490919080156131c8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081810181811161319b576008549083820191821161316e5781810361313a575b505050600854801561310d578101906130ec82612e5d565b909182549160031b1b19169055600855815260096020526040812055600190565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526031600452fd5b613158613149612f2193612e5d565b90549060031b1c928392612e5d565b90558452600960205260408420553880806130d4565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b505090565b60008181526007602052604081205490919080156131c8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081810181811161319b576006549083820191821161316e57818103613260575b505050600654801561310d5781019061323f82612e94565b909182549160031b1b19169055600655815260076020526040812055600190565b61327e61326f612f2193612e94565b90549060031b1c928392612e94565b9055845260076020526040842055388080613227565b90600182019060009281845282602052604084205490811515600014612e40577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918281018181116133b95782549084820191821161338c57818103613357575b5050508054801561332a5782019161330d8383612ecb565b909182549160031b1b191690555582526020526040812055600190565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526031600452fd5b613377613367612f219386612ecb565b90549060031b1c92839286612ecb565b905586528460205260408620553880806132f5565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fdfea164736f6c6343000818000a",
+ Bin: "0x6080806040523461004a57331561003b57600180546001600160a01b03191633179055600b805460ff191690556040516134e290816100508239f35b639b15e16f60e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806308e7f63a1461210e578063181f5a771461207f5780632303348a14611f425780632b596f6d14611eb45780633ccd14ff14611572578063695e1340146113965780636f351771146112bd578063724c13dd146111c65780637497066b146110ab57806379ba509714610fd55780637ec0846d14610f4a5780638da5cb5b14610ef85780639f4cb53414610ed7578063b87a019414610e81578063d4b89c7414610698578063db800092146105fd578063e3dce080146104d6578063e690f33214610362578063f2fde38b14610284578063f794bdeb146101495763f99ecb6b1461010357600080fd5b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457602060ff600b54166040519015158152f35b600080fd5b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610144576007805461018581612488565b610192604051918261230f565b81815261019e82612488565b916020937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401940136853760005b82811061023257505050906040519283926020840190602085525180915260408401929160005b82811061020557505050500390f35b835173ffffffffffffffffffffffffffffffffffffffff16855286955093810193928101926001016101f6565b6001908260005273ffffffffffffffffffffffffffffffffffffffff817fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68801541661027d82876125ba565b52016101cf565b346101445760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610144576102bb6123f6565b6102c3612c53565b73ffffffffffffffffffffffffffffffffffffffff8091169033821461033857817fffffffffffffffffffffffff00000000000000000000000000000000000000006000541617600055600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b60046040517fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b346101445760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760ff600b54166104ac576103a760043533612eb0565b600181019081549160ff8360c01c16600281101561047d576001146104535778010000000000000000000000000000000000000000000000007fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff841617905580547f6a0ed88e9cf3cb493ab4028fcb1dc7d18f0130fcdfba096edde0aadbfbf5e99f63ffffffff604051946020865260a01c16938061044e3395600260208401910161265c565b0390a4005b60046040517f6f861db1000000000000000000000000000000000000000000000000000000008152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60046040517f78a4e7d9000000000000000000000000000000000000000000000000000000008152fd5b34610144576104e43661237e565b916104ed612c53565b60ff600b54166104ac5760005b828110610589575060405191806040840160408552526060830191906000905b8082106105515785151560208601527f509460cccbb176edde6cac28895a4415a24961b8f3a0bd2617b9bb7b4e166c9b85850386a1005b90919283359073ffffffffffffffffffffffffffffffffffffffff82168092036101445760019181526020809101940192019061051a565b60019084156105cb576105c373ffffffffffffffffffffffffffffffffffffffff6105bd6105b8848888612af3565b612c32565b1661308b565b505b016104fa565b6105f773ffffffffffffffffffffffffffffffffffffffff6105f16105b8848888612af3565b166132bc565b506105c5565b346101445761061d61060e36612419565b916106176124a0565b50612b14565b6000526004602052604060002073ffffffffffffffffffffffffffffffffffffffff6001820154161561066e5761065661066a91612710565b6040519182916020835260208301906121cc565b0390f35b60046040517f871e01b2000000000000000000000000000000000000000000000000000000008152fd5b346101445760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760443567ffffffffffffffff8111610144576106e7903690600401612350565b9060643567ffffffffffffffff811161014457610708903690600401612350565b9160843567ffffffffffffffff811161014457610729903690600401612350565b60ff600b94929454166104ac57610741818688612d48565b61074d60043533612eb0565b9163ffffffff600184015460a01c16956107673388612c9e565b8354946024358614610e57576107a26040516107918161078a8160038b0161265c565b038261230f565b61079c368c856128c4565b90612f1f565b6107c46040516107b98161078a8160048c0161265c565b61079c3686886128c4565b6107e66040516107db8161078a8160058d0161265c565b61079c36898d6128c4565b918080610e50575b80610e49575b610e1f57610803602435612e08565b88600052600660205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008154169055602435885515610cca575b15610b79575b156108cc575b926108bc7f41161473ce2ed633d9f902aab9702d16a5531da27ec84e1939abeffe54ad7353959361044e936108ae6108a0978d604051998a996024358b5260a060208c0152600260a08c01910161265c565b9189830360408b0152612987565b918683036060880152612987565b9083820360808501523397612987565b6108d96005860154612609565b610b12575b67ffffffffffffffff8411610ae357610907846108fe6005880154612609565b60058801612940565b6000601f85116001146109e3579284926108ae6108bc938a9b9c61098b876108a09b9a61044e9a7f41161473ce2ed633d9f902aab9702d16a5531da27ec84e1939abeffe54ad73539e9f6000926109d8575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b60058a01555b8c87806109ae575b50509c9b9a995093505092949550925061084e565b6109b89133612b14565b60005260056020526109d060043560406000206130dd565b508c87610999565b013590508f80610959565b9860058601600052602060002060005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087168110610acb5750926108ae6108bc9361044e969388968c7f41161473ce2ed633d9f902aab9702d16a5531da27ec84e1939abeffe54ad73539c9d9e9f897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06108a09e9d1610610a93575b505050600187811b0160058a0155610991565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88b60031b161c199101351690558e8d81610a80565b898c0135825560209b8c019b600190920191016109f3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516020810190610b5881610b2c60058a0133866129c6565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261230f565b5190206000526005602052610b736004356040600020613383565b506108de565b67ffffffffffffffff8311610ae357610ba283610b996004890154612609565b60048901612940565b600083601f8111600114610c035780610bee92600091610bf8575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b6004870155610848565b90508601358d610bbd565b506004870160005260206000209060005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086168110610cb25750847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0811610610c7a575b5050600183811b016004870155610848565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19908601351690558a80610c68565b9091602060018192858a013581550193019101610c14565b67ffffffffffffffff8b11610ae357610cf38b610cea60038a0154612609565b60038a01612940565b60008b601f8111600114610d535780610d3e92600091610d4857507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b6003880155610842565b90508501358e610bbd565b506003880160005260206000209060005b8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081168210610e06578091507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0811610610dcd575b905060018092501b016003880155610842565b60f87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9160031b161c19908501351690558b808c610dba565b5085820135835560019092019160209182019101610d64565b60046040517f6b4a810d000000000000000000000000000000000000000000000000000000008152fd5b50826107f4565b50816107ee565b60046040517f95406722000000000000000000000000000000000000000000000000000000008152fd5b346101445760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445761066a610ecb610ebe6123f6565b6044359060243590612b6f565b60405191829182612270565b34610144576020610ef0610eea36612419565b91612b14565b604051908152f35b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457610f81612c53565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00600b5416600b557f11a03e25ee25bf1459f9e1cb293ea03707d84917f54a65e32c9a7be2f2edd68a6020604051338152a1005b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760005473ffffffffffffffffffffffffffffffffffffffff808216330361108157600154917fffffffffffffffffffffffff0000000000000000000000000000000000000000903382851617600155166000553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60046040517f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457600980546110e781612488565b6110f4604051918261230f565b81815261110082612488565b916020937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401940136853760005b82811061118457505050906040519283926020840190602085525180915260408401929160005b82811061116757505050500390f35b835163ffffffff1685528695509381019392810192600101611158565b6001908260005263ffffffff817f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0154166111bf82876125ba565b5201611131565b34610144576111d43661237e565b916111dd612c53565b60ff600b54166104ac5760005b828110611269575060405191806040840160408552526060830191906000905b8082106112415785151560208601527fcab63bf31d1e656baa23cebef64e12033ea0ffbd44b1278c3747beec2d2f618c85850386a1005b90919283359063ffffffff82168092036101445760019181526020809101940192019061120a565b600190841561129b5761129363ffffffff61128d611288848888612af3565b612b03565b16612fd2565b505b016111ea565b6112b763ffffffff6112b1611288848888612af3565b16613169565b50611295565b346101445760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760ff600b54166104ac5761130260043533612eb0565b600181019081549163ffffffff8360a01c169260ff8160c01c16600281101561047d5715610453577fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff906113563386612c9e565b16905580547f17b2d730bb5e064df3fbc6165c8aceb3b0d62c524c196c0bc1012209280bc9a6604051602081528061044e3395600260208401910161265c565b34610144576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610144576004359060ff600b54166104ac576113de8233612eb0565b916113f6336000526008602052604060002054151590565b156115425782600493546000526006835260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690553360005260028352611448826040600020613383565b50600181019063ffffffff80835460a01c166000526003855261146f846040600020613383565b506005820161147e8154612609565b61150e575b508154925460a01c16917f76ee2dfcae10cb8522e62e713e62660e09ecfaab08db15d9404de19141322571604051868152806114c6339560028a8401910161265c565b0390a46000525261150c6005604060002060008155600060018201556114ee60028201612aaa565b6114fa60038201612aaa565b61150660048201612aaa565b01612aaa565b005b60405161152381610b2c8982019433866129c6565b5190206000526005855261153b846040600020613383565b5086611483565b60246040517f85982a00000000000000000000000000000000000000000000000000000000008152336004820152fd5b346101445760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760043567ffffffffffffffff8111610144576115c1903690600401612350565b6044359163ffffffff8316830361014457600260643510156101445760843567ffffffffffffffff8111610144576115fd903690600401612350565b91909260a43567ffffffffffffffff811161014457611620903690600401612350565b60c43567ffffffffffffffff811161014457611640903690600401612350565b96909560ff600b54166104ac57611657338a612c9e565b60408511611e7c5761166a888483612d48565b611675858733612b14565b80600052600460205273ffffffffffffffffffffffffffffffffffffffff60016040600020015416611e52576116ac602435612e08565b604051906116b9826122f2565b602435825233602083015263ffffffff8b1660408301526116df606435606084016125fd565b6116ea36888a6128c4565b60808301526116fa3684866128c4565b60a083015261170a3686886128c4565b60c083015261171a368b8b6128c4565b60e0830152806000526004602052604060002091805183556001830173ffffffffffffffffffffffffffffffffffffffff60208301511681549077ffffffff0000000000000000000000000000000000000000604085015160a01b16906060850151600281101561047d5778ff0000000000000000000000000000000000000000000000007fffffffffffffff000000000000000000000000000000000000000000000000009160c01b1693161717179055608081015180519067ffffffffffffffff8211610ae3576117fd826117f46002880154612609565b60028801612940565b602090601f8311600114611d865761184a929160009183611caf5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b60028401555b60a081015180519067ffffffffffffffff8211610ae357611881826118786003880154612609565b60038801612940565b602090601f8311600114611cba576118ce929160009183611caf5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b60038401555b60c081015180519067ffffffffffffffff8211610ae357611905826118fc6004880154612609565b60048801612940565b602090601f8311600114611be25791806119569260e09594600092611abd5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b60048501555b015180519267ffffffffffffffff8411610ae357838d9261198e8e966119856005860154612609565b60058601612940565b602090601f8311600114611ac8579463ffffffff6108ae95819a957fc4399022965bad9b2b468bbd8c758a7e80cdde36ff3088ddbb7f93bdfb5623cb9f9e9d9994611a1a8761044e9f9b98600593611a7e9f9a600092611abd5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9101555b336000526002602052611a358360406000206130dd565b50166000526003602052611a4d8160406000206130dd565b508d82611a94575b5050506108a06040519a8b9a611a6d8c606435612161565b60a060208d015260a08c0191612987565b9783890360808501521696339660243596612987565b611ab492611aa29133612b14565b600052600560205260406000206130dd565b508c8f8d611a55565b015190503880610959565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110611bb857506108ae9563ffffffff9a957fc4399022965bad9b2b468bbd8c758a7e80cdde36ff3088ddbb7f93bdfb5623cb9f9e9d999460018761044e9f9b96928f9693611a7e9f9a94837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06005971610611b81575b505050811b01910155611a1e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080611b73565b939550918194969750600160209291839285015181550194019201918f9492918f97969492611ad9565b906004860160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110611c975750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060e098971610611c60575b505050811b01600485015561195c565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558f8080611c50565b91926020600181928685015181550194019201611bf3565b015190508f80610959565b9190600386016000526020600020906000935b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084168510611d6b5760019450837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0811610611d34575b505050811b0160038401556118d4565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080611d24565b81810151835560209485019460019093019290910190611ccd565b9190600286016000526020600020906000935b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084168510611e375760019450837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0811610611e00575b505050811b016002840155611850565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080611df0565b81810151835560209485019460019093019290910190611d99565b60046040517fa0677dd0000000000000000000000000000000000000000000000000000000008152fd5b604485604051907f36a7c503000000000000000000000000000000000000000000000000000000008252600482015260406024820152fd5b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457611eeb612c53565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00600b541617600b557f2789711f6fd67d131ad68378617b5d1d21a2c92b34d7c3745d70b3957c08096c6020604051338152a1005b34610144576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760043567ffffffffffffffff811161014457611f92903690600401612350565b60ff600b54166104ac57611fa69133612b14565b90816000526005602052604060002091825491821561066e5760005b838110611fcb57005b80611fd860019287612fba565b90549060031b1c60005260048352604060002063ffffffff8382015460a01c16600052600a8452604060002054151580612062575b612019575b5001611fc2565b7f95d94f817db4971aa99ba35d0fe019bd8cc39866fbe02b6d47b5f0f3727fb673604051868152604086820152806120593394600260408401910161265c565b0390a286612012565b5061207a336000526008602052604060002054151590565b61200d565b346101445760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014457604051604081019080821067ffffffffffffffff831117610ae35761066a91604052601a81527f576f726b666c6f77526567697374727920312e302e302d646576000000000000602082015260405191829160208352602083019061216e565b346101445760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101445760043563ffffffff8116810361014457610ecb61066a9160443590602435906127cf565b90600282101561047d5752565b919082519283825260005b8481106121b85750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b602081830181015184830182015201612179565b61226d9160e061225c61224a6122386101008651865273ffffffffffffffffffffffffffffffffffffffff602088015116602087015263ffffffff604088015116604087015261222460608801516060880190612161565b60808701519080608088015286019061216e565b60a086015185820360a087015261216e565b60c085015184820360c086015261216e565b9201519060e081840391015261216e565b90565b6020808201906020835283518092526040830192602060408460051b8301019501936000915b8483106122a65750505050505090565b90919293949584806122e2837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187528a516121cc565b9801930193019194939290612296565b610100810190811067ffffffffffffffff821117610ae357604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ae357604052565b9181601f840112156101445782359167ffffffffffffffff8311610144576020838186019501011161014457565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126101445760043567ffffffffffffffff9283821161014457806023830112156101445781600401359384116101445760248460051b8301011161014457602401919060243580151581036101445790565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014457565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126101445760043573ffffffffffffffffffffffffffffffffffffffff8116810361014457916024359067ffffffffffffffff82116101445761248491600401612350565b9091565b67ffffffffffffffff8111610ae35760051b60200190565b604051906124ad826122f2565b606060e0836000815260006020820152600060408201526000838201528260808201528260a08201528260c08201520152565b6040516020810181811067ffffffffffffffff821117610ae3576040526000815290565b9061250e82612488565b61251b604051918261230f565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06125498294612488565b019060005b82811061255a57505050565b6020906125656124a0565b8282850101520161254e565b9190820180921161257e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190820391821161257e57565b80518210156125ce5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600282101561047d5752565b90600182811c92168015612652575b602083101461262357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612618565b80546000939261266b82612609565b918282526020936001916001811690816000146126d35750600114612692575b5050505050565b90939495506000929192528360002092846000945b8386106126bf5750505050010190388080808061268b565b8054858701830152940193859082016126a7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168685015250505090151560051b01019150388080808061268b565b90600560e06040936127cb855191612727836122f2565b6127c483978254855261277160ff600185015473ffffffffffffffffffffffffffffffffffffffff8116602089015263ffffffff8160a01c168489015260c01c16606087016125fd565b80516127848161078a816002880161265c565b6080860152805161279c8161078a816003880161265c565b60a086015280516127b48161078a816004880161265c565b60c086015251809681930161265c565b038461230f565b0152565b63ffffffff1691600083815260036020906003602052604093604084205490818710156128b4576128239181606489931180156128ac575b6128a4575b816128178285612571565b111561289457506125ad565b9461282d86612504565b96845b87811061284257505050505050505090565b60019082875284865261286188882061285b8387612571565b90612fba565b905490861b1c875260048652612878888820612710565b612882828c6125ba565b5261288d818b6125ba565b5001612830565b61289f915082612571565b6125ad565b50606461280c565b508015612807565b505050505050505061226d6124e0565b92919267ffffffffffffffff8211610ae3576040519161290c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461230f565b829481845281830111610144578281602093846000960137010152565b818110612934575050565b60008155600101612929565b9190601f811161294f57505050565b61297b926000526020600020906020601f840160051c8301931061297d575b601f0160051c0190612929565b565b909150819061296e565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b91907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009060601b168252601490600092815492612a0284612609565b92600194600181169081600014612a695750600114612a24575b505050505090565b9091929395945060005260209460206000206000905b858210612a565750505050601492935001013880808080612a1c565b8054858301850152908701908201612a3a565b92505050601494507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091935016838301528015150201013880808080612a1c565b612ab48154612609565b9081612abe575050565b81601f60009311600114612ad0575055565b908083918252612aef601f60208420940160051c840160018501612929565b5555565b91908110156125ce5760051b0190565b3563ffffffff811681036101445790565b91906034612b6991836040519485927fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602085019860601b16885284840137810160008382015203601481018452018261230f565b51902090565b73ffffffffffffffffffffffffffffffffffffffff169160008381526002926020906002602052604093604084205490818310156128b457612bc69181606485931180156128ac576128a457816128178285612571565b94612bd086612504565b96845b878110612be557505050505050505090565b600190828752838652612bfe88882061285b8388612571565b90549060031b1c875260048652612c16888820612710565b612c20828c6125ba565b52612c2b818b6125ba565b5001612bd3565b3573ffffffffffffffffffffffffffffffffffffffff811681036101445790565b73ffffffffffffffffffffffffffffffffffffffff600154163303612c7457565b60046040517f2b5c74de000000000000000000000000000000000000000000000000000000008152fd5b63ffffffff1680600052600a60205260406000205415612d17575073ffffffffffffffffffffffffffffffffffffffff1680600052600860205260406000205415612ce65750565b602490604051907f85982a000000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907f8fe6d7e10000000000000000000000000000000000000000000000000000000082526004820152fd5b9060c891828111612dd25750818111612d9d5750808211612d67575050565b60449250604051917ecd56a800000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b604491604051917ecd56a800000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b60449083604051917ecd56a800000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b8015612e865780600052600660205260ff60406000205416612e5c576000526006602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60046040517f4cb050e4000000000000000000000000000000000000000000000000000000008152fd5b60046040517f7dc2f4e1000000000000000000000000000000000000000000000000000000008152fd5b90600052600460205260406000209073ffffffffffffffffffffffffffffffffffffffff8060018401541691821561066e5716809103612eee575090565b602490604051907f31ee6dc70000000000000000000000000000000000000000000000000000000082526004820152fd5b9081518151908181149384612f36575b5050505090565b6020929394508201209201201438808080612f2f565b6009548110156125ce5760096000527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0190600090565b6007548110156125ce5760076000527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880190600090565b80548210156125ce5760005260206000200190600090565b6000818152600a6020526040812054613086576009546801000000000000000081101561305957908261304561301084600160409601600955612f4c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600954928152600a6020522055600190565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b905090565b60008181526008602052604081205461308657600754680100000000000000008110156130595790826130c961301084600160409601600755612f83565b905560075492815260086020522055600190565b9190600183016000908282528060205260408220541560001461316357845494680100000000000000008610156131365783613126613010886001604098999a01855584612fba565b9055549382526020522055600190565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50925050565b6000818152600a602052604081205490919080156132b7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081810181811161328a576009549083820191821161325d57818103613229575b50505060095480156131fc578101906131db82612f4c565b909182549160031b1b191690556009558152600a6020526040812055600190565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526031600452fd5b61324761323861301093612f4c565b90549060031b1c928392612f4c565b90558452600a60205260408420553880806131c3565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b505090565b60008181526008602052604081205490919080156132b7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081810181811161328a576007549083820191821161325d5781810361334f575b50505060075480156131fc5781019061332e82612f83565b909182549160031b1b19169055600755815260086020526040812055600190565b61336d61335e61301093612f83565b90549060031b1c928392612f83565b9055845260086020526040842055388080613316565b90600182019060009281845282602052604084205490811515600014612f2f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918281018181116134a85782549084820191821161347b57818103613446575b50505080548015613419578201916133fc8383612fba565b909182549160031b1b191690555582526020526040812055600190565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526031600452fd5b6134666134566130109386612fba565b90549060031b1c92839286612fba565b905586528460205260408620553880806133e4565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fdfea164736f6c6343000818000a",
}
var WorkflowRegistryABI = WorkflowRegistryMetaData.ABI
diff --git a/core/gethwrappers/workflow/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/workflow/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 7552f72d164..a908ff2e724 100644
--- a/core/gethwrappers/workflow/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/workflow/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -1,2 +1,2 @@
GETH_VERSION: 1.14.11
-workflow_registry_wrapper: ../../../contracts/solc/v0.8.24/WorkflowRegistry/WorkflowRegistry.abi ../../../contracts/solc/v0.8.24/WorkflowRegistry/WorkflowRegistry.bin 910925e0786fbe9efb686646ede620e7fc0536c74acdaeef49e96ac67580ea14
+workflow_registry_wrapper: ../../../contracts/solc/v0.8.24/WorkflowRegistry/WorkflowRegistry.abi ../../../contracts/solc/v0.8.24/WorkflowRegistry/WorkflowRegistry.bin bad48df0196c8a170a8e5486d0334183defd60e74bd89d3885989e00d6f13d23
diff --git a/core/internal/cltest/cltest.go b/core/internal/cltest/cltest.go
index 7ade85f4bf7..a55c57cc9a2 100644
--- a/core/internal/cltest/cltest.go
+++ b/core/internal/cltest/cltest.go
@@ -47,6 +47,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/loop"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
"github.com/smartcontractkit/chainlink/v2/common/client"
commonmocks "github.com/smartcontractkit/chainlink/v2/common/types/mocks"
@@ -531,7 +532,7 @@ func NewEthMocks(t testing.TB) *evmclimocks.Client {
}
func NewEthMocksWithStartupAssertions(t testing.TB) *evmclimocks.Client {
- testutils.SkipShort(t, "long test")
+ tests.SkipShort(t, "long test")
c := NewEthMocks(t)
chHead := make(<-chan *evmtypes.Head)
c.On("Dial", mock.Anything).Maybe().Return(nil)
@@ -554,7 +555,7 @@ func NewEthMocksWithStartupAssertions(t testing.TB) *evmclimocks.Client {
// NewEthMocksWithTransactionsOnBlocksAssertions sets an Eth mock with transactions on blocks
func NewEthMocksWithTransactionsOnBlocksAssertions(t testing.TB) *evmclimocks.Client {
- testutils.SkipShort(t, "long test")
+ tests.SkipShort(t, "long test")
c := NewEthMocks(t)
chHead := make(<-chan *evmtypes.Head)
c.On("Dial", mock.Anything).Maybe().Return(nil)
diff --git a/core/internal/features/features_test.go b/core/internal/features/features_test.go
index 2d0d046857c..88305403f2b 100644
--- a/core/internal/features/features_test.go
+++ b/core/internal/features/features_test.go
@@ -40,6 +40,7 @@ import (
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
"github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
"github.com/smartcontractkit/chainlink/v2/core/auth"
"github.com/smartcontractkit/chainlink/v2/core/bridges"
@@ -798,7 +799,7 @@ func setupForwarderEnabledNode(t *testing.T, owner *bind.TransactOpts, portV2 in
func TestIntegration_OCR(t *testing.T) {
t.Skip("fails after geth upgrade https://github.com/smartcontractkit/chainlink/pull/11809; passes local but fails CI")
- testutils.SkipShort(t, "long test")
+ tests.SkipShort(t, "long test")
t.Parallel()
tests := []struct {
id int
@@ -1031,7 +1032,7 @@ observationSource = """
func TestIntegration_OCR_ForwarderFlow(t *testing.T) {
t.Skip("fails after geth upgrade https://github.com/smartcontractkit/chainlink/pull/11809")
- testutils.SkipShort(t, "long test")
+ tests.SkipShort(t, "long test")
t.Parallel()
numOracles := 4
t.Run("ocr_forwarder_flow", func(t *testing.T) {
diff --git a/core/internal/features/ocr2/features_ocr2_helper.go b/core/internal/features/ocr2/features_ocr2_helper.go
new file mode 100644
index 00000000000..9287d0df5b1
--- /dev/null
+++ b/core/internal/features/ocr2/features_ocr2_helper.go
@@ -0,0 +1,705 @@
+package ocr2
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "io"
+ "maps"
+ "math/big"
+ "net/http"
+ "net/http/httptest"
+ "net/url"
+ "strconv"
+ "strings"
+ "sync"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/eth/ethconfig"
+ "github.com/ethereum/go-ethereum/ethclient/simulated"
+ "github.com/hashicorp/consul/sdk/freeport"
+ "github.com/onsi/gomega"
+ testoffchainaggregator2 "github.com/smartcontractkit/libocr/gethwrappers2/testocr2aggregator"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/libocr/commontypes"
+ "github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
+
+ confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
+ ocrtypes2 "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+
+ commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/testhelpers"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocrbootstrap"
+
+ "github.com/smartcontractkit/chainlink/v2/core/bridges"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders"
+ ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/authorized_forwarder"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/validate"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
+ "github.com/smartcontractkit/chainlink/v2/core/store/models"
+ "github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight"
+)
+
+type Node struct {
+ App *cltest.TestApplication
+ PeerID string
+ Transmitter common.Address
+ EffectiveTransmitter common.Address
+ KeyBundle ocr2key.KeyBundle
+}
+
+func SetupOCR2Contracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, common.Address, *ocr2aggregator.OCR2Aggregator) {
+ owner := testutils.MustNewSimTransactor(t)
+ sb := new(big.Int)
+ sb, _ = sb.SetString("100000000000000000000", 10) // 1 eth
+ genesisData := types.GenesisAlloc{owner.From: {Balance: sb}}
+ gasLimit := ethconfig.Defaults.Miner.GasCeil * 2
+ b := simulated.NewBackend(genesisData, simulated.WithBlockGasLimit(gasLimit))
+ linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(owner, b.Client())
+ require.NoError(t, err)
+ b.Commit()
+ accessAddress, _, _, err := testoffchainaggregator2.DeploySimpleWriteAccessController(owner, b.Client())
+ require.NoError(t, err, "failed to deploy test access controller contract")
+ b.Commit()
+
+ minAnswer, maxAnswer := new(big.Int), new(big.Int)
+ minAnswer.Exp(big.NewInt(-2), big.NewInt(191), nil)
+ maxAnswer.Exp(big.NewInt(2), big.NewInt(191), nil)
+ maxAnswer.Sub(maxAnswer, big.NewInt(1))
+ ocrContractAddress, _, ocrContract, err := ocr2aggregator.DeployOCR2Aggregator(
+ owner,
+ b.Client(),
+ linkTokenAddress, // _link common.Address,
+ minAnswer, // -2**191
+ maxAnswer, // 2**191 - 1
+ accessAddress,
+ accessAddress,
+ 9,
+ "TEST",
+ )
+ // Ensure we have finality depth worth of blocks to start.
+ for i := 0; i < 20; i++ {
+ b.Commit()
+ }
+ require.NoError(t, err)
+ _, err = linkContract.Transfer(owner, ocrContractAddress, big.NewInt(1000))
+ require.NoError(t, err)
+ b.Commit()
+ return owner, b, ocrContractAddress, ocrContract
+}
+
+func SetupNodeOCR2(
+ t *testing.T,
+ owner *bind.TransactOpts,
+ port int,
+ useForwarder bool,
+ b *simulated.Backend,
+ p2pV2Bootstrappers []commontypes.BootstrapperLocator,
+) *Node {
+ ctx := testutils.Context(t)
+ p2pKey := p2pkey.MustNewV2XXXTestingOnly(big.NewInt(int64(port)))
+ config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.Insecure.OCRDevelopmentMode = ptr(true) // Disables ocr spec validation so we can have fast polling for the test.
+
+ c.Feature.LogPoller = ptr(true)
+
+ c.OCR.Enabled = ptr(false)
+ c.OCR2.Enabled = ptr(true)
+
+ c.P2P.PeerID = ptr(p2pKey.PeerID())
+ c.P2P.V2.Enabled = ptr(true)
+ c.P2P.V2.DeltaDial = commonconfig.MustNewDuration(500 * time.Millisecond)
+ c.P2P.V2.DeltaReconcile = commonconfig.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
+ }
+
+ c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(5 * time.Second)
+ c.EVM[0].Transactions.ForwardersEnabled = &useForwarder
+ })
+
+ app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, b, p2pKey)
+
+ sendingKeys, err := app.KeyStore.Eth().EnabledKeysForChain(testutils.Context(t), testutils.SimulatedChainID)
+ require.NoError(t, err)
+ require.Len(t, sendingKeys, 1)
+ transmitter := sendingKeys[0].Address
+ effectiveTransmitter := sendingKeys[0].Address
+
+ // Fund the transmitter address with some ETH
+ n, err := b.Client().NonceAt(testutils.Context(t), owner.From, nil)
+ require.NoError(t, err)
+
+ tx := cltest.NewLegacyTransaction(
+ n, transmitter,
+ assets.Ether(1).ToInt(),
+ 21000,
+ assets.GWei(1).ToInt(),
+ nil)
+ signedTx, err := owner.Signer(owner.From, tx)
+ require.NoError(t, err)
+ err = b.Client().SendTransaction(testutils.Context(t), signedTx)
+ require.NoError(t, err)
+ b.Commit()
+
+ kb, err := app.GetKeyStore().OCR2().Create(ctx, "evm")
+ require.NoError(t, err)
+
+ if useForwarder {
+ // deploy a forwarder
+ faddr, _, authorizedForwarder, err2 := authorized_forwarder.DeployAuthorizedForwarder(owner, b.Client(), common.HexToAddress("0x326C977E6efc84E512bB9C30f76E30c160eD06FB"), owner.From, common.Address{}, []byte{})
+ require.NoError(t, err2)
+ b.Commit()
+
+ // set EOA as an authorized sender for the forwarder
+ _, err2 = authorizedForwarder.SetAuthorizedSenders(owner, []common.Address{transmitter})
+ require.NoError(t, err2)
+ b.Commit()
+
+ // add forwarder address to be tracked in db
+ forwarderORM := forwarders.NewORM(app.GetDB())
+ chainID, err := b.Client().ChainID(testutils.Context(t))
+ require.NoError(t, err)
+ _, err2 = forwarderORM.CreateForwarder(testutils.Context(t), faddr, ubig.Big(*chainID))
+ require.NoError(t, err2)
+
+ effectiveTransmitter = faddr
+ }
+ return &Node{
+ App: app,
+ PeerID: p2pKey.PeerID().Raw(),
+ Transmitter: transmitter,
+ EffectiveTransmitter: effectiveTransmitter,
+ KeyBundle: kb,
+ }
+}
+
+func RunTestIntegrationOCR2(t *testing.T) {
+ for _, test := range []struct {
+ name string
+ chainReaderAndCodec bool
+ }{
+ {"legacy", false},
+ {"chain-reader", true},
+ } {
+ test := test
+ t.Run(test.name, func(t *testing.T) {
+ owner, b, ocrContractAddress, ocrContract := SetupOCR2Contracts(t)
+
+ lggr := logger.TestLogger(t)
+ bootstrapNodePort := freeport.GetOne(t)
+ bootstrapNode := SetupNodeOCR2(t, owner, bootstrapNodePort, false /* useForwarders */, b, nil)
+
+ var (
+ oracles []confighelper2.OracleIdentityExtra
+ transmitters []common.Address
+ kbs []ocr2key.KeyBundle
+ apps []*cltest.TestApplication
+ )
+ ports := freeport.GetN(t, 4)
+ for i := 0; i < 4; i++ {
+ node := SetupNodeOCR2(t, owner, ports[i], false /* useForwarders */, b, []commontypes.BootstrapperLocator{
+ // Supply the bootstrap IP and port as a V2 peer address
+ {PeerID: bootstrapNode.PeerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePort)}},
+ })
+
+ kbs = append(kbs, node.KeyBundle)
+ apps = append(apps, node.App)
+ transmitters = append(transmitters, node.Transmitter)
+
+ oracles = append(oracles, confighelper2.OracleIdentityExtra{
+ OracleIdentity: confighelper2.OracleIdentity{
+ OnchainPublicKey: node.KeyBundle.PublicKey(),
+ TransmitAccount: ocrtypes2.Account(node.Transmitter.String()),
+ OffchainPublicKey: node.KeyBundle.OffchainPublicKey(),
+ PeerID: node.PeerID,
+ },
+ ConfigEncryptionPublicKey: node.KeyBundle.ConfigEncryptionPublicKey(),
+ })
+ }
+
+ blockBeforeConfig := InitOCR2(t, lggr, b, ocrContract, owner, bootstrapNode, oracles, transmitters, transmitters, func(blockNum int64) string {
+ return fmt.Sprintf(`
+type = "bootstrap"
+name = "bootstrap"
+relay = "evm"
+schemaVersion = 1
+contractID = "%s"
+[relayConfig]
+chainID = 1337
+fromBlock = %d
+`, ocrContractAddress, blockNum)
+ })
+
+ tick := time.NewTicker(1 * time.Second)
+ defer tick.Stop()
+ go func() {
+ for range tick.C {
+ b.Commit()
+ }
+ }()
+
+ var jids []int32
+ var servers, slowServers = make([]*httptest.Server, 4), make([]*httptest.Server, 4)
+ // We expect metadata of:
+ // latestAnswer:nil // First call
+ // latestAnswer:0
+ // latestAnswer:10
+ // latestAnswer:20
+ // latestAnswer:30
+ var metaLock sync.Mutex
+ expectedMeta := map[string]struct{}{
+ "0": {}, "10": {}, "20": {}, "30": {},
+ }
+ returnData := int(10)
+ for i := 0; i < 4; i++ {
+ s := i
+ require.NoError(t, apps[i].Start(testutils.Context(t)))
+
+ // API speed is > observation timeout set in ContractSetConfigArgsForIntegrationTest
+ slowServers[i] = httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
+ time.Sleep(5 * time.Second)
+ var result string
+ metaLock.Lock()
+ result = fmt.Sprintf(`{"data":%d}`, returnData)
+ metaLock.Unlock()
+ res.WriteHeader(http.StatusOK)
+ t.Logf("Slow Bridge %d returning data:10", s)
+ _, err := res.Write([]byte(result))
+ assert.NoError(t, err)
+ }))
+ t.Cleanup(slowServers[s].Close)
+ servers[i] = httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
+ b, err := io.ReadAll(req.Body)
+ if !assert.NoError(t, err) {
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ var m bridges.BridgeMetaDataJSON
+ if !assert.NoError(t, json.Unmarshal(b, &m)) {
+ res.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ var result string
+ metaLock.Lock()
+ result = fmt.Sprintf(`{"data":%d}`, returnData)
+ metaLock.Unlock()
+ if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil {
+ t.Logf("Bridge %d deleting %s, from request body: %s", s, m.Meta.LatestAnswer, b)
+ metaLock.Lock()
+ delete(expectedMeta, m.Meta.LatestAnswer.String())
+ metaLock.Unlock()
+ }
+ res.WriteHeader(http.StatusOK)
+ _, err = res.Write([]byte(result))
+ assert.NoError(t, err)
+ }))
+ t.Cleanup(servers[s].Close)
+ u, _ := url.Parse(servers[i].URL)
+ bridgeName := fmt.Sprintf("bridge%d", i)
+ require.NoError(t, apps[i].BridgeORM().CreateBridgeType(testutils.Context(t), &bridges.BridgeType{
+ Name: bridges.BridgeName(bridgeName),
+ URL: models.WebURL(*u),
+ }))
+
+ var chainReaderSpec string
+ if test.chainReaderAndCodec {
+ chainReaderSpec = `
+[relayConfig.chainReader.contracts.median]
+contractPollingFilter.genericEventNames = ["LatestRoundRequested"]
+
+contractABI = '''
+[
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "requester",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "configDigest",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "epoch",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "round",
+ "type": "uint8"
+ }
+ ],
+ "name": "RoundRequested",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "latestTransmissionDetails",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "configDigest",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint32",
+ "name": "epoch",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint8",
+ "name": "round",
+ "type": "uint8"
+ },
+ {
+ "internalType": "int192",
+ "name": "latestAnswer_",
+ "type": "int192"
+ },
+ {
+ "internalType": "uint64",
+ "name": "latestTimestamp_",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+]
+'''
+
+[relayConfig.chainReader.contracts.median.configs]
+LatestRoundRequested = '''
+{
+ "chainSpecificName": "RoundRequested",
+ "readType": "event"
+}
+'''
+LatestTransmissionDetails = '''
+{
+ "chainSpecificName": "latestTransmissionDetails",
+ "outputModifications": [
+ {
+ "Fields": [
+ "LatestTimestamp_"
+ ],
+ "type": "epoch to time"
+ },
+ {
+ "Fields": {
+ "LatestAnswer_": "LatestAnswer",
+ "LatestTimestamp_": "LatestTimestamp"
+ },
+ "type": "rename"
+ }
+ ]
+}
+'''
+
+[relayConfig.codec.configs.MedianReport]
+typeABI = '''
+[
+ {
+ "Name": "Timestamp",
+ "Type": "uint32"
+ },
+ {
+ "Name": "Observers",
+ "Type": "bytes32"
+ },
+ {
+ "Name": "Observations",
+ "Type": "int192[]"
+ },
+ {
+ "Name": "JuelsPerFeeCoin",
+ "Type": "int192"
+ }
+]
+'''
+`
+ }
+ ocrJob, err := validate.ValidatedOracleSpecToml(testutils.Context(t), apps[i].Config.OCR2(), apps[i].Config.Insecure(), fmt.Sprintf(`
+type = "offchainreporting2"
+relay = "evm"
+schemaVersion = 1
+pluginType = "median"
+name = "web oracle spec"
+contractID = "%s"
+ocrKeyBundleID = "%s"
+transmitterID = "%s"
+contractConfigConfirmations = 1
+contractConfigTrackerPollInterval = "1s"
+observationSource = """
+ // data source 1
+ ds1 [type=bridge name="%s"];
+ ds1_parse [type=jsonparse path="data"];
+ ds1_multiply [type=multiply times=%d];
+
+ // data source 2
+ ds2 [type=http method=GET url="%s"];
+ ds2_parse [type=jsonparse path="data"];
+ ds2_multiply [type=multiply times=%d];
+
+ ds1 -> ds1_parse -> ds1_multiply -> answer1;
+ ds2 -> ds2_parse -> ds2_multiply -> answer1;
+
+ answer1 [type=median index=0];
+"""
+
+[relayConfig]
+chainID = 1337
+fromBlock = %d
+%s
+
+[pluginConfig]
+juelsPerFeeCoinSource = """
+ // data source 1
+ ds1 [type=bridge name="%s"];
+ ds1_parse [type=jsonparse path="data"];
+ ds1_multiply [type=multiply times=%d];
+
+ // data source 2
+ ds2 [type=http method=GET url="%s"];
+ ds2_parse [type=jsonparse path="data"];
+ ds2_multiply [type=multiply times=%d];
+
+ ds1 -> ds1_parse -> ds1_multiply -> answer1;
+ ds2 -> ds2_parse -> ds2_multiply -> answer1;
+
+ answer1 [type=median index=0];
+"""
+gasPriceSubunitsSource = """
+ // data source
+ dsp [type=bridge name="%s"];
+ dsp_parse [type=jsonparse path="data"];
+ dsp -> dsp_parse;
+"""
+[pluginConfig.juelsPerFeeCoinCache]
+updateInterval = "1m"
+`, ocrContractAddress, kbs[i].ID(), transmitters[i], bridgeName, i, slowServers[i].URL, i, blockBeforeConfig.Number().Int64(), chainReaderSpec, bridgeName, i, slowServers[i].URL, i, bridgeName), nil)
+ require.NoError(t, err)
+ err = apps[i].AddJobV2(testutils.Context(t), &ocrJob)
+ require.NoError(t, err)
+ jids = append(jids, ocrJob.ID)
+ }
+
+ // Watch for OCR2AggregatorTransmitted events
+ start := uint64(0)
+ txEvents := make(chan *ocr2aggregator.OCR2AggregatorTransmitted)
+ _, err := ocrContract.WatchTransmitted(&bind.WatchOpts{Start: &start, Context: testutils.Context(t)}, txEvents)
+ require.NoError(t, err)
+ newTxEvents := make(chan *ocr2aggregator.OCR2AggregatorNewTransmission)
+ _, err = ocrContract.WatchNewTransmission(&bind.WatchOpts{Start: &start, Context: testutils.Context(t)}, newTxEvents, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
+ require.NoError(t, err)
+
+ go func() {
+ var newTxEvent *ocr2aggregator.OCR2AggregatorNewTransmission
+ select {
+ case txEvent := <-txEvents:
+ t.Logf("txEvent: %v", txEvent)
+ if newTxEvent != nil {
+ assert.Equal(t, uint64(txEvent.Epoch), newTxEvent.EpochAndRound.Uint64())
+ }
+ case newTxEvent = <-newTxEvents:
+ t.Logf("newTxEvent: %v", newTxEvent)
+ }
+ }()
+
+ ctx := testutils.Context(t)
+ for trial := 0; trial < 2; trial++ {
+ var retVal int
+
+ metaLock.Lock()
+ returnData = 10 * (trial + 1)
+ retVal = returnData
+ for i := 0; i < 4; i++ {
+ expectedMeta[strconv.Itoa(returnData*i)] = struct{}{}
+ }
+ metaLock.Unlock()
+
+ // Assert that all the OCR jobs get a run with valid values eventually.
+ var wg sync.WaitGroup
+ for i := 0; i < 4; i++ {
+ ic := i
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ completedRuns, err2 := apps[ic].JobORM().FindPipelineRunIDsByJobID(ctx, jids[ic], 0, 1000)
+ if !assert.NoError(t, err2) {
+ return
+ }
+ // Want at least 2 runs so we see all the metadata.
+ pr := cltest.WaitForPipelineComplete(t, ic, jids[ic], len(completedRuns)+2, 7, apps[ic].JobORM(), 2*time.Minute, 5*time.Second)
+ jb, err2 := pr[0].Outputs.MarshalJSON()
+ if !assert.NoError(t, err2) {
+ return
+ }
+ assert.Equal(t, []byte(fmt.Sprintf("[\"%d\"]", retVal*ic)), jb, "pr[0] %+v pr[1] %+v", pr[0], pr[1])
+ }()
+ }
+ wg.Wait()
+
+ // Trail #1: 4 oracles reporting 0, 10, 20, 30. Answer should be 20 (results[4/2]).
+ // Trial #2: 4 oracles reporting 0, 20, 40, 60. Answer should be 40 (results[4/2]).
+ gomega.NewGomegaWithT(t).Eventually(func() string {
+ answer, err2 := ocrContract.LatestAnswer(nil)
+ require.NoError(t, err2)
+ return answer.String()
+ }, 1*time.Minute, 200*time.Millisecond).Should(gomega.Equal(strconv.Itoa(2 * retVal)))
+
+ for _, app := range apps {
+ jobs, _, err2 := app.JobORM().FindJobs(ctx, 0, 1000)
+ require.NoError(t, err2)
+ // No spec errors
+ for _, j := range jobs {
+ ignore := 0
+ for i := range j.JobSpecErrors {
+ // Non-fatal timing related error, ignore for testing.
+ if strings.Contains(j.JobSpecErrors[i].Description, "leader's phase conflicts tGrace timeout") {
+ ignore++
+ }
+ }
+ require.Len(t, j.JobSpecErrors, ignore)
+ }
+ }
+ em := map[string]struct{}{}
+ metaLock.Lock()
+ maps.Copy(em, expectedMeta)
+ metaLock.Unlock()
+ assert.Empty(t, em, "expected metadata %v", em)
+
+ t.Logf("======= Summary =======")
+ roundID, err2 := ocrContract.LatestRound(nil)
+ require.NoError(t, err2)
+ for i := 0; i <= int(roundID.Int64()); i++ {
+ roundData, err3 := ocrContract.GetRoundData(nil, big.NewInt(int64(i)))
+ require.NoError(t, err3)
+ t.Logf("RoundId: %d, AnsweredInRound: %d, Answer: %d, StartedAt: %v, UpdatedAt: %v", roundData.RoundId, roundData.AnsweredInRound, roundData.Answer, roundData.StartedAt, roundData.UpdatedAt)
+ }
+
+ expectedAnswer := big.NewInt(2 * int64(retVal))
+
+ // Assert we can read the latest config digest and epoch after a report has been submitted.
+ contractABI, err2 := abi.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorABI))
+ require.NoError(t, err2)
+ apps[0].GetRelayers().LegacyEVMChains().Slice()
+ ct, err2 := evm.NewOCRContractTransmitter(testutils.Context(t), ocrContractAddress, apps[0].GetRelayers().LegacyEVMChains().Slice()[0].Client(), contractABI, nil, apps[0].GetRelayers().LegacyEVMChains().Slice()[0].LogPoller(), lggr)
+ require.NoError(t, err2)
+ configDigest, epoch, err2 := ct.LatestConfigDigestAndEpoch(testutils.Context(t))
+ require.NoError(t, err2)
+ details, err2 := ocrContract.LatestConfigDetails(nil)
+ require.NoError(t, err2)
+ assert.True(t, bytes.Equal(configDigest[:], details.ConfigDigest[:]))
+ digestAndEpoch, err2 := ocrContract.LatestConfigDigestAndEpoch(nil)
+ require.NoError(t, err2)
+ assert.Equal(t, digestAndEpoch.Epoch, epoch)
+ latestTransmissionDetails, err2 := ocrContract.LatestTransmissionDetails(nil)
+ require.NoError(t, err2)
+ assert.Equal(t, expectedAnswer, latestTransmissionDetails.LatestAnswer)
+ require.NoError(t, err2)
+ newTransmissionEvents, err2 := ocrContract.FilterTransmitted(&bind.FilterOpts{Start: 0, End: nil})
+ require.NoError(t, err2)
+ for newTransmissionEvents.Next() {
+ assert.Equal(t, 3, newTransmissionEvents.Event.Epoch)
+ }
+ }
+ })
+ }
+}
+
+func InitOCR2(t *testing.T, lggr logger.Logger, b *simulated.Backend,
+ ocrContract *ocr2aggregator.OCR2Aggregator,
+ owner *bind.TransactOpts,
+ bootstrapNode *Node,
+ oracles []confighelper2.OracleIdentityExtra,
+ transmitters []common.Address,
+ payees []common.Address,
+ specFn func(int64) string,
+) (
+ blockBeforeConfig *types.Block,
+) {
+ lggr.Debugw("Setting Payees on OraclePlugin Contract", "transmitters", payees)
+ _, err := ocrContract.SetPayees(
+ owner,
+ transmitters,
+ payees,
+ )
+ require.NoError(t, err)
+ b.Commit()
+ blockBeforeConfig, err = b.Client().BlockByNumber(testutils.Context(t), nil)
+ require.NoError(t, err)
+ signers, effectiveTransmitters, threshold, _, encodedConfigVersion, encodedConfig, err := confighelper2.ContractSetConfigArgsForEthereumIntegrationTest(
+ oracles,
+ 1,
+ 1000000000/100, // threshold PPB
+ )
+ require.NoError(t, err)
+
+ minAnswer, maxAnswer := new(big.Int), new(big.Int)
+ minAnswer.Exp(big.NewInt(-2), big.NewInt(191), nil)
+ maxAnswer.Exp(big.NewInt(2), big.NewInt(191), nil)
+ maxAnswer.Sub(maxAnswer, big.NewInt(1))
+
+ onchainConfig, err := testhelpers.GenerateDefaultOCR2OnchainConfig(minAnswer, maxAnswer)
+ require.NoError(t, err)
+
+ lggr.Debugw("Setting Config on Oracle Contract",
+ "signers", signers,
+ "transmitters", transmitters,
+ "effectiveTransmitters", effectiveTransmitters,
+ "threshold", threshold,
+ "onchainConfig", onchainConfig,
+ "encodedConfigVersion", encodedConfigVersion,
+ )
+ _, err = ocrContract.SetConfig(
+ owner,
+ signers,
+ effectiveTransmitters,
+ threshold,
+ onchainConfig,
+ encodedConfigVersion,
+ encodedConfig,
+ )
+ require.NoError(t, err)
+ b.Commit()
+
+ err = bootstrapNode.App.Start(testutils.Context(t))
+ require.NoError(t, err)
+
+ chainSet := bootstrapNode.App.GetRelayers().LegacyEVMChains()
+ require.NotNil(t, chainSet)
+ ocrJob, err := ocrbootstrap.ValidatedBootstrapSpecToml(specFn(blockBeforeConfig.Number().Int64()))
+ require.NoError(t, err)
+ err = bootstrapNode.App.AddJobV2(testutils.Context(t), &ocrJob)
+ require.NoError(t, err)
+ return
+}
+
+func ptr[T any](v T) *T { return &v }
diff --git a/core/internal/features/ocr2/features_ocr2_plugin_test.go b/core/internal/features/ocr2/features_ocr2_plugin_test.go
deleted file mode 100644
index 96a9f32e957..00000000000
--- a/core/internal/features/ocr2/features_ocr2_plugin_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-//go:build integration
-
-package ocr2_test
-
-import (
- "testing"
-
- "github.com/smartcontractkit/chainlink/v2/core/config/env"
-)
-
-func TestIntegration_OCR2_plugins(t *testing.T) {
- t.Setenv(string(env.MedianPlugin.Cmd), "chainlink-feeds")
- testIntegration_OCR2(t)
-}
diff --git a/core/internal/features/ocr2/features_ocr2_test.go b/core/internal/features/ocr2/features_ocr2_test.go
index c8f49ac9328..01c269d19e3 100644
--- a/core/internal/features/ocr2/features_ocr2_test.go
+++ b/core/internal/features/ocr2/features_ocr2_test.go
@@ -1,4 +1,4 @@
-package ocr2_test
+package ocr2
import (
"bytes"
@@ -6,7 +6,6 @@ import (
"fmt"
"io"
"maps"
- "math/big"
"net/http"
"net/http/httptest"
"net/url"
@@ -16,11 +15,7 @@ import (
"time"
"github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/eth/ethconfig"
- "github.com/ethereum/go-ethereum/ethclient/simulated"
"github.com/hashicorp/consul/sdk/freeport"
"github.com/onsi/gomega"
"github.com/stretchr/testify/assert"
@@ -29,681 +24,31 @@ import (
"github.com/smartcontractkit/libocr/commontypes"
"github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
- testoffchainaggregator2 "github.com/smartcontractkit/libocr/gethwrappers2/testocr2aggregator"
confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
ocrtypes2 "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
- commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
-
"github.com/smartcontractkit/chainlink/v2/core/bridges"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders"
- ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/authorized_forwarder"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface"
"github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
- "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/testhelpers"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/validate"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocrbootstrap"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
"github.com/smartcontractkit/chainlink/v2/core/store/models"
- "github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight"
)
-type ocr2Node struct {
- app *cltest.TestApplication
- peerID string
- transmitter common.Address
- effectiveTransmitter common.Address
- keybundle ocr2key.KeyBundle
-}
-
-func setupOCR2Contracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, common.Address, *ocr2aggregator.OCR2Aggregator) {
- owner := testutils.MustNewSimTransactor(t)
- sb := new(big.Int)
- sb, _ = sb.SetString("100000000000000000000", 10) // 1 eth
- genesisData := types.GenesisAlloc{owner.From: {Balance: sb}}
- gasLimit := ethconfig.Defaults.Miner.GasCeil * 2
- b := simulated.NewBackend(genesisData, simulated.WithBlockGasLimit(gasLimit))
- linkTokenAddress, _, linkContract, err := link_token_interface.DeployLinkToken(owner, b.Client())
- require.NoError(t, err)
- b.Commit()
- accessAddress, _, _, err := testoffchainaggregator2.DeploySimpleWriteAccessController(owner, b.Client())
- require.NoError(t, err, "failed to deploy test access controller contract")
- b.Commit()
-
- minAnswer, maxAnswer := new(big.Int), new(big.Int)
- minAnswer.Exp(big.NewInt(-2), big.NewInt(191), nil)
- maxAnswer.Exp(big.NewInt(2), big.NewInt(191), nil)
- maxAnswer.Sub(maxAnswer, big.NewInt(1))
- ocrContractAddress, _, ocrContract, err := ocr2aggregator.DeployOCR2Aggregator(
- owner,
- b.Client(),
- linkTokenAddress, // _link common.Address,
- minAnswer, // -2**191
- maxAnswer, // 2**191 - 1
- accessAddress,
- accessAddress,
- 9,
- "TEST",
- )
- // Ensure we have finality depth worth of blocks to start.
- for i := 0; i < 20; i++ {
- b.Commit()
- }
- require.NoError(t, err)
- _, err = linkContract.Transfer(owner, ocrContractAddress, big.NewInt(1000))
- require.NoError(t, err)
- b.Commit()
- return owner, b, ocrContractAddress, ocrContract
-}
-
-func setupNodeOCR2(
- t *testing.T,
- owner *bind.TransactOpts,
- port int,
- useForwarder bool,
- b *simulated.Backend,
- p2pV2Bootstrappers []commontypes.BootstrapperLocator,
-) *ocr2Node {
- ctx := testutils.Context(t)
- p2pKey := p2pkey.MustNewV2XXXTestingOnly(big.NewInt(int64(port)))
- config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Insecure.OCRDevelopmentMode = ptr(true) // Disables ocr spec validation so we can have fast polling for the test.
-
- c.Feature.LogPoller = ptr(true)
-
- c.OCR.Enabled = ptr(false)
- c.OCR2.Enabled = ptr(true)
-
- c.P2P.PeerID = ptr(p2pKey.PeerID())
- c.P2P.V2.Enabled = ptr(true)
- c.P2P.V2.DeltaDial = commonconfig.MustNewDuration(500 * time.Millisecond)
- c.P2P.V2.DeltaReconcile = commonconfig.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
- }
-
- c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(5 * time.Second)
- c.EVM[0].Transactions.ForwardersEnabled = &useForwarder
- })
-
- app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, b, p2pKey)
-
- sendingKeys, err := app.KeyStore.Eth().EnabledKeysForChain(testutils.Context(t), testutils.SimulatedChainID)
- require.NoError(t, err)
- require.Len(t, sendingKeys, 1)
- transmitter := sendingKeys[0].Address
- effectiveTransmitter := sendingKeys[0].Address
-
- // Fund the transmitter address with some ETH
- n, err := b.Client().NonceAt(testutils.Context(t), owner.From, nil)
- require.NoError(t, err)
-
- tx := cltest.NewLegacyTransaction(
- n, transmitter,
- assets.Ether(1).ToInt(),
- 21000,
- assets.GWei(1).ToInt(),
- nil)
- signedTx, err := owner.Signer(owner.From, tx)
- require.NoError(t, err)
- err = b.Client().SendTransaction(testutils.Context(t), signedTx)
- require.NoError(t, err)
- b.Commit()
-
- kb, err := app.GetKeyStore().OCR2().Create(ctx, "evm")
- require.NoError(t, err)
-
- if useForwarder {
- // deploy a forwarder
- faddr, _, authorizedForwarder, err2 := authorized_forwarder.DeployAuthorizedForwarder(owner, b.Client(), common.HexToAddress("0x326C977E6efc84E512bB9C30f76E30c160eD06FB"), owner.From, common.Address{}, []byte{})
- require.NoError(t, err2)
- b.Commit()
-
- // set EOA as an authorized sender for the forwarder
- _, err2 = authorizedForwarder.SetAuthorizedSenders(owner, []common.Address{transmitter})
- require.NoError(t, err2)
- b.Commit()
-
- // add forwarder address to be tracked in db
- forwarderORM := forwarders.NewORM(app.GetDB())
- chainID, err := b.Client().ChainID(testutils.Context(t))
- require.NoError(t, err)
- _, err2 = forwarderORM.CreateForwarder(testutils.Context(t), faddr, ubig.Big(*chainID))
- require.NoError(t, err2)
-
- effectiveTransmitter = faddr
- }
- return &ocr2Node{
- app: app,
- peerID: p2pKey.PeerID().Raw(),
- transmitter: transmitter,
- effectiveTransmitter: effectiveTransmitter,
- keybundle: kb,
- }
-}
-
func TestIntegration_OCR2(t *testing.T) {
t.Parallel()
- testIntegration_OCR2(t)
-}
-
-func testIntegration_OCR2(t *testing.T) {
- for _, test := range []struct {
- name string
- chainReaderAndCodec bool
- }{
- {"legacy", false},
- {"chain-reader", true},
- } {
- test := test
- t.Run(test.name, func(t *testing.T) {
- owner, b, ocrContractAddress, ocrContract := setupOCR2Contracts(t)
-
- lggr := logger.TestLogger(t)
- bootstrapNodePort := freeport.GetOne(t)
- bootstrapNode := setupNodeOCR2(t, owner, bootstrapNodePort, false /* useForwarders */, b, nil)
-
- var (
- oracles []confighelper2.OracleIdentityExtra
- transmitters []common.Address
- kbs []ocr2key.KeyBundle
- apps []*cltest.TestApplication
- )
- ports := freeport.GetN(t, 4)
- for i := 0; i < 4; i++ {
- node := setupNodeOCR2(t, owner, ports[i], false /* useForwarders */, b, []commontypes.BootstrapperLocator{
- // Supply the bootstrap IP and port as a V2 peer address
- {PeerID: bootstrapNode.peerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePort)}},
- })
-
- kbs = append(kbs, node.keybundle)
- apps = append(apps, node.app)
- transmitters = append(transmitters, node.transmitter)
-
- oracles = append(oracles, confighelper2.OracleIdentityExtra{
- OracleIdentity: confighelper2.OracleIdentity{
- OnchainPublicKey: node.keybundle.PublicKey(),
- TransmitAccount: ocrtypes2.Account(node.transmitter.String()),
- OffchainPublicKey: node.keybundle.OffchainPublicKey(),
- PeerID: node.peerID,
- },
- ConfigEncryptionPublicKey: node.keybundle.ConfigEncryptionPublicKey(),
- })
- }
-
- blockBeforeConfig := initOCR2(t, lggr, b, ocrContract, owner, bootstrapNode, oracles, transmitters, transmitters, func(blockNum int64) string {
- return fmt.Sprintf(`
-type = "bootstrap"
-name = "bootstrap"
-relay = "evm"
-schemaVersion = 1
-contractID = "%s"
-[relayConfig]
-chainID = 1337
-fromBlock = %d
-`, ocrContractAddress, blockNum)
- })
-
- tick := time.NewTicker(1 * time.Second)
- defer tick.Stop()
- go func() {
- for range tick.C {
- b.Commit()
- }
- }()
-
- var jids []int32
- var servers, slowServers = make([]*httptest.Server, 4), make([]*httptest.Server, 4)
- // We expect metadata of:
- // latestAnswer:nil // First call
- // latestAnswer:0
- // latestAnswer:10
- // latestAnswer:20
- // latestAnswer:30
- var metaLock sync.Mutex
- expectedMeta := map[string]struct{}{
- "0": {}, "10": {}, "20": {}, "30": {},
- }
- returnData := int(10)
- for i := 0; i < 4; i++ {
- s := i
- require.NoError(t, apps[i].Start(testutils.Context(t)))
-
- // API speed is > observation timeout set in ContractSetConfigArgsForIntegrationTest
- slowServers[i] = httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
- time.Sleep(5 * time.Second)
- var result string
- metaLock.Lock()
- result = fmt.Sprintf(`{"data":%d}`, returnData)
- metaLock.Unlock()
- res.WriteHeader(http.StatusOK)
- t.Logf("Slow Bridge %d returning data:10", s)
- _, err := res.Write([]byte(result))
- require.NoError(t, err)
- }))
- t.Cleanup(slowServers[s].Close)
- servers[i] = httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
- b, err := io.ReadAll(req.Body)
- require.NoError(t, err)
- var m bridges.BridgeMetaDataJSON
- require.NoError(t, json.Unmarshal(b, &m))
- var result string
- metaLock.Lock()
- result = fmt.Sprintf(`{"data":%d}`, returnData)
- metaLock.Unlock()
- if m.Meta.LatestAnswer != nil && m.Meta.UpdatedAt != nil {
- t.Logf("Bridge %d deleting %s, from request body: %s", s, m.Meta.LatestAnswer, b)
- metaLock.Lock()
- delete(expectedMeta, m.Meta.LatestAnswer.String())
- metaLock.Unlock()
- }
- res.WriteHeader(http.StatusOK)
- _, err = res.Write([]byte(result))
- require.NoError(t, err)
- }))
- t.Cleanup(servers[s].Close)
- u, _ := url.Parse(servers[i].URL)
- bridgeName := fmt.Sprintf("bridge%d", i)
- require.NoError(t, apps[i].BridgeORM().CreateBridgeType(testutils.Context(t), &bridges.BridgeType{
- Name: bridges.BridgeName(bridgeName),
- URL: models.WebURL(*u),
- }))
-
- var chainReaderSpec string
- if test.chainReaderAndCodec {
- chainReaderSpec = `
-[relayConfig.chainReader.contracts.median]
-contractPollingFilter.genericEventNames = ["LatestRoundRequested"]
-
-contractABI = '''
-[
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "address",
- "name": "requester",
- "type": "address"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "configDigest",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint32",
- "name": "epoch",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint8",
- "name": "round",
- "type": "uint8"
- }
- ],
- "name": "RoundRequested",
- "type": "event"
- },
- {
- "inputs": [],
- "name": "latestTransmissionDetails",
- "outputs": [
- {
- "internalType": "bytes32",
- "name": "configDigest",
- "type": "bytes32"
- },
- {
- "internalType": "uint32",
- "name": "epoch",
- "type": "uint32"
- },
- {
- "internalType": "uint8",
- "name": "round",
- "type": "uint8"
- },
- {
- "internalType": "int192",
- "name": "latestAnswer_",
- "type": "int192"
- },
- {
- "internalType": "uint64",
- "name": "latestTimestamp_",
- "type": "uint64"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- }
-]
-'''
-
-[relayConfig.chainReader.contracts.median.configs]
-LatestRoundRequested = '''
-{
- "chainSpecificName": "RoundRequested",
- "readType": "event"
-}
-'''
-LatestTransmissionDetails = '''
-{
- "chainSpecificName": "latestTransmissionDetails",
- "outputModifications": [
- {
- "Fields": [
- "LatestTimestamp_"
- ],
- "type": "epoch to time"
- },
- {
- "Fields": {
- "LatestAnswer_": "LatestAnswer",
- "LatestTimestamp_": "LatestTimestamp"
- },
- "type": "rename"
- }
- ]
-}
-'''
-
-[relayConfig.codec.configs.MedianReport]
-typeABI = '''
-[
- {
- "Name": "Timestamp",
- "Type": "uint32"
- },
- {
- "Name": "Observers",
- "Type": "bytes32"
- },
- {
- "Name": "Observations",
- "Type": "int192[]"
- },
- {
- "Name": "JuelsPerFeeCoin",
- "Type": "int192"
- }
-]
-'''
-`
- }
- ocrJob, err := validate.ValidatedOracleSpecToml(testutils.Context(t), apps[i].Config.OCR2(), apps[i].Config.Insecure(), fmt.Sprintf(`
-type = "offchainreporting2"
-relay = "evm"
-schemaVersion = 1
-pluginType = "median"
-name = "web oracle spec"
-contractID = "%s"
-ocrKeyBundleID = "%s"
-transmitterID = "%s"
-contractConfigConfirmations = 1
-contractConfigTrackerPollInterval = "1s"
-observationSource = """
- // data source 1
- ds1 [type=bridge name="%s"];
- ds1_parse [type=jsonparse path="data"];
- ds1_multiply [type=multiply times=%d];
-
- // data source 2
- ds2 [type=http method=GET url="%s"];
- ds2_parse [type=jsonparse path="data"];
- ds2_multiply [type=multiply times=%d];
-
- ds1 -> ds1_parse -> ds1_multiply -> answer1;
- ds2 -> ds2_parse -> ds2_multiply -> answer1;
-
- answer1 [type=median index=0];
-"""
-
-[relayConfig]
-chainID = 1337
-fromBlock = %d
-%s
-
-[pluginConfig]
-juelsPerFeeCoinSource = """
- // data source 1
- ds1 [type=bridge name="%s"];
- ds1_parse [type=jsonparse path="data"];
- ds1_multiply [type=multiply times=%d];
-
- // data source 2
- ds2 [type=http method=GET url="%s"];
- ds2_parse [type=jsonparse path="data"];
- ds2_multiply [type=multiply times=%d];
-
- ds1 -> ds1_parse -> ds1_multiply -> answer1;
- ds2 -> ds2_parse -> ds2_multiply -> answer1;
-
- answer1 [type=median index=0];
-"""
-gasPriceSubunitsSource = """
- // data source
- dsp [type=bridge name="%s"];
- dsp_parse [type=jsonparse path="data"];
- dsp -> dsp_parse;
-"""
-[pluginConfig.juelsPerFeeCoinCache]
-updateInterval = "1m"
-`, ocrContractAddress, kbs[i].ID(), transmitters[i], bridgeName, i, slowServers[i].URL, i, blockBeforeConfig.Number().Int64(), chainReaderSpec, bridgeName, i, slowServers[i].URL, i, bridgeName), nil)
- require.NoError(t, err)
- err = apps[i].AddJobV2(testutils.Context(t), &ocrJob)
- require.NoError(t, err)
- jids = append(jids, ocrJob.ID)
- }
-
- // Watch for OCR2AggregatorTransmitted events
- start := uint64(0)
- txEvents := make(chan *ocr2aggregator.OCR2AggregatorTransmitted)
- _, err := ocrContract.WatchTransmitted(&bind.WatchOpts{Start: &start, Context: testutils.Context(t)}, txEvents)
- require.NoError(t, err)
- newTxEvents := make(chan *ocr2aggregator.OCR2AggregatorNewTransmission)
- _, err = ocrContract.WatchNewTransmission(&bind.WatchOpts{Start: &start, Context: testutils.Context(t)}, newTxEvents, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
- require.NoError(t, err)
-
- go func() {
- var newTxEvent *ocr2aggregator.OCR2AggregatorNewTransmission
- select {
- case txEvent := <-txEvents:
- t.Logf("txEvent: %v", txEvent)
- if newTxEvent != nil {
- assert.Equal(t, txEvent.Epoch, uint32(newTxEvent.EpochAndRound.Uint64()))
- }
- case newTxEvent = <-newTxEvents:
- t.Logf("newTxEvent: %v", newTxEvent)
- }
- }()
-
- ctx := testutils.Context(t)
- for trial := 0; trial < 2; trial++ {
- var retVal int
-
- metaLock.Lock()
- returnData = 10 * (trial + 1)
- retVal = returnData
- for i := 0; i < 4; i++ {
- expectedMeta[fmt.Sprintf("%d", returnData*i)] = struct{}{}
- }
- metaLock.Unlock()
-
- // Assert that all the OCR jobs get a run with valid values eventually.
- var wg sync.WaitGroup
- for i := 0; i < 4; i++ {
- ic := i
- wg.Add(1)
- go func() {
- defer wg.Done()
- completedRuns, err2 := apps[ic].JobORM().FindPipelineRunIDsByJobID(ctx, jids[ic], 0, 1000)
- require.NoError(t, err2)
- // Want at least 2 runs so we see all the metadata.
- pr := cltest.WaitForPipelineComplete(t, ic, jids[ic], len(completedRuns)+2, 7, apps[ic].JobORM(), 2*time.Minute, 5*time.Second)
- jb, err2 := pr[0].Outputs.MarshalJSON()
- require.NoError(t, err2)
- assert.Equal(t, []byte(fmt.Sprintf("[\"%d\"]", retVal*ic)), jb, "pr[0] %+v pr[1] %+v", pr[0], pr[1])
- require.NoError(t, err2)
- }()
- }
- wg.Wait()
-
- // Trail #1: 4 oracles reporting 0, 10, 20, 30. Answer should be 20 (results[4/2]).
- // Trial #2: 4 oracles reporting 0, 20, 40, 60. Answer should be 40 (results[4/2]).
- gomega.NewGomegaWithT(t).Eventually(func() string {
- answer, err2 := ocrContract.LatestAnswer(nil)
- require.NoError(t, err2)
- return answer.String()
- }, 1*time.Minute, 200*time.Millisecond).Should(gomega.Equal(fmt.Sprintf("%d", 2*retVal)))
-
- for _, app := range apps {
- jobs, _, err2 := app.JobORM().FindJobs(ctx, 0, 1000)
- require.NoError(t, err2)
- // No spec errors
- for _, j := range jobs {
- ignore := 0
- for i := range j.JobSpecErrors {
- // Non-fatal timing related error, ignore for testing.
- if strings.Contains(j.JobSpecErrors[i].Description, "leader's phase conflicts tGrace timeout") {
- ignore++
- }
- }
- require.Len(t, j.JobSpecErrors, ignore)
- }
- }
- em := map[string]struct{}{}
- metaLock.Lock()
- maps.Copy(em, expectedMeta)
- metaLock.Unlock()
- assert.Len(t, em, 0, "expected metadata %v", em)
-
- t.Logf("======= Summary =======")
- roundId, err2 := ocrContract.LatestRound(nil)
- require.NoError(t, err2)
- for i := 0; i <= int(roundId.Int64()); i++ {
- roundData, err3 := ocrContract.GetRoundData(nil, big.NewInt(int64(i)))
- require.NoError(t, err3)
- t.Logf("RoundId: %d, AnsweredInRound: %d, Answer: %d, StartedAt: %v, UpdatedAt: %v", roundData.RoundId, roundData.AnsweredInRound, roundData.Answer, roundData.StartedAt, roundData.UpdatedAt)
- }
-
- expectedAnswer := big.NewInt(2 * int64(retVal))
-
- // Assert we can read the latest config digest and epoch after a report has been submitted.
- contractABI, err2 := abi.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorABI))
- require.NoError(t, err2)
- apps[0].GetRelayers().LegacyEVMChains().Slice()
- ct, err2 := evm.NewOCRContractTransmitter(testutils.Context(t), ocrContractAddress, apps[0].GetRelayers().LegacyEVMChains().Slice()[0].Client(), contractABI, nil, apps[0].GetRelayers().LegacyEVMChains().Slice()[0].LogPoller(), lggr)
- require.NoError(t, err2)
- configDigest, epoch, err2 := ct.LatestConfigDigestAndEpoch(testutils.Context(t))
- require.NoError(t, err2)
- details, err2 := ocrContract.LatestConfigDetails(nil)
- require.NoError(t, err2)
- assert.True(t, bytes.Equal(configDigest[:], details.ConfigDigest[:]))
- digestAndEpoch, err2 := ocrContract.LatestConfigDigestAndEpoch(nil)
- require.NoError(t, err2)
- assert.Equal(t, digestAndEpoch.Epoch, epoch)
- latestTransmissionDetails, err2 := ocrContract.LatestTransmissionDetails(nil)
- require.NoError(t, err2)
- assert.Equal(t, expectedAnswer, latestTransmissionDetails.LatestAnswer)
- require.NoError(t, err2)
- newTransmissionEvents, err2 := ocrContract.FilterTransmitted(&bind.FilterOpts{Start: 0, End: nil})
- require.NoError(t, err2)
- for newTransmissionEvents.Next() {
- assert.Equal(t, 3, newTransmissionEvents.Event.Epoch)
- }
- }
- })
- }
-}
-
-func initOCR2(t *testing.T, lggr logger.Logger, b *simulated.Backend,
- ocrContract *ocr2aggregator.OCR2Aggregator,
- owner *bind.TransactOpts,
- bootstrapNode *ocr2Node,
- oracles []confighelper2.OracleIdentityExtra,
- transmitters []common.Address,
- payees []common.Address,
- specFn func(int64) string,
-) (
- blockBeforeConfig *types.Block,
-) {
- lggr.Debugw("Setting Payees on OraclePlugin Contract", "transmitters", payees)
- _, err := ocrContract.SetPayees(
- owner,
- transmitters,
- payees,
- )
- require.NoError(t, err)
- b.Commit()
- blockBeforeConfig, err = b.Client().BlockByNumber(testutils.Context(t), nil)
- require.NoError(t, err)
- signers, effectiveTransmitters, threshold, _, encodedConfigVersion, encodedConfig, err := confighelper2.ContractSetConfigArgsForEthereumIntegrationTest(
- oracles,
- 1,
- 1000000000/100, // threshold PPB
- )
- require.NoError(t, err)
-
- minAnswer, maxAnswer := new(big.Int), new(big.Int)
- minAnswer.Exp(big.NewInt(-2), big.NewInt(191), nil)
- maxAnswer.Exp(big.NewInt(2), big.NewInt(191), nil)
- maxAnswer.Sub(maxAnswer, big.NewInt(1))
-
- onchainConfig, err := testhelpers.GenerateDefaultOCR2OnchainConfig(minAnswer, maxAnswer)
- require.NoError(t, err)
-
- lggr.Debugw("Setting Config on Oracle Contract",
- "signers", signers,
- "transmitters", transmitters,
- "effectiveTransmitters", effectiveTransmitters,
- "threshold", threshold,
- "onchainConfig", onchainConfig,
- "encodedConfigVersion", encodedConfigVersion,
- )
- _, err = ocrContract.SetConfig(
- owner,
- signers,
- effectiveTransmitters,
- threshold,
- onchainConfig,
- encodedConfigVersion,
- encodedConfig,
- )
- require.NoError(t, err)
- b.Commit()
-
- err = bootstrapNode.app.Start(testutils.Context(t))
- require.NoError(t, err)
-
- chainSet := bootstrapNode.app.GetRelayers().LegacyEVMChains()
- require.NotNil(t, chainSet)
- ocrJob, err := ocrbootstrap.ValidatedBootstrapSpecToml(specFn(blockBeforeConfig.Number().Int64()))
- require.NoError(t, err)
- err = bootstrapNode.app.AddJobV2(testutils.Context(t), &ocrJob)
- require.NoError(t, err)
- return
+ RunTestIntegrationOCR2(t)
}
func TestIntegration_OCR2_ForwarderFlow(t *testing.T) {
t.Parallel()
- owner, b, ocrContractAddress, ocrContract := setupOCR2Contracts(t)
+ owner, b, ocrContractAddress, ocrContract := SetupOCR2Contracts(t)
lggr := logger.TestLogger(t)
bootstrapNodePort := freeport.GetOne(t)
- bootstrapNode := setupNodeOCR2(t, owner, bootstrapNodePort, true /* useForwarders */, b, nil)
+ bootstrapNode := SetupNodeOCR2(t, owner, bootstrapNodePort, true /* useForwarders */, b, nil)
var (
oracles []confighelper2.OracleIdentityExtra
@@ -714,31 +59,31 @@ func TestIntegration_OCR2_ForwarderFlow(t *testing.T) {
)
ports := freeport.GetN(t, 4)
for i := uint16(0); i < 4; i++ {
- node := setupNodeOCR2(t, owner, ports[i], true /* useForwarders */, b, []commontypes.BootstrapperLocator{
+ node := SetupNodeOCR2(t, owner, ports[i], true /* useForwarders */, b, []commontypes.BootstrapperLocator{
// Supply the bootstrap IP and port as a V2 peer address
- {PeerID: bootstrapNode.peerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePort)}},
+ {PeerID: bootstrapNode.PeerID, Addrs: []string{fmt.Sprintf("127.0.0.1:%d", bootstrapNodePort)}},
})
// Effective transmitter should be a forwarder not an EOA.
- require.NotEqual(t, node.effectiveTransmitter, node.transmitter)
+ require.NotEqual(t, node.EffectiveTransmitter, node.Transmitter)
- kbs = append(kbs, node.keybundle)
- apps = append(apps, node.app)
- forwarderContracts = append(forwarderContracts, node.effectiveTransmitter)
- transmitters = append(transmitters, node.transmitter)
+ kbs = append(kbs, node.KeyBundle)
+ apps = append(apps, node.App)
+ forwarderContracts = append(forwarderContracts, node.EffectiveTransmitter)
+ transmitters = append(transmitters, node.Transmitter)
oracles = append(oracles, confighelper2.OracleIdentityExtra{
OracleIdentity: confighelper2.OracleIdentity{
- OnchainPublicKey: node.keybundle.PublicKey(),
- TransmitAccount: ocrtypes2.Account(node.effectiveTransmitter.String()),
- OffchainPublicKey: node.keybundle.OffchainPublicKey(),
- PeerID: node.peerID,
+ OnchainPublicKey: node.KeyBundle.PublicKey(),
+ TransmitAccount: ocrtypes2.Account(node.EffectiveTransmitter.String()),
+ OffchainPublicKey: node.KeyBundle.OffchainPublicKey(),
+ PeerID: node.PeerID,
},
- ConfigEncryptionPublicKey: node.keybundle.ConfigEncryptionPublicKey(),
+ ConfigEncryptionPublicKey: node.KeyBundle.ConfigEncryptionPublicKey(),
})
}
- blockBeforeConfig := initOCR2(t, lggr, b, ocrContract, owner, bootstrapNode, oracles, forwarderContracts, transmitters, func(int64) string {
+ blockBeforeConfig := InitOCR2(t, lggr, b, ocrContract, owner, bootstrapNode, oracles, forwarderContracts, transmitters, func(int64) string {
return fmt.Sprintf(`
type = "bootstrap"
name = "bootstrap"
@@ -869,7 +214,7 @@ updateInterval = "1m"
for _, app := range apps {
require.NoError(t, app.GetRelayers().LegacyEVMChains().Slice()[0].LogPoller().Replay(testutils.Context(t), blockBeforeConfig.Number().Int64()))
}
- require.NoError(t, bootstrapNode.app.GetRelayers().LegacyEVMChains().Slice()[0].LogPoller().Replay(testutils.Context(t), blockBeforeConfig.Number().Int64()))
+ require.NoError(t, bootstrapNode.App.GetRelayers().LegacyEVMChains().Slice()[0].LogPoller().Replay(testutils.Context(t), blockBeforeConfig.Number().Int64()))
// Assert that all the OCR jobs get a run with valid values eventually.
var wg sync.WaitGroup
@@ -930,5 +275,3 @@ updateInterval = "1m"
require.NoError(t, err)
assert.Equal(t, digestAndEpoch.Epoch, epoch)
}
-
-func ptr[T any](v T) *T { return &v }
diff --git a/core/internal/features/ocr2/plugins/features_ocr2_plugin_test.go b/core/internal/features/ocr2/plugins/features_ocr2_plugin_test.go
new file mode 100644
index 00000000000..260a931a65f
--- /dev/null
+++ b/core/internal/features/ocr2/plugins/features_ocr2_plugin_test.go
@@ -0,0 +1,16 @@
+//go:build integration
+
+// This package exists to separate a long-running test which sets environment variables, and so cannot be run in parallel.
+package plugins
+
+import (
+ "testing"
+
+ "github.com/smartcontractkit/chainlink/v2/core/config/env"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/features/ocr2"
+)
+
+func TestIntegration_OCR2_plugins(t *testing.T) {
+ t.Setenv(string(env.MedianPlugin.Cmd), "chainlink-feeds")
+ ocr2.RunTestIntegrationOCR2(t)
+}
diff --git a/core/internal/features/ocr2/plugins/plugins.go b/core/internal/features/ocr2/plugins/plugins.go
new file mode 100644
index 00000000000..8e3c36c581d
--- /dev/null
+++ b/core/internal/features/ocr2/plugins/plugins.go
@@ -0,0 +1,3 @@
+package plugins
+
+// empty file w/o build tag so the package "builds"
diff --git a/core/internal/testutils/configtest/general_config.go b/core/internal/testutils/configtest/general_config.go
index 63aba18c351..f0851c67740 100644
--- a/core/internal/testutils/configtest/general_config.go
+++ b/core/internal/testutils/configtest/general_config.go
@@ -7,14 +7,16 @@ import (
"github.com/stretchr/testify/require"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
+
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
+
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
evmcfg "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
"github.com/smartcontractkit/chainlink/v2/core/store/models"
)
@@ -48,7 +50,7 @@ func overrides(c *chainlink.Config, s *chainlink.Secrets) {
c.InsecureFastScrypt = ptr(true)
c.ShutdownGracePeriod = commonconfig.MustNewDuration(testutils.DefaultWaitTimeout)
- c.Database.Dialect = dialects.TransactionWrappedPostgres
+ c.Database.Dialect = pgcommon.TransactionWrappedPostgres
c.Database.Lock.Enabled = ptr(false)
c.Database.MaxIdleConns = ptr[int64](20)
c.Database.MaxOpenConns = ptr[int64](20)
diff --git a/core/internal/testutils/pgtest/pgtest.go b/core/internal/testutils/pgtest/pgtest.go
index 8464604b667..ee17d8f4d14 100644
--- a/core/internal/testutils/pgtest/pgtest.go
+++ b/core/internal/testutils/pgtest/pgtest.go
@@ -3,26 +3,25 @@ package pgtest
import (
"testing"
- "github.com/google/uuid"
"github.com/jmoiron/sqlx"
- "github.com/scylladb/go-reflectx"
- "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
+ "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
"github.com/smartcontractkit/chainlink-common/pkg/utils"
+
+ "github.com/smartcontractkit/chainlink/v2/core/config/env"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
)
func NewSqlxDB(t testing.TB) *sqlx.DB {
testutils.SkipShortDB(t)
- db, err := sqlx.Open(string(dialects.TransactionWrappedPostgres), uuid.New().String())
- require.NoError(t, err)
- t.Cleanup(func() { assert.NoError(t, db.Close()) })
- db.MapperFunc(reflectx.CamelToSnakeASCII)
-
- return db
+ dbURL := string(env.DatabaseURL.Get())
+ if dbURL == "" {
+ t.Errorf("you must provide a CL_DATABASE_URL environment variable")
+ return nil
+ }
+ return pg.NewTestDB(t, dbURL)
}
func MustExec(t *testing.T, ds sqlutil.DataSource, stmt string, args ...interface{}) {
diff --git a/core/internal/testutils/pgtest/txdb.go b/core/internal/testutils/pgtest/txdb.go
deleted file mode 100644
index 7591054305c..00000000000
--- a/core/internal/testutils/pgtest/txdb.go
+++ /dev/null
@@ -1,509 +0,0 @@
-package pgtest
-
-import (
- "context"
- "database/sql"
- "database/sql/driver"
- "flag"
- "fmt"
- "io"
- "net/url"
- "strings"
- "sync"
- "testing"
-
- "github.com/jmoiron/sqlx"
- "go.uber.org/multierr"
-
- "github.com/smartcontractkit/chainlink/v2/core/config/env"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
-)
-
-// txdb is a simplified version of https://github.com/DATA-DOG/go-txdb
-//
-// The original lib has various problems and is hard to understand because it
-// tries to be more general. The version in this file is more tightly focused
-// to our needs and should be easier to reason about and less likely to have
-// subtle bugs/races.
-//
-// It doesn't currently support savepoints but could be made to if necessary.
-//
-// Transaction BEGIN/ROLLBACK effectively becomes a no-op, this should have no
-// negative impact on normal test operation.
-//
-// If you MUST test BEGIN/ROLLBACK behaviour, you will have to configure your
-// store to use the raw DialectPostgres dialect and setup a one-use database.
-// See heavyweight.FullTestDB() as a convenience function to help you do this,
-// but please use sparingly because as it's name implies, it is expensive.
-func init() {
- testing.Init()
- if !flag.Parsed() {
- flag.Parse()
- }
- if testing.Short() {
- // -short tests don't need a DB
- return
- }
- dbURL := string(env.DatabaseURL.Get())
- if dbURL == "" {
- panic("you must provide a CL_DATABASE_URL environment variable")
- }
-
- parsed, err := url.Parse(dbURL)
- if err != nil {
- panic(err)
- }
- if parsed.Path == "" {
- msg := fmt.Sprintf("invalid %[1]s: `%[2]s`. You must set %[1]s env var to point to your test database. Note that the test database MUST end in `_test` to differentiate from a possible production DB. HINT: Try %[1]s=postgresql://postgres@localhost:5432/chainlink_test?sslmode=disable", env.DatabaseURL, parsed.String())
- panic(msg)
- }
- if !strings.HasSuffix(parsed.Path, "_test") {
- msg := fmt.Sprintf("cannot run tests against database named `%s`. Note that the test database MUST end in `_test` to differentiate from a possible production DB. HINT: Try %s=postgresql://postgres@localhost:5432/chainlink_test?sslmode=disable", parsed.Path[1:], env.DatabaseURL)
- panic(msg)
- }
- name := string(dialects.TransactionWrappedPostgres)
- sql.Register(name, &txDriver{
- dbURL: dbURL,
- conns: make(map[string]*conn),
- })
- sqlx.BindDriver(name, sqlx.DOLLAR)
-}
-
-var _ driver.Conn = &conn{}
-
-var _ driver.Validator = &conn{}
-var _ driver.SessionResetter = &conn{}
-
-// txDriver is an sql driver which runs on a single transaction.
-// When `Close` is called, transaction is rolled back.
-type txDriver struct {
- sync.Mutex
- db *sql.DB
- conns map[string]*conn
-
- dbURL string
-}
-
-func (d *txDriver) Open(dsn string) (driver.Conn, error) {
- d.Lock()
- defer d.Unlock()
- // Open real db connection if its the first call
- if d.db == nil {
- db, err := sql.Open(string(dialects.Postgres), d.dbURL)
- if err != nil {
- return nil, err
- }
- d.db = db
- }
- c, exists := d.conns[dsn]
- if !exists || !c.tryOpen() {
- tx, err := d.db.Begin()
- if err != nil {
- return nil, err
- }
- c = &conn{tx: tx, opened: 1, dsn: dsn}
- c.removeSelf = func() error {
- return d.deleteConn(c)
- }
- d.conns[dsn] = c
- }
- return c, nil
-}
-
-// deleteConn is called by a connection when it is closed via the `close` method.
-// It also auto-closes the DB when the last checked out connection is closed.
-func (d *txDriver) deleteConn(c *conn) error {
- // must lock here to avoid racing with Open
- d.Lock()
- defer d.Unlock()
-
- if d.conns[c.dsn] != c {
- return nil // already been replaced
- }
- delete(d.conns, c.dsn)
- if len(d.conns) == 0 && d.db != nil {
- if err := d.db.Close(); err != nil {
- return err
- }
- d.db = nil
- }
- return nil
-}
-
-type conn struct {
- sync.Mutex
- dsn string
- tx *sql.Tx // tx may be shared by many conns, definitive one lives in the map keyed by DSN on the txDriver. Do not modify from conn
- closed bool
- opened int
- removeSelf func() error
-}
-
-func (c *conn) Begin() (driver.Tx, error) {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- panic("conn is closed")
- }
- // Begin is a noop because the transaction was already opened
- return tx{c.tx}, nil
-}
-
-// Implement the "ConnBeginTx" interface
-func (c *conn) BeginTx(_ context.Context, opts driver.TxOptions) (driver.Tx, error) {
- // Context is ignored, because single transaction is shared by all callers, thus caller should not be able to
- // control it with local context
- return c.Begin()
-}
-
-// Prepare returns a prepared statement, bound to this connection.
-func (c *conn) Prepare(query string) (driver.Stmt, error) {
- return c.PrepareContext(context.Background(), query)
-}
-
-// Implement the "ConnPrepareContext" interface
-func (c *conn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- panic("conn is closed")
- }
-
- // TODO: Fix context handling
- // FIXME: It is not safe to give the passed in context to the tx directly
- // because the tx is shared by many conns and cancelling the context will
- // destroy the tx which can affect other conns
- st, err := c.tx.PrepareContext(context.Background(), query)
- if err != nil {
- return nil, err
- }
- return &stmt{st, c}, nil
-}
-
-// IsValid is called prior to placing the connection into the
-// connection pool by database/sql. The connection will be discarded if false is returned.
-func (c *conn) IsValid() bool {
- c.Lock()
- defer c.Unlock()
- return !c.closed
-}
-
-func (c *conn) ResetSession(ctx context.Context) error {
- // Ensure bad connections are reported: From database/sql/driver:
- // If a connection is never returned to the connection pool but immediately reused, then
- // ResetSession is called prior to reuse but IsValid is not called.
- c.Lock()
- defer c.Unlock()
- if c.closed {
- return driver.ErrBadConn
- }
-
- return nil
-}
-
-// pgx returns nil
-func (c *conn) CheckNamedValue(nv *driver.NamedValue) error {
- return nil
-}
-
-// Implement the "QueryerContext" interface
-func (c *conn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- panic("conn is closed")
- }
-
- // TODO: Fix context handling
- rs, err := c.tx.QueryContext(context.Background(), query, mapNamedArgs(args)...)
- if err != nil {
- return nil, err
- }
- defer rs.Close()
-
- return buildRows(rs)
-}
-
-// Implement the "ExecerContext" interface
-func (c *conn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- panic("conn is closed")
- }
- // TODO: Fix context handling
- return c.tx.ExecContext(context.Background(), query, mapNamedArgs(args)...)
-}
-
-// tryOpen attempts to increment the open count, but returns false if closed.
-func (c *conn) tryOpen() bool {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- return false
- }
- c.opened++
- return true
-}
-
-// Close invalidates and potentially stops any current
-// prepared statements and transactions, marking this
-// connection as no longer in use.
-//
-// Because the sql package maintains a free pool of
-// connections and only calls Close when there's a surplus of
-// idle connections, it shouldn't be necessary for drivers to
-// do their own connection caching.
-//
-// Drivers must ensure all network calls made by Close
-// do not block indefinitely (e.g. apply a timeout).
-func (c *conn) Close() (err error) {
- if !c.close() {
- return
- }
- // Wait to remove self to avoid nesting locks.
- if err := c.removeSelf(); err != nil {
- panic(err)
- }
- return
-}
-
-func (c *conn) close() bool {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- // Double close, should be a safe to make this a noop
- // PGX allows double close
- // See: https://github.com/jackc/pgx/blob/a457da8bffa4f90ad672fa093ee87f20cf06687b/conn.go#L249
- return false
- }
-
- c.opened--
- if c.opened > 0 {
- return false
- }
- if c.tx != nil {
- if err := c.tx.Rollback(); err != nil {
- panic(err)
- }
- c.tx = nil
- }
- c.closed = true
- return true
-}
-
-type tx struct {
- tx *sql.Tx
-}
-
-func (tx tx) Commit() error {
- // Commit is a noop because the transaction will be rolled back at the end
- return nil
-}
-
-func (tx tx) Rollback() error {
- // Rollback is a noop because the transaction will be rolled back at the end
- return nil
-}
-
-type stmt struct {
- st *sql.Stmt
- conn *conn
-}
-
-func (s stmt) Exec(args []driver.Value) (driver.Result, error) {
- s.conn.Lock()
- defer s.conn.Unlock()
- if s.conn.closed {
- panic("conn is closed")
- }
- return s.st.Exec(mapArgs(args)...)
-}
-
-// Implement the "StmtExecContext" interface
-func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) {
- s.conn.Lock()
- defer s.conn.Unlock()
- if s.conn.closed {
- panic("conn is closed")
- }
- // TODO: Fix context handling
- return s.st.ExecContext(context.Background(), mapNamedArgs(args)...)
-}
-
-func mapArgs(args []driver.Value) (res []interface{}) {
- res = make([]interface{}, len(args))
- for i := range args {
- res[i] = args[i]
- }
- return
-}
-
-func (s stmt) NumInput() int {
- return -1
-}
-
-func (s stmt) Query(args []driver.Value) (driver.Rows, error) {
- s.conn.Lock()
- defer s.conn.Unlock()
- if s.conn.closed {
- panic("conn is closed")
- }
- rows, err := s.st.Query(mapArgs(args)...)
- defer func() {
- err = multierr.Combine(err, rows.Close())
- }()
- if err != nil {
- return nil, err
- }
- return buildRows(rows)
-}
-
-// Implement the "StmtQueryContext" interface
-func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) {
- s.conn.Lock()
- defer s.conn.Unlock()
- if s.conn.closed {
- panic("conn is closed")
- }
- // TODO: Fix context handling
- rows, err := s.st.QueryContext(context.Background(), mapNamedArgs(args)...)
- if err != nil {
- return nil, err
- }
- return buildRows(rows)
-}
-
-func (s stmt) Close() error {
- s.conn.Lock()
- defer s.conn.Unlock()
- return s.st.Close()
-}
-
-func buildRows(r *sql.Rows) (driver.Rows, error) {
- set := &rowSets{}
- rs := &rows{}
- if err := rs.read(r); err != nil {
- return set, err
- }
- set.sets = append(set.sets, rs)
- for r.NextResultSet() {
- rss := &rows{}
- if err := rss.read(r); err != nil {
- return set, err
- }
- set.sets = append(set.sets, rss)
- }
- return set, nil
-}
-
-// Implement the "RowsNextResultSet" interface
-func (rs *rowSets) HasNextResultSet() bool {
- return rs.pos+1 < len(rs.sets)
-}
-
-// Implement the "RowsNextResultSet" interface
-func (rs *rowSets) NextResultSet() error {
- if !rs.HasNextResultSet() {
- return io.EOF
- }
-
- rs.pos++
- return nil
-}
-
-type rows struct {
- rows [][]driver.Value
- pos int
- cols []string
- colTypes []*sql.ColumnType
-}
-
-func (r *rows) Columns() []string {
- return r.cols
-}
-
-func (r *rows) ColumnTypeDatabaseTypeName(index int) string {
- return r.colTypes[index].DatabaseTypeName()
-}
-
-func (r *rows) Next(dest []driver.Value) error {
- r.pos++
- if r.pos > len(r.rows) {
- return io.EOF
- }
-
- for i, val := range r.rows[r.pos-1] {
- dest[i] = *(val.(*interface{}))
- }
-
- return nil
-}
-
-func (r *rows) Close() error {
- return nil
-}
-
-func (r *rows) read(rs *sql.Rows) error {
- var err error
- r.cols, err = rs.Columns()
- if err != nil {
- return err
- }
-
- r.colTypes, err = rs.ColumnTypes()
- if err != nil {
- return err
- }
-
- for rs.Next() {
- values := make([]interface{}, len(r.cols))
- for i := range values {
- values[i] = new(interface{})
- }
- if err := rs.Scan(values...); err != nil {
- return err
- }
- row := make([]driver.Value, len(r.cols))
- for i, v := range values {
- row[i] = driver.Value(v)
- }
- r.rows = append(r.rows, row)
- }
- return rs.Err()
-}
-
-type rowSets struct {
- sets []*rows
- pos int
-}
-
-func (rs *rowSets) Columns() []string {
- return rs.sets[rs.pos].cols
-}
-
-func (rs *rowSets) ColumnTypeDatabaseTypeName(index int) string {
- return rs.sets[rs.pos].ColumnTypeDatabaseTypeName(index)
-}
-
-func (rs *rowSets) Close() error {
- return nil
-}
-
-// advances to next row
-func (rs *rowSets) Next(dest []driver.Value) error {
- return rs.sets[rs.pos].Next(dest)
-}
-
-func mapNamedArgs(args []driver.NamedValue) (res []interface{}) {
- res = make([]interface{}, len(args))
- for i := range args {
- name := args[i].Name
- if name != "" {
- res[i] = sql.Named(name, args[i].Value)
- } else {
- res[i] = args[i].Value
- }
- }
- return
-}
diff --git a/core/internal/testutils/testutils.go b/core/internal/testutils/testutils.go
index 0504570365b..c2f7351186e 100644
--- a/core/internal/testutils/testutils.go
+++ b/core/internal/testutils/testutils.go
@@ -32,6 +32,7 @@ import (
// NOTE: To avoid circular dependencies, this package MUST NOT import
// anything from "github.com/smartcontractkit/chainlink/v2/core"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
)
const (
@@ -125,19 +126,7 @@ func WaitTimeout(t *testing.T) time.Duration {
// Context returns a context with the test's deadline, if available.
func Context(tb testing.TB) context.Context {
- ctx := context.Background()
- var cancel func()
- switch t := tb.(type) {
- case *testing.T:
- if d, ok := t.Deadline(); ok {
- ctx, cancel = context.WithDeadline(ctx, d)
- }
- }
- if cancel == nil {
- ctx, cancel = context.WithCancel(ctx)
- }
- tb.Cleanup(cancel)
- return ctx
+ return tests.Context(tb)
}
// MustParseURL parses the URL or fails the test
@@ -415,16 +404,9 @@ func WaitForLogMessageCount(t *testing.T, observedLogs *observer.ObservedLogs, m
})
}
-// SkipShort skips tb during -short runs, and notes why.
-func SkipShort(tb testing.TB, why string) {
- if testing.Short() {
- tb.Skipf("skipping: %s", why)
- }
-}
-
// SkipShortDB skips tb during -short runs, and notes the DB dependency.
func SkipShortDB(tb testing.TB) {
- SkipShort(tb, "DB dependency")
+ tests.SkipShort(tb, "DB dependency")
}
func AssertCount(t *testing.T, ds sqlutil.DataSource, tableName string, expected int64) {
@@ -454,10 +436,6 @@ func MustDecodeBase64(s string) (b []byte) {
return
}
-func SkipFlakey(t *testing.T, ticketURL string) {
- t.Skip("Flakey", ticketURL)
-}
-
func MustRandBytes(n int) (b []byte) {
b = make([]byte, n)
_, err := rand.Read(b)
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index 6bab1f30f8e..a9e5130db2c 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -13,7 +13,7 @@ replace github.com/smartcontractkit/chainlink/deployment => ../../deployment
// creating potential merge conflicts.
require (
github.com/smartcontractkit/chainlink/deployment v0.0.0-20241206210521-125d98cdaf66
- github.com/smartcontractkit/chainlink/v2 v2.0.0-20241206210521-125d98cdaf66
+ github.com/smartcontractkit/chainlink/v2 v2.14.0-mercury-20240807.0.20241106193309-5560cd76211a
)
require (
@@ -33,8 +33,8 @@ require (
github.com/prometheus/client_golang v1.20.5
github.com/shopspring/decimal v1.4.0
github.com/smartcontractkit/chainlink-automation v0.8.1
- github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83
- github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12
+ github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550
+ github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919
github.com/spf13/cobra v1.8.1
github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.9.0
@@ -69,7 +69,7 @@ require (
github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
github.com/XSAM/otelsql v0.27.0 // indirect
- github.com/andybalholm/brotli v1.1.0 // indirect
+ github.com/andybalholm/brotli v1.1.1 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect
github.com/avast/retry-go/v4 v4.6.0 // indirect
@@ -144,7 +144,7 @@ require (
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect
github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
- github.com/gin-contrib/cors v1.5.0 // indirect
+ github.com/gin-contrib/cors v1.7.2 // indirect
github.com/gin-contrib/expvar v0.0.1 // indirect
github.com/gin-contrib/sessions v0.0.5 // indirect
github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4 // indirect
@@ -170,7 +170,7 @@ require (
github.com/go-viper/mapstructure/v2 v2.1.0 // indirect
github.com/go-webauthn/webauthn v0.9.4 // indirect
github.com/go-webauthn/x v0.1.5 // indirect
- github.com/goccy/go-json v0.10.2 // indirect
+ github.com/goccy/go-json v0.10.3 // indirect
github.com/goccy/go-yaml v1.12.0 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
github.com/gofrs/flock v0.8.1 // indirect
@@ -238,8 +238,8 @@ require (
github.com/josharian/intern v1.0.0 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/klauspost/compress v1.17.9 // indirect
- github.com/klauspost/cpuid/v2 v2.2.7 // indirect
+ github.com/klauspost/compress v1.17.11 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
@@ -301,15 +301,15 @@ 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/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 // indirect
+ github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect
github.com/smartcontractkit/chain-selectors v1.0.34 // indirect
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0 // indirect
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e // indirect
- github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db // indirect
+ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 // indirect
github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect
- github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 // indirect
- github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc // indirect
+ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect
+ github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce // indirect
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 // indirect
github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.13 // indirect
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect
@@ -380,15 +380,15 @@ require (
go.uber.org/ratelimit v0.3.1 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/arch v0.11.0 // indirect
- golang.org/x/crypto v0.28.0 // indirect
+ golang.org/x/crypto v0.31.0 // indirect
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
golang.org/x/mod v0.21.0 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/oauth2 v0.23.0 // indirect
- golang.org/x/sync v0.8.0 // indirect
- golang.org/x/sys v0.26.0 // indirect
- golang.org/x/term v0.25.0 // indirect
- golang.org/x/text v0.19.0 // indirect
+ golang.org/x/sync v0.10.0 // indirect
+ golang.org/x/sys v0.28.0 // indirect
+ golang.org/x/term v0.27.0 // indirect
+ golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.7.0 // indirect
golang.org/x/tools v0.26.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index f86aad22fb4..7b004d6eae7 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -139,9 +139,11 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax
github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc=
github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
-github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
-github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
+github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g6V7ZM=
+github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A=
github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4=
github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
@@ -158,6 +160,8 @@ github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN
github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI=
github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -187,6 +191,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 h1:NJvU4S8KEk1GnF6+FvlnzMD/8wXTj/mYJSG6Q4yu3Pw=
@@ -405,6 +411,8 @@ github.com/gagliardetto/solana-go v1.8.4 h1:vmD/JmTlonyXGy39bAo0inMhmbdAwV7rXZtL
github.com/gagliardetto/solana-go v1.8.4/go.mod h1:i+7aAyNDTHG0jK8GZIBSI4OVvDqkt2Qx+LklYclRNG8=
github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw=
github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok=
+github.com/gagliardetto/utilz v0.1.1 h1:/etW4hl607emKg6R6Lj9jRJ9d6ue2AQOyjhuAwjzs1U=
+github.com/gagliardetto/utilz v0.1.1/go.mod h1:b+rGFkRHz3HWJD0RYMzat47JyvbTtpE0iEcYTRJTLLA=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ=
@@ -412,8 +420,8 @@ github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9y
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk=
-github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI=
+github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
+github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E=
github.com/gin-contrib/expvar v0.0.1 h1:IuU5ArEgihz50vG8Onrwz22kJr7Mcvgv9xSSpfU5g+w=
github.com/gin-contrib/expvar v0.0.1/go.mod h1:8o2CznfQi1JjktORdHr2/abg3wSV6OCnXh0yGypvvVw=
github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE=
@@ -497,8 +505,8 @@ github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAh
github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0=
github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY=
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM=
github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU=
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0=
@@ -563,6 +571,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI=
+github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -664,6 +674,8 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=
github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg=
@@ -830,11 +842,11 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
-github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
+github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
-github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
+github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -881,6 +893,8 @@ github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYt
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk=
+github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ=
+github.com/marcboeker/go-duckdb v1.8.3/go.mod h1:C9bYRE1dPYb1hhfu/SSomm78B0FXmNgRvv6YBW/Hooc=
github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo=
github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
@@ -911,6 +925,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5
github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY=
github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
+github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM=
github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94=
github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM=
@@ -1018,6 +1034,8 @@ github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xl
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
@@ -1097,6 +1115,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
+github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
@@ -1134,36 +1154,36 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 h1:qQH6fZZe31nBAG6INHph3z5ysDTPptyu0TR9uoJ1+ok=
-github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86/go.mod h1:WtWOoVQQEHxRHL2hNmuRrvDfYfQG/CioFNoa9Rr2mBE=
+github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix h1:DPJD++yKLSx0EfT+U14P8vLVxjXFmoIETiCO9lVwQo8=
+github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY=
github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3fePb3eCreuAnUA3RBj4=
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0 h1:/1L+v4SxUD2K5RMRbfByyLfePMAgQKeD0onSetPnGmA=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000 h1:6Zzr/R1j6P7bbvcUlt5WUIbItvrrGdGzIsiAzQezcwo=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000/go.mod h1:ncjd6mPZSRlelEqH/2KeLE1pU3UlqzBSn8RYkEoECzY=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550 h1:rRs74zjDJ7do5aYEXSU/sOnLnlbYCNqM8BrvEx/0NH8=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550/go.mod h1:yti7e1+G9hhkYhj+L5sVUULn9Bn3bBL5/AxaNqdJ5YQ=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e/go.mod h1:mUh5/woemsVaHgTorA080hrYmO3syBCmPdnWc/5dOqk=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db h1:N1RH1hSr2ACzOFc9hkCcjE8pRBTdcU3p8nsTJByaLes=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db/go.mod h1:yjb9d4q7+m8aGbjfTbkNoNuA4PeSxcUszsSZHDrvS0E=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 h1:aeiBdBHGY8QNftps+VqrIk6OnfeeOD5z4jrAabW4ZSc=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3/go.mod h1:AS6zY2BkcRwfiGzNabGbHhfrLSrXrcI/GmjnT4jQ5/s=
github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c=
github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 h1:onBe3DqNrbtOAzKS4PrPIiJX65BGo1aYiYZxFVEW+jc=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc h1:dssRwJhmzJkUN/OajaDj2GsxBn+Tupk3bI1BkPEoJg0=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc/go.mod h1:p8aUDfJeley6oer7y+Ucd3edOtRlMTnWg3mN6rhaLWo=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce h1:Mvpbr/Fi2IdU2EcmqCxhlCzs5ncnx+BwV80YweA4DZs=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce/go.mod h1:qq+nW0JDnCCGMf2c38ZHjH8xgkAQnXKighjJr5JdDNE=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 h1:tNS7U9lrxkFvEuyxQv11HHOiV9LPDGC9wYEy+yM/Jv4=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8/go.mod h1:EBrEgcdIbwepqguClkv8Ohy7CbyWSJaE4EC9aBJlQK0=
github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.13 h1:T0kbw07Vb6xUyA9MIJZfErMgWseWi1zf7cYvRpoq7ug=
github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.13/go.mod h1:1CKUOzoK+Ga19WuhRH9pxZ+qUUnrlIx108VEA6qSzeQ=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12 h1:NzZGjaqez21I3DU7objl3xExTH4fxYvzTqar8DC6360=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc=
@@ -1304,6 +1324,8 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
+github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
+github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1313,6 +1335,8 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U=
github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
@@ -1447,8 +1471,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1572,8 +1596,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1656,8 +1680,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1666,8 +1690,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1681,8 +1705,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff --git a/core/scripts/keystone/README.md b/core/scripts/keystone/README.md
index 9bf6adfff4e..f08f738cb78 100644
--- a/core/scripts/keystone/README.md
+++ b/core/scripts/keystone/README.md
@@ -51,7 +51,7 @@ If you want to redeploy all resources, then you'll want to do the following:
```bash
# From /crib
devspace purge --profile keystone # Remove all k8s resources
-./cribbit.sh crib- # Purge currently leaves some hanging resources, make a new namespace
+DEVSPACE_NAMESPACE=crib- crib init # Purge currently leaves some hanging resources, make a new namespace
devspace deploy --profile keysone --clean # Wipe any keystone related persisted data, like artefacts and caches.
```
diff --git a/core/scripts/keystone/src/01_deploy_contracts_cmd.go b/core/scripts/keystone/src/01_deploy_contracts_cmd.go
index 24fcaacd36c..14c8d989063 100644
--- a/core/scripts/keystone/src/01_deploy_contracts_cmd.go
+++ b/core/scripts/keystone/src/01_deploy_contracts_cmd.go
@@ -12,9 +12,9 @@ import (
"github.com/ethereum/go-ethereum/common"
helpers "github.com/smartcontractkit/chainlink/core/scripts/common"
- ksdeploy "github.com/smartcontractkit/chainlink/deployment/keystone"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ forwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0"
+ ocr3_capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0"
)
type deployedContracts struct {
@@ -157,7 +157,7 @@ func deploy(
func setOCR3Config(
env helpers.Environment,
- ocrConfig ksdeploy.OCR2OracleConfig,
+ ocrConfig changeset.OCR3OnchainConfig,
artefacts string,
) {
loadedContracts, err := LoadDeployedContracts(artefacts)
diff --git a/core/scripts/keystone/src/05_deploy_initialize_capabilities_registry.go b/core/scripts/keystone/src/05_deploy_initialize_capabilities_registry.go
index 166022ac753..b7fc9df2c88 100644
--- a/core/scripts/keystone/src/05_deploy_initialize_capabilities_registry.go
+++ b/core/scripts/keystone/src/05_deploy_initialize_capabilities_registry.go
@@ -20,7 +20,7 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind"
helpers "github.com/smartcontractkit/chainlink/core/scripts/common"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
type peer struct {
@@ -294,7 +294,7 @@ func (c *deployAndInitializeCapabilitiesRegistryCommand) Run(args []string) {
panic(innerErr)
}
- n.HashedCapabilityIds = [][32]byte{ocrid, ctid}
+ n.HashedCapabilityIds = [][32]byte{ocrid, ctid, aid}
nodes = append(nodes, n)
}
@@ -337,7 +337,7 @@ func (c *deployAndInitializeCapabilitiesRegistryCommand) Run(args []string) {
Config: ccfgb,
},
}
- _, err = reg.AddDON(env.Owner, ps, cfgs, true, true, 2)
+ _, err = reg.AddDON(env.Owner, ps, cfgs, true, true, 1)
if err != nil {
log.Printf("workflowDON: failed to AddDON: %s", err)
}
diff --git a/core/scripts/keystone/src/88_gen_jobspecs.go b/core/scripts/keystone/src/88_gen_jobspecs.go
index 4f59a89be2d..e88833c9865 100644
--- a/core/scripts/keystone/src/88_gen_jobspecs.go
+++ b/core/scripts/keystone/src/88_gen_jobspecs.go
@@ -7,7 +7,7 @@ import (
"strings"
helpers "github.com/smartcontractkit/chainlink/core/scripts/common"
- ksdeploy "github.com/smartcontractkit/chainlink/deployment/keystone"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
)
type spec []string
@@ -74,7 +74,7 @@ func replacePlaceholders(
chainID, p2pPort int64,
contractAddress, bootHost string,
- boot, node ksdeploy.NodeKeys,
+ boot, node changeset.NodeKeys,
) (output []string) {
chainIDStr := strconv.FormatInt(chainID, 10)
bootstrapper := fmt.Sprintf("%s@%s:%d", boot.P2PPeerID, bootHost, p2pPort)
diff --git a/core/scripts/keystone/src/88_gen_ocr3_config.go b/core/scripts/keystone/src/88_gen_ocr3_config.go
index 707616b833b..94217b07f4e 100644
--- a/core/scripts/keystone/src/88_gen_ocr3_config.go
+++ b/core/scripts/keystone/src/88_gen_ocr3_config.go
@@ -3,14 +3,14 @@ package src
import (
helpers "github.com/smartcontractkit/chainlink/core/scripts/common"
"github.com/smartcontractkit/chainlink/deployment"
- ksdeploy "github.com/smartcontractkit/chainlink/deployment/keystone"
+ ksdeploy "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
)
func mustReadConfig(fileName string) (output ksdeploy.TopLevelConfigSource) {
return mustParseJSON[ksdeploy.TopLevelConfigSource](fileName)
}
-func generateOCR3Config(nodeList string, configFile string, chainID int64, pubKeysPath string) ksdeploy.OCR2OracleConfig {
+func generateOCR3Config(nodeList string, configFile string, chainID int64, pubKeysPath string) ksdeploy.OCR3OnchainConfig {
topLevelCfg := mustReadConfig(configFile)
cfg := topLevelCfg.OracleConfig
nca := downloadNodePubKeys(nodeList, chainID, pubKeysPath)
diff --git a/core/scripts/keystone/src/99_fetch_keys.go b/core/scripts/keystone/src/99_fetch_keys.go
index 8899da95b11..056769dc714 100644
--- a/core/scripts/keystone/src/99_fetch_keys.go
+++ b/core/scripts/keystone/src/99_fetch_keys.go
@@ -13,17 +13,17 @@ import (
"github.com/urfave/cli"
helpers "github.com/smartcontractkit/chainlink/core/scripts/common"
- ksdeploy "github.com/smartcontractkit/chainlink/deployment/keystone"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
"github.com/smartcontractkit/chainlink/v2/core/cmd"
"github.com/smartcontractkit/chainlink/v2/core/web/presenters"
)
-func downloadNodePubKeys(nodeList string, chainID int64, pubKeysPath string) []ksdeploy.NodeKeys {
+func downloadNodePubKeys(nodeList string, chainID int64, pubKeysPath string) []changeset.NodeKeys {
// Check if file exists already, and if so, return the keys
if _, err := os.Stat(pubKeysPath); err == nil {
fmt.Println("Loading existing public keys at:", pubKeysPath)
- return mustParseJSON[[]ksdeploy.NodeKeys](pubKeysPath)
+ return mustParseJSON[[]changeset.NodeKeys](pubKeysPath)
}
nodes := downloadNodeAPICredentials(nodeList)
@@ -97,7 +97,7 @@ type ocr2Bundle struct {
ConfigPublicKey string `json:"configPublicKey"`
}
-func mustFetchNodesKeys(chainID int64, nodes []*node) (nca []ksdeploy.NodeKeys) {
+func mustFetchNodesKeys(chainID int64, nodes []*node) (nca []changeset.NodeKeys) {
for _, n := range nodes {
output := &bytes.Buffer{}
client, app := newApp(n, output)
@@ -209,7 +209,7 @@ func mustFetchNodesKeys(chainID int64, nodes []*node) (nca []ksdeploy.NodeKeys)
helpers.PanicErr(err)
output.Reset()
- nc := ksdeploy.NodeKeys{
+ nc := changeset.NodeKeys{
EthAddress: ethAddress,
AptosAccount: aptosAccount,
P2PPeerID: peerID,
diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go
index d8b9777cb5a..4004b86c341 100644
--- a/core/services/chainlink/application.go
+++ b/core/services/chainlink/application.go
@@ -307,10 +307,6 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
fetcher.Fetch, workflowstore.NewDBStore(opts.DS, lggr, clockwork.NewRealClock()), opts.CapabilitiesRegistry,
custmsg.NewLabeler(), clockwork.NewRealClock(), keys[0])
- loader := syncer.NewWorkflowRegistryContractLoader(lggr, cfg.Capabilities().WorkflowRegistry().Address(), func(ctx context.Context, bytes []byte) (syncer.ContractReader, error) {
- return relayer.NewContractReader(ctx, bytes)
- }, eventHandler)
-
globalLogger.Debugw("Creating WorkflowRegistrySyncer")
wfSyncer := syncer.NewWorkflowRegistry(
lggr,
@@ -322,7 +318,6 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
QueryCount: 100,
},
eventHandler,
- loader,
workflowDonNotifier,
)
diff --git a/core/services/chainlink/config_database.go b/core/services/chainlink/config_database.go
index fe10c63f71b..27e61479146 100644
--- a/core/services/chainlink/config_database.go
+++ b/core/services/chainlink/config_database.go
@@ -4,9 +4,10 @@ import (
"net/url"
"time"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
+
"github.com/smartcontractkit/chainlink/v2/core/config"
"github.com/smartcontractkit/chainlink/v2/core/config/toml"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
)
type backupConfig struct {
@@ -106,10 +107,13 @@ func (d *databaseConfig) DefaultQueryTimeout() time.Duration {
}
func (d *databaseConfig) URL() url.URL {
+ if d.s.URL == nil {
+ return url.URL{}
+ }
return *d.s.URL.URL()
}
-func (d *databaseConfig) Dialect() dialects.DialectName {
+func (d *databaseConfig) Dialect() pgcommon.DialectName {
return d.c.Dialect
}
diff --git a/core/services/chainlink/config_database_test.go b/core/services/chainlink/config_database_test.go
index b52d17452aa..f8f864f97ab 100644
--- a/core/services/chainlink/config_database_test.go
+++ b/core/services/chainlink/config_database_test.go
@@ -7,8 +7,9 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
+
"github.com/smartcontractkit/chainlink/v2/core/config"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
)
func TestDatabaseConfig(t *testing.T) {
@@ -21,31 +22,31 @@ URL = "postgresql://doesnotexist:justtopassvalidationtests@localhost:5432/chainl
require.NoError(t, err)
backup := cfg.Database().Backup()
- assert.Equal(t, backup.Dir(), "test/backup/dir")
- assert.Equal(t, backup.Frequency(), 1*time.Hour)
- assert.Equal(t, backup.Mode(), config.DatabaseBackupModeFull)
- assert.Equal(t, backup.OnVersionUpgrade(), true)
+ assert.Equal(t, "test/backup/dir", backup.Dir())
+ assert.Equal(t, 1*time.Hour, backup.Frequency())
+ assert.Equal(t, config.DatabaseBackupModeFull, backup.Mode())
+ assert.True(t, backup.OnVersionUpgrade())
assert.Nil(t, backup.URL())
db := cfg.Database()
- assert.Equal(t, db.DefaultIdleInTxSessionTimeout(), 1*time.Minute)
- assert.Equal(t, db.DefaultLockTimeout(), 1*time.Hour)
- assert.Equal(t, db.DefaultQueryTimeout(), 1*time.Second)
- assert.Equal(t, db.LogSQL(), true)
- assert.Equal(t, db.MaxIdleConns(), 7)
- assert.Equal(t, db.MaxOpenConns(), 13)
- assert.Equal(t, db.MigrateDatabase(), true)
- assert.Equal(t, db.Dialect(), dialects.Postgres)
+ assert.Equal(t, 1*time.Minute, db.DefaultIdleInTxSessionTimeout())
+ assert.Equal(t, 1*time.Hour, db.DefaultLockTimeout())
+ assert.Equal(t, 1*time.Second, db.DefaultQueryTimeout())
+ assert.True(t, db.LogSQL())
+ assert.Equal(t, 7, db.MaxIdleConns())
+ assert.Equal(t, 13, db.MaxOpenConns())
+ assert.True(t, db.MigrateDatabase())
+ assert.Equal(t, pgcommon.Postgres, db.Dialect())
url := db.URL()
assert.NotEqual(t, url.String(), "")
lock := db.Lock()
- assert.Equal(t, lock.LockingMode(), "none")
- assert.Equal(t, lock.LeaseDuration(), 1*time.Minute)
- assert.Equal(t, lock.LeaseRefreshInterval(), 1*time.Second)
+ assert.Equal(t, "none", lock.LockingMode())
+ assert.Equal(t, 1*time.Minute, lock.LeaseDuration())
+ assert.Equal(t, 1*time.Second, lock.LeaseRefreshInterval())
l := db.Listener()
- assert.Equal(t, l.MaxReconnectDuration(), 1*time.Minute)
- assert.Equal(t, l.MinReconnectInterval(), 5*time.Minute)
- assert.Equal(t, l.FallbackPollInterval(), 2*time.Minute)
+ assert.Equal(t, 1*time.Minute, l.MaxReconnectDuration())
+ assert.Equal(t, 5*time.Minute, l.MinReconnectInterval())
+ assert.Equal(t, 2*time.Minute, l.FallbackPollInterval())
}
diff --git a/core/services/chainlink/config_test.go b/core/services/chainlink/config_test.go
index 769005feb72..65ece5a88c0 100644
--- a/core/services/chainlink/config_test.go
+++ b/core/services/chainlink/config_test.go
@@ -654,6 +654,7 @@ func TestConfig_Marshal(t *testing.T) {
NoNewFinalizedHeadsThreshold: &hour,
Transactions: evmcfg.Transactions{
+ Enabled: ptr(true),
MaxInFlight: ptr[uint32](19),
MaxQueued: ptr[uint32](99),
ReaperInterval: &minute,
@@ -750,6 +751,7 @@ func TestConfig_Marshal(t *testing.T) {
TxTimeout: commoncfg.MustNewDuration(time.Hour),
TxRetryTimeout: commoncfg.MustNewDuration(time.Minute),
TxConfirmTimeout: commoncfg.MustNewDuration(time.Second),
+ TxExpirationRebroadcast: ptr(false),
TxRetentionTimeout: commoncfg.MustNewDuration(0 * time.Second),
SkipPreflight: ptr(true),
Commitment: ptr("banana"),
@@ -1118,6 +1120,7 @@ FinalizedBlockOffset = 16
NoNewFinalizedHeadsThreshold = '1h0m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = true
MaxInFlight = 19
MaxQueued = 99
@@ -1279,6 +1282,7 @@ OCR2CacheTTL = '1h0m0s'
TxTimeout = '1h0m0s'
TxRetryTimeout = '1m0s'
TxConfirmTimeout = '1s'
+TxExpirationRebroadcast = false
TxRetentionTimeout = '0s'
SkipPreflight = true
Commitment = 'banana'
diff --git a/core/services/chainlink/mocks/relayer_chain_interoperators.go b/core/services/chainlink/mocks/relayer_chain_interoperators.go
index 3ebe1411c19..bc30ede77ee 100644
--- a/core/services/chainlink/mocks/relayer_chain_interoperators.go
+++ b/core/services/chainlink/mocks/relayer_chain_interoperators.go
@@ -4,6 +4,7 @@ import (
"context"
"slices"
+ commonTypes "github.com/smartcontractkit/chainlink/v2/common/types"
services2 "github.com/smartcontractkit/chainlink/v2/core/services"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
@@ -69,6 +70,6 @@ func (f *FakeRelayerChainInteroperators) ChainStatus(ctx context.Context, id typ
panic("unimplemented")
}
-func (f *FakeRelayerChainInteroperators) ChainStatuses(ctx context.Context, offset, limit int) ([]types.ChainStatus, int, error) {
+func (f *FakeRelayerChainInteroperators) ChainStatuses(ctx context.Context, offset, limit int) ([]commonTypes.ChainStatusWithID, int, error) {
panic("unimplemented")
}
diff --git a/core/services/chainlink/relayer_chain_interoperators.go b/core/services/chainlink/relayer_chain_interoperators.go
index 1be6e9337d1..2fc671bfe6e 100644
--- a/core/services/chainlink/relayer_chain_interoperators.go
+++ b/core/services/chainlink/relayer_chain_interoperators.go
@@ -14,6 +14,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/relay"
+ commonTypes "github.com/smartcontractkit/chainlink/v2/common/types"
"github.com/smartcontractkit/chainlink/v2/core/chains"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
"github.com/smartcontractkit/chainlink/v2/core/services"
@@ -53,7 +54,7 @@ type LegacyChainer interface {
type ChainStatuser interface {
ChainStatus(ctx context.Context, id types.RelayID) (types.ChainStatus, error)
- ChainStatuses(ctx context.Context, offset, limit int) ([]types.ChainStatus, int, error)
+ ChainStatuses(ctx context.Context, offset, limit int) ([]commonTypes.ChainStatusWithID, int, error)
}
// NodesStatuser is an interface for node configuration and state.
@@ -261,9 +262,9 @@ func (rs *CoreRelayerChainInteroperators) ChainStatus(ctx context.Context, id ty
return lr.GetChainStatus(ctx)
}
-func (rs *CoreRelayerChainInteroperators) ChainStatuses(ctx context.Context, offset, limit int) ([]types.ChainStatus, int, error) {
+func (rs *CoreRelayerChainInteroperators) ChainStatuses(ctx context.Context, offset, limit int) ([]commonTypes.ChainStatusWithID, int, error) {
var (
- stats []types.ChainStatus
+ stats []commonTypes.ChainStatusWithID
totalErr error
)
rs.mu.Lock()
@@ -283,7 +284,7 @@ func (rs *CoreRelayerChainInteroperators) ChainStatuses(ctx context.Context, off
totalErr = errors.Join(totalErr, err)
continue
}
- stats = append(stats, stat)
+ stats = append(stats, commonTypes.ChainStatusWithID{ChainStatus: stat, RelayID: rid})
}
if totalErr != nil {
diff --git a/core/services/chainlink/testdata/config-full.toml b/core/services/chainlink/testdata/config-full.toml
index 47193f80184..6878e09c911 100644
--- a/core/services/chainlink/testdata/config-full.toml
+++ b/core/services/chainlink/testdata/config-full.toml
@@ -337,6 +337,7 @@ FinalizedBlockOffset = 16
NoNewFinalizedHeadsThreshold = '1h0m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = true
MaxInFlight = 19
MaxQueued = 99
@@ -498,6 +499,7 @@ OCR2CacheTTL = '1h0m0s'
TxTimeout = '1h0m0s'
TxRetryTimeout = '1m0s'
TxConfirmTimeout = '1s'
+TxExpirationRebroadcast = false
TxRetentionTimeout = '0s'
SkipPreflight = true
Commitment = 'banana'
diff --git a/core/services/chainlink/testdata/config-multi-chain-effective.toml b/core/services/chainlink/testdata/config-multi-chain-effective.toml
index 7e658b170db..ba7538cac04 100644
--- a/core/services/chainlink/testdata/config-multi-chain-effective.toml
+++ b/core/services/chainlink/testdata/config-multi-chain-effective.toml
@@ -320,6 +320,7 @@ FinalizedBlockOffset = 12
NoNewFinalizedHeadsThreshold = '9m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -430,6 +431,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -534,6 +536,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '6m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 5000
@@ -659,6 +662,7 @@ OCR2CacheTTL = '1m0s'
TxTimeout = '1m0s'
TxRetryTimeout = '10s'
TxConfirmTimeout = '30s'
+TxExpirationRebroadcast = false
TxRetentionTimeout = '0s'
SkipPreflight = true
Commitment = 'confirmed'
@@ -704,6 +708,7 @@ OCR2CacheTTL = '1m0s'
TxTimeout = '1m0s'
TxRetryTimeout = '10s'
TxConfirmTimeout = '30s'
+TxExpirationRebroadcast = false
TxRetentionTimeout = '0s'
SkipPreflight = true
Commitment = 'confirmed'
diff --git a/core/services/feeds/models.go b/core/services/feeds/models.go
index 93dddd86dae..a6cf103b4e9 100644
--- a/core/services/feeds/models.go
+++ b/core/services/feeds/models.go
@@ -12,6 +12,7 @@ import (
"gopkg.in/guregu/null.v4"
proto "github.com/smartcontractkit/chainlink-protos/orchestrator/feedsmanager"
+
"github.com/smartcontractkit/chainlink/v2/core/utils/crypto"
)
@@ -82,6 +83,7 @@ const (
ChainTypeEVM ChainType = "EVM"
ChainTypeSolana ChainType = "SOLANA"
ChainTypeStarknet ChainType = "STARKNET"
+ ChainTypeTron ChainType = "TRON"
)
func NewChainType(s string) (ChainType, error) {
@@ -94,6 +96,8 @@ func NewChainType(s string) (ChainType, error) {
return ChainTypeSolana, nil
case "APTOS":
return ChainTypeAptos, nil
+ case "TRON":
+ return ChainTypeTron, nil
default:
return ChainTypeUnknown, errors.New("invalid chain type")
}
diff --git a/core/services/feeds/models_test.go b/core/services/feeds/models_test.go
index 13567281735..d0d4382b055 100644
--- a/core/services/feeds/models_test.go
+++ b/core/services/feeds/models_test.go
@@ -28,6 +28,11 @@ func Test_NewChainType(t *testing.T) {
give: "STARKNET",
want: ChainTypeStarknet,
},
+ {
+ name: "Tron Chain Type",
+ give: "TRON",
+ want: ChainTypeTron,
+ },
{
name: "Invalid Chain Type",
give: "",
diff --git a/core/services/fluxmonitorv2/flux_monitor_test.go b/core/services/fluxmonitorv2/flux_monitor_test.go
index 88b364cdeb3..150db269e45 100644
--- a/core/services/fluxmonitorv2/flux_monitor_test.go
+++ b/core/services/fluxmonitorv2/flux_monitor_test.go
@@ -150,7 +150,7 @@ type setupOptions struct {
// functional options to configure the setup
func setup(t *testing.T, ds sqlutil.DataSource, optionFns ...func(*setupOptions)) (*fluxmonitorv2.FluxMonitor, *testMocks) {
t.Helper()
- testutils.SkipShort(t, "long test")
+ tests.SkipShort(t, "long test")
tm := setupMocks(t)
options := setupOptions{
diff --git a/core/services/fluxmonitorv2/integrations_test.go b/core/services/fluxmonitorv2/integrations_test.go
index 1d77b694cbe..d30ff4479a8 100644
--- a/core/services/fluxmonitorv2/integrations_test.go
+++ b/core/services/fluxmonitorv2/integrations_test.go
@@ -25,6 +25,7 @@ import (
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
"github.com/smartcontractkit/chainlink/v2/core/bridges"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
@@ -95,7 +96,7 @@ func WithMinMaxSubmission(min, max *big.Int) func(cfg *fluxAggregatorUniverseCon
// arguments match the arguments of the same name in the FluxAggregator
// constructor.
func setupFluxAggregatorUniverse(t *testing.T, configOptions ...func(cfg *fluxAggregatorUniverseConfig)) fluxAggregatorUniverse {
- testutils.SkipShort(t, "VRFCoordinatorV2Universe")
+ tests.SkipShort(t, "VRFCoordinatorV2Universe")
cfg := &fluxAggregatorUniverseConfig{
MinSubmission: big.NewInt(0),
MaxSubmission: big.NewInt(100000000000),
diff --git a/core/services/gateway/connector/connector.go b/core/services/gateway/connector/connector.go
index a8d356478e9..cab123d4ce5 100644
--- a/core/services/gateway/connector/connector.go
+++ b/core/services/gateway/connector/connector.go
@@ -28,13 +28,14 @@ type GatewayConnector interface {
AddHandler(methods []string, handler GatewayConnectorHandler) error
// SendToGateway takes a signed message as argument and sends it to the specified gateway
- SendToGateway(ctx context.Context, gatewayId string, msg *api.Message) error
+ SendToGateway(ctx context.Context, gatewayID string, msg *api.Message) error
// SignAndSendToGateway signs the message and sends the message to the specified gateway
SignAndSendToGateway(ctx context.Context, gatewayID string, msg *api.MessageBody) error
// GatewayIDs returns the list of Gateway IDs
GatewayIDs() []string
// DonID returns the DON ID
DonID() string
+ AwaitConnection(ctx context.Context, gatewayID string) error
}
// Signer implementation needs to be provided by a GatewayConnector user (node)
@@ -78,12 +79,30 @@ func (c *gatewayConnector) HealthReport() map[string]error {
func (c *gatewayConnector) Name() string { return c.lggr.Name() }
type gatewayState struct {
+ // signal channel is closed once the gateway is connected
+ signalCh chan struct{}
+
conn network.WSConnectionWrapper
config ConnectorGatewayConfig
url *url.URL
wsClient network.WebSocketClient
}
+// A gatewayState is connected when the signal channel is closed
+func (gs *gatewayState) signal() {
+ close(gs.signalCh)
+}
+
+// awaitConn blocks until the gateway is connected or the context is done
+func (gs *gatewayState) awaitConn(ctx context.Context) error {
+ select {
+ case <-ctx.Done():
+ return fmt.Errorf("await connection failed: %w", ctx.Err())
+ case <-gs.signalCh:
+ return nil
+ }
+}
+
func NewGatewayConnector(config *ConnectorConfig, signer Signer, clock clockwork.Clock, lggr logger.Logger) (GatewayConnector, error) {
if config == nil || signer == nil || clock == nil || lggr == nil {
return nil, errors.New("nil dependency")
@@ -125,6 +144,7 @@ func NewGatewayConnector(config *ConnectorConfig, signer Signer, clock clockwork
config: gw,
url: parsedURL,
wsClient: network.NewWebSocketClient(config.WsClientConfig, connector, lggr),
+ signalCh: make(chan struct{}),
}
gateways[gw.Id] = gateway
urlToId[gw.URL] = gw.Id
@@ -150,17 +170,25 @@ func (c *gatewayConnector) AddHandler(methods []string, handler GatewayConnector
return nil
}
-func (c *gatewayConnector) SendToGateway(ctx context.Context, gatewayId string, msg *api.Message) error {
+func (c *gatewayConnector) AwaitConnection(ctx context.Context, gatewayID string) error {
+ gateway, ok := c.gateways[gatewayID]
+ if !ok {
+ return fmt.Errorf("invalid Gateway ID %s", gatewayID)
+ }
+ return gateway.awaitConn(ctx)
+}
+
+func (c *gatewayConnector) SendToGateway(ctx context.Context, gatewayID string, msg *api.Message) error {
data, err := c.codec.EncodeResponse(msg)
if err != nil {
- return fmt.Errorf("error encoding response for gateway %s: %v", gatewayId, err)
+ return fmt.Errorf("error encoding response for gateway %s: %w", gatewayID, err)
}
- gateway, ok := c.gateways[gatewayId]
+ gateway, ok := c.gateways[gatewayID]
if !ok {
- return fmt.Errorf("invalid Gateway ID %s", gatewayId)
+ return fmt.Errorf("invalid Gateway ID %s", gatewayID)
}
if gateway.conn == nil {
- return fmt.Errorf("connector not started")
+ return errors.New("connector not started")
}
return gateway.conn.Write(ctx, websocket.BinaryMessage, data)
}
@@ -242,10 +270,15 @@ func (c *gatewayConnector) reconnectLoop(gatewayState *gatewayState) {
} else {
c.lggr.Infow("connected successfully", "url", gatewayState.url)
closeCh := gatewayState.conn.Reset(conn)
+ gatewayState.signal()
<-closeCh
c.lggr.Infow("connection closed", "url", gatewayState.url)
+
// reset backoff
redialBackoff = utils.NewRedialBackoff()
+
+ // reset signal channel
+ gatewayState.signalCh = make(chan struct{})
}
select {
case <-c.shutdownCh:
diff --git a/core/services/gateway/connector/mocks/gateway_connector.go b/core/services/gateway/connector/mocks/gateway_connector.go
index 183fc949cd5..ba5c2213b5f 100644
--- a/core/services/gateway/connector/mocks/gateway_connector.go
+++ b/core/services/gateway/connector/mocks/gateway_connector.go
@@ -73,6 +73,53 @@ func (_c *GatewayConnector_AddHandler_Call) RunAndReturn(run func([]string, conn
return _c
}
+// AwaitConnection provides a mock function with given fields: ctx, gatewayID
+func (_m *GatewayConnector) AwaitConnection(ctx context.Context, gatewayID string) error {
+ ret := _m.Called(ctx, gatewayID)
+
+ if len(ret) == 0 {
+ panic("no return value specified for AwaitConnection")
+ }
+
+ var r0 error
+ if rf, ok := ret.Get(0).(func(context.Context, string) error); ok {
+ r0 = rf(ctx, gatewayID)
+ } else {
+ r0 = ret.Error(0)
+ }
+
+ return r0
+}
+
+// GatewayConnector_AwaitConnection_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AwaitConnection'
+type GatewayConnector_AwaitConnection_Call struct {
+ *mock.Call
+}
+
+// AwaitConnection is a helper method to define mock.On call
+// - ctx context.Context
+// - gatewayID string
+func (_e *GatewayConnector_Expecter) AwaitConnection(ctx interface{}, gatewayID interface{}) *GatewayConnector_AwaitConnection_Call {
+ return &GatewayConnector_AwaitConnection_Call{Call: _e.mock.On("AwaitConnection", ctx, gatewayID)}
+}
+
+func (_c *GatewayConnector_AwaitConnection_Call) Run(run func(ctx context.Context, gatewayID string)) *GatewayConnector_AwaitConnection_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(string))
+ })
+ return _c
+}
+
+func (_c *GatewayConnector_AwaitConnection_Call) Return(_a0 error) *GatewayConnector_AwaitConnection_Call {
+ _c.Call.Return(_a0)
+ return _c
+}
+
+func (_c *GatewayConnector_AwaitConnection_Call) RunAndReturn(run func(context.Context, string) error) *GatewayConnector_AwaitConnection_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// ChallengeResponse provides a mock function with given fields: _a0, challenge
func (_m *GatewayConnector) ChallengeResponse(_a0 *url.URL, challenge []byte) ([]byte, error) {
ret := _m.Called(_a0, challenge)
@@ -464,9 +511,9 @@ func (_c *GatewayConnector_Ready_Call) RunAndReturn(run func() error) *GatewayCo
return _c
}
-// SendToGateway provides a mock function with given fields: ctx, gatewayId, msg
-func (_m *GatewayConnector) SendToGateway(ctx context.Context, gatewayId string, msg *api.Message) error {
- ret := _m.Called(ctx, gatewayId, msg)
+// SendToGateway provides a mock function with given fields: ctx, gatewayID, msg
+func (_m *GatewayConnector) SendToGateway(ctx context.Context, gatewayID string, msg *api.Message) error {
+ ret := _m.Called(ctx, gatewayID, msg)
if len(ret) == 0 {
panic("no return value specified for SendToGateway")
@@ -474,7 +521,7 @@ func (_m *GatewayConnector) SendToGateway(ctx context.Context, gatewayId string,
var r0 error
if rf, ok := ret.Get(0).(func(context.Context, string, *api.Message) error); ok {
- r0 = rf(ctx, gatewayId, msg)
+ r0 = rf(ctx, gatewayID, msg)
} else {
r0 = ret.Error(0)
}
@@ -489,13 +536,13 @@ type GatewayConnector_SendToGateway_Call struct {
// SendToGateway is a helper method to define mock.On call
// - ctx context.Context
-// - gatewayId string
+// - gatewayID string
// - msg *api.Message
-func (_e *GatewayConnector_Expecter) SendToGateway(ctx interface{}, gatewayId interface{}, msg interface{}) *GatewayConnector_SendToGateway_Call {
- return &GatewayConnector_SendToGateway_Call{Call: _e.mock.On("SendToGateway", ctx, gatewayId, msg)}
+func (_e *GatewayConnector_Expecter) SendToGateway(ctx interface{}, gatewayID interface{}, msg interface{}) *GatewayConnector_SendToGateway_Call {
+ return &GatewayConnector_SendToGateway_Call{Call: _e.mock.On("SendToGateway", ctx, gatewayID, msg)}
}
-func (_c *GatewayConnector_SendToGateway_Call) Run(run func(ctx context.Context, gatewayId string, msg *api.Message)) *GatewayConnector_SendToGateway_Call {
+func (_c *GatewayConnector_SendToGateway_Call) Run(run func(ctx context.Context, gatewayID string, msg *api.Message)) *GatewayConnector_SendToGateway_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(string), args[2].(*api.Message))
})
diff --git a/core/services/job/job_orm_test.go b/core/services/job/job_orm_test.go
index fd54a39d431..27223e0d706 100644
--- a/core/services/job/job_orm_test.go
+++ b/core/services/job/job_orm_test.go
@@ -43,6 +43,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocrbootstrap"
"github.com/smartcontractkit/chainlink/v2/core/services/pipeline"
"github.com/smartcontractkit/chainlink/v2/core/services/relay"
+ "github.com/smartcontractkit/chainlink/v2/core/services/streams"
"github.com/smartcontractkit/chainlink/v2/core/services/vrf/vrfcommon"
"github.com/smartcontractkit/chainlink/v2/core/services/webhook"
"github.com/smartcontractkit/chainlink/v2/core/services/workflows/syncer"
@@ -444,6 +445,18 @@ func TestORM_DeleteJob_DeletesAssociatedRecords(t *testing.T) {
cltest.AssertCount(t, db, "jobs", 0)
})
+ t.Run("it creates and deletes records for stream jobs", func(t *testing.T) {
+ ctx := testutils.Context(t)
+ jb, err := streams.ValidatedStreamSpec(testspecs.GenerateStreamSpec(testspecs.StreamSpecParams{Name: "Test-stream", StreamID: 1}).Toml())
+ require.NoError(t, err)
+ err = jobORM.CreateJob(ctx, &jb)
+ require.NoError(t, err)
+ cltest.AssertCount(t, db, "jobs", 1)
+ err = jobORM.DeleteJob(ctx, jb.ID, jb.Type)
+ require.NoError(t, err)
+ cltest.AssertCount(t, db, "jobs", 0)
+ })
+
t.Run("does not allow to delete external initiators if they have referencing external_initiator_webhook_specs", func(t *testing.T) {
// create new db because this will rollback transaction and poison it
db := pgtest.NewSqlxDB(t)
diff --git a/core/services/job/orm.go b/core/services/job/orm.go
index 38e3fa492ce..cfd8060d60c 100644
--- a/core/services/job/orm.go
+++ b/core/services/job/orm.go
@@ -747,6 +747,7 @@ func (o *orm) DeleteJob(ctx context.Context, id int32, jobType Type) error {
Workflow: `DELETE FROM workflow_specs WHERE id in (SELECT workflow_spec_id FROM deleted_jobs)`,
StandardCapabilities: `DELETE FROM standardcapabilities_specs WHERE id in (SELECT standard_capabilities_spec_id FROM deleted_jobs)`,
CCIP: `DELETE FROM ccip_specs WHERE id in (SELECT ccip_spec_id FROM deleted_jobs)`,
+ Stream: ``,
}
q, ok := queries[jobType]
if !ok {
@@ -757,7 +758,7 @@ func (o *orm) DeleteJob(ctx context.Context, id int32, jobType Type) error {
// and this query was taking ~40secs.
ctx, cancel := context.WithTimeout(sqlutil.WithoutDefaultTimeout(ctx), time.Minute)
defer cancel()
- query := fmt.Sprintf(`
+ query := `
WITH deleted_jobs AS (
DELETE FROM jobs WHERE id = $1 RETURNING
id,
@@ -775,15 +776,19 @@ func (o *orm) DeleteJob(ctx context.Context, id int32, jobType Type) error {
gateway_spec_id,
workflow_spec_id,
standard_capabilities_spec_id,
- ccip_spec_id
- ),
- deleted_specific_specs AS (
- %s
- ),
+ ccip_spec_id,
+ stream_id
+ ),`
+ if len(q) > 0 {
+ query += fmt.Sprintf(`deleted_specific_specs AS (
+ %s
+ ),`, q)
+ }
+ query += `
deleted_job_pipeline_specs AS (
DELETE FROM job_pipeline_specs WHERE job_id IN (SELECT id FROM deleted_jobs) RETURNING pipeline_spec_id
)
- DELETE FROM pipeline_specs WHERE id IN (SELECT pipeline_spec_id FROM deleted_job_pipeline_specs)`, q)
+ DELETE FROM pipeline_specs WHERE id IN (SELECT pipeline_spec_id FROM deleted_job_pipeline_specs)`
res, err := o.ds.ExecContext(ctx, query, id)
if err != nil {
return errors.Wrap(err, "DeleteJob failed to delete job")
diff --git a/core/services/llo/delegate.go b/core/services/llo/delegate.go
index ba4ddbb8fb0..0c7d539427e 100644
--- a/core/services/llo/delegate.go
+++ b/core/services/llo/delegate.go
@@ -69,12 +69,12 @@ type DelegateConfig struct {
// One Oracle will be started for each ContractConfigTracker
ContractConfigTrackers []ocr2types.ContractConfigTracker
ContractTransmitter ocr3types.ContractTransmitter[llotypes.ReportInfo]
- Database ocr3types.Database
OCR3MonitoringEndpoint ocrcommontypes.MonitoringEndpoint
OffchainConfigDigester ocr2types.OffchainConfigDigester
OffchainKeyring ocr2types.OffchainKeyring
OnchainKeyring ocr3types.OnchainKeyring[llotypes.ReportInfo]
LocalConfig ocr2types.LocalConfig
+ NewOCR3DB func(pluginID int32) ocr3types.Database
}
func NewDelegate(cfg DelegateConfig) (job.ServiceCtx, error) {
@@ -146,7 +146,7 @@ func (d *delegate) Start(ctx context.Context) error {
V2Bootstrappers: d.cfg.V2Bootstrappers,
ContractConfigTracker: configTracker,
ContractTransmitter: d.cfg.ContractTransmitter,
- Database: d.cfg.Database,
+ Database: d.cfg.NewOCR3DB(int32(i)), // //nolint:gosec // G115 // impossible due to check on line 119
LocalConfig: d.cfg.LocalConfig,
Logger: ocrLogger,
MonitoringEndpoint: d.cfg.OCR3MonitoringEndpoint,
diff --git a/core/services/llo/mercurytransmitter/orm.go b/core/services/llo/mercurytransmitter/orm.go
index 045161395b5..f557e2293a5 100644
--- a/core/services/llo/mercurytransmitter/orm.go
+++ b/core/services/llo/mercurytransmitter/orm.go
@@ -72,7 +72,7 @@ func (o *orm) Insert(ctx context.Context, transmissions []*Transmission) error {
DonID: o.donID,
ServerURL: t.ServerURL,
ConfigDigest: t.ConfigDigest,
- SeqNr: int64(t.SeqNr), //nolint:gosec // G115 false positive
+ SeqNr: int64(t.SeqNr),
Report: t.Report.Report,
LifecycleStage: string(t.Report.Info.LifeCycleStage),
ReportFormat: uint32(t.Report.Info.ReportFormat),
diff --git a/core/services/llo/mercurytransmitter/server.go b/core/services/llo/mercurytransmitter/server.go
index 4e97c0483b3..3ce2b0a4b4a 100644
--- a/core/services/llo/mercurytransmitter/server.go
+++ b/core/services/llo/mercurytransmitter/server.go
@@ -62,6 +62,22 @@ var (
},
[]string{"donID", "serverURL", "code"},
)
+ promTransmitConcurrentTransmitGauge = promauto.NewGaugeVec(prometheus.GaugeOpts{
+ Namespace: "llo",
+ Subsystem: "mercurytransmitter",
+ Name: "concurrent_transmit_gauge",
+ Help: "Gauge that measures the number of transmit threads currently waiting on a remote transmit call. You may wish to alert if this exceeds some number for a given period of time, or if it ever reaches its max.",
+ },
+ []string{"donID", "serverURL"},
+ )
+ promTransmitConcurrentDeleteGauge = prometheus.NewGaugeVec(prometheus.GaugeOpts{
+ Namespace: "llo",
+ Subsystem: "mercurytransmitter",
+ Name: "concurrent_delete_gauge",
+ Help: "Gauge that measures the number of delete threads currently waiting on a delete call to the DB. You may wish to alert if this exceeds some number for a given period of time, or if it ever reaches its max.",
+ },
+ []string{"donID", "serverURL"},
+ )
)
type ReportPacker interface {
@@ -87,12 +103,14 @@ type server struct {
evmPremiumLegacyPacker ReportPacker
jsonPacker ReportPacker
- transmitSuccessCount prometheus.Counter
- transmitDuplicateCount prometheus.Counter
- transmitConnectionErrorCount prometheus.Counter
- transmitQueueDeleteErrorCount prometheus.Counter
- transmitQueueInsertErrorCount prometheus.Counter
- transmitQueuePushErrorCount prometheus.Counter
+ transmitSuccessCount prometheus.Counter
+ transmitDuplicateCount prometheus.Counter
+ transmitConnectionErrorCount prometheus.Counter
+ transmitQueueDeleteErrorCount prometheus.Counter
+ transmitQueueInsertErrorCount prometheus.Counter
+ transmitQueuePushErrorCount prometheus.Counter
+ transmitConcurrentTransmitGauge prometheus.Gauge
+ transmitConcurrentDeleteGauge prometheus.Gauge
transmitThreadBusyCount atomic.Int32
deleteThreadBusyCount atomic.Int32
@@ -130,6 +148,8 @@ func newServer(lggr logger.Logger, verboseLogging bool, cfg QueueConfig, client
promTransmitQueueDeleteErrorCount.WithLabelValues(donIDStr, serverURL),
promTransmitQueueInsertErrorCount.WithLabelValues(donIDStr, serverURL),
promTransmitQueuePushErrorCount.WithLabelValues(donIDStr, serverURL),
+ promTransmitConcurrentTransmitGauge.WithLabelValues(donIDStr, serverURL),
+ promTransmitConcurrentDeleteGauge.WithLabelValues(donIDStr, serverURL),
atomic.Int32{},
atomic.Int32{},
}
@@ -161,7 +181,7 @@ func (s *server) runDeleteQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup
select {
case hash := <-s.deleteQueue:
for {
- s.deleteThreadBusyCount.Add(1)
+ s.deleteThreadBusyCountInc()
if err := s.pm.orm.Delete(ctx, [][32]byte{hash}); err != nil {
s.lggr.Errorw("Failed to delete transmission record", "err", err, "transmissionHash", hash)
s.transmitQueueDeleteErrorCount.Inc()
@@ -170,7 +190,7 @@ func (s *server) runDeleteQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup
// Wait a backoff duration before trying to delete again
continue
case <-stopCh:
- s.deleteThreadBusyCount.Add(-1)
+ s.deleteThreadBusyCountDec()
// abort and return immediately on stop even if items remain in queue
return
}
@@ -179,7 +199,7 @@ func (s *server) runDeleteQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup
}
// success
b.Reset()
- s.deleteThreadBusyCount.Add(-1)
+ s.deleteThreadBusyCountDec()
case <-stopCh:
// abort and return immediately on stop even if items remain in queue
return
@@ -187,6 +207,23 @@ func (s *server) runDeleteQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup
}
}
+func (s *server) transmitThreadBusyCountInc() {
+ val := s.transmitThreadBusyCount.Add(1)
+ s.transmitConcurrentTransmitGauge.Set(float64(val))
+}
+func (s *server) transmitThreadBusyCountDec() {
+ val := s.transmitThreadBusyCount.Add(-1)
+ s.transmitConcurrentTransmitGauge.Set(float64(val))
+}
+func (s *server) deleteThreadBusyCountInc() {
+ val := s.deleteThreadBusyCount.Add(1)
+ s.transmitConcurrentDeleteGauge.Set(float64(val))
+}
+func (s *server) deleteThreadBusyCountDec() {
+ val := s.deleteThreadBusyCount.Add(-1)
+ s.transmitConcurrentDeleteGauge.Set(float64(val))
+}
+
func (s *server) runQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup, donIDStr string) {
defer wg.Done()
// Exponential backoff with very short retry interval (since latency is a priority)
@@ -208,8 +245,8 @@ func (s *server) runQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup, donI
return false
}
- s.transmitThreadBusyCount.Add(1)
- defer s.transmitThreadBusyCount.Add(-1)
+ s.transmitThreadBusyCountInc()
+ defer s.transmitThreadBusyCountDec()
req, res, err := func(ctx context.Context) (*pb.TransmitRequest, *pb.TransmitResponse, error) {
ctx, cancelFn := context.WithTimeout(ctx, utils.WithJitter(s.transmitTimeout))
diff --git a/core/services/llo/mercurytransmitter/transmitter.go b/core/services/llo/mercurytransmitter/transmitter.go
index 8e60bf938a5..23aa4b79e58 100644
--- a/core/services/llo/mercurytransmitter/transmitter.go
+++ b/core/services/llo/mercurytransmitter/transmitter.go
@@ -116,7 +116,6 @@ type transmitter struct {
orm ORM
servers map[string]*server
registerer prometheus.Registerer
- collectors []prometheus.Collector
donID uint32
fromAccount string
@@ -155,7 +154,6 @@ func newTransmitter(opts Opts) *transmitter {
opts.ORM,
servers,
opts.Registerer,
- nil,
opts.DonID,
fmt.Sprintf("%x", opts.FromAccount),
make(services.StopChan),
@@ -194,31 +192,6 @@ func (mt *transmitter) Start(ctx context.Context) (err error) {
go s.runDeleteQueueLoop(mt.stopCh, mt.wg)
go s.runQueueLoop(mt.stopCh, mt.wg, donIDStr)
}
- mt.collectors = append(mt.collectors, prometheus.NewGaugeFunc(
- prometheus.GaugeOpts{
- Namespace: "llo",
- Subsystem: "mercurytransmitter",
- Name: "concurrent_transmit_gauge",
- Help: "Gauge that measures the number of transmit threads currently waiting on a remote transmit call. You may wish to alert if this exceeds some number for a given period of time, or if it ever reaches its max.",
- ConstLabels: prometheus.Labels{"donID": donIDStr, "serverURL": s.url, "maxConcurrentTransmits": strconv.FormatInt(int64(nThreads), 10)},
- }, func() float64 {
- return float64(s.transmitThreadBusyCount.Load())
- }))
- mt.collectors = append(mt.collectors, prometheus.NewGaugeFunc(
- prometheus.GaugeOpts{
- Namespace: "llo",
- Subsystem: "mercurytransmitter",
- Name: "concurrent_delete_gauge",
- Help: "Gauge that measures the number of delete threads currently waiting on a delete call to the DB. You may wish to alert if this exceeds some number for a given period of time, or if it ever reaches its max.",
- ConstLabels: prometheus.Labels{"donID": donIDStr, "serverURL": s.url, "maxConcurrentDeletes": strconv.FormatInt(int64(nThreads), 10)},
- }, func() float64 {
- return float64(s.deleteThreadBusyCount.Load())
- }))
- for _, c := range mt.collectors {
- if err := mt.registerer.Register(c); err != nil {
- return err
- }
- }
}
if err := (&services.MultiStart{}).Start(ctx, startClosers...); err != nil {
return err
@@ -250,12 +223,7 @@ func (mt *transmitter) Close() error {
closers = append(closers, s.pm)
closers = append(closers, s.c)
}
- err := services.CloseAll(closers...)
- // Unregister all the gauge funcs
- for _, c := range mt.collectors {
- mt.registerer.Unregister(c)
- }
- return err
+ return services.CloseAll(closers...)
})
}
diff --git a/core/services/llo/onchain_channel_definition_cache.go b/core/services/llo/onchain_channel_definition_cache.go
index 78078d5c36e..461c309a73a 100644
--- a/core/services/llo/onchain_channel_definition_cache.go
+++ b/core/services/llo/onchain_channel_definition_cache.go
@@ -279,7 +279,6 @@ func (c *channelDefinitionCache) readLogs(ctx context.Context) (err error) {
c.newLogCh <- unpacked
}
c.newLogMu.Unlock()
-
}
return nil
diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go
index edcc816bf04..13094fefb1a 100644
--- a/core/services/ocr2/delegate.go
+++ b/core/services/ocr2/delegate.go
@@ -683,9 +683,9 @@ func (d *Delegate) newServicesGenericPlugin(
providerClientConn = providerConn.ClientConn()
} else {
// We chose to deal with the difference between a LOOP provider and an embedded provider here rather than
- //in NewServerAdapter because this has a smaller blast radius, as the scope of this workaround is to
- //enable the medianpoc for EVM and not touch the other providers.
- //TODO: remove this workaround when the EVM relayer is running inside of an LOOPP
+ // in NewServerAdapter because this has a smaller blast radius, as the scope of this workaround is to
+ // enable the medianpoc for EVM and not touch the other providers.
+ // TODO: remove this workaround when the EVM relayer is running inside of an LOOPP
d.lggr.Info("provider is not a LOOPP provider, switching to provider server")
ps, err2 := loop.NewProviderServer(provider, types.OCR2PluginType(pCfg.ProviderType), d.lggr)
@@ -885,7 +885,8 @@ func (d *Delegate) newServicesMercury(
lc.ContractConfigTrackerPollInterval = 1 * time.Second // This is the fastest that libocr supports. See: https://github.com/smartcontractkit/offchain-reporting/pull/520
- ocrLogger := ocrcommon.NewOCRWrapper(lggr, d.cfg.OCR2().TraceLogging(), func(ctx context.Context, msg string) {
+ // Disable OCR debug+info logging for legacy mercury jobs unless tracelogging is enabled, because its simply too verbose (150 jobs => ~50k logs per second)
+ ocrLogger := ocrcommon.NewOCRWrapper(llo.NewSuppressedLogger(lggr, d.cfg.OCR2().TraceLogging()), d.cfg.OCR2().TraceLogging(), func(ctx context.Context, msg string) {
lggr.ErrorIf(d.jobORM.RecordError(ctx, jb.ID, msg), "unable to record error")
})
@@ -1055,7 +1056,6 @@ func (d *Delegate) newServicesLLO(
V2Bootstrappers: bootstrapPeers,
ContractTransmitter: provider.ContractTransmitter(),
ContractConfigTrackers: provider.ContractConfigTrackers(),
- Database: ocrDB,
LocalConfig: lc,
OCR3MonitoringEndpoint: d.monitoringEndpointGen.GenMonitoringEndpoint(rid.Network, rid.ChainID, telemetryContractID, synchronization.OCR3Mercury),
OffchainConfigDigester: provider.OffchainConfigDigester(),
@@ -1064,6 +1064,9 @@ func (d *Delegate) newServicesLLO(
// Enable verbose logging if either Mercury.VerboseLogging is on or OCR2.TraceLogging is on
ReportingPluginConfig: datastreamsllo.Config{VerboseLogging: d.cfg.Mercury().VerboseLogging() || d.cfg.OCR2().TraceLogging()},
+ NewOCR3DB: func(pluginID int32) ocr3types.Database {
+ return NewDB(d.ds, spec.ID, pluginID, lggr)
+ },
}
oracle, err := llo.NewDelegate(cfg)
if err != nil {
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/gashelpers_test.go b/core/services/ocr2/plugins/ccip/ccipexec/gashelpers_test.go
index afcd580e24b..42a62a1be99 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/gashelpers_test.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/gashelpers_test.go
@@ -168,12 +168,6 @@ func TestWaitBoostedFee(t *testing.T) {
boosted := waitBoostedFee(tc.sendTimeDiff, tc.fee, tc.relativeBoostPerWaitHour)
diff := big.NewInt(0).Sub(boosted, tc.fee)
assert.Equal(t, diff, tc.diff)
- // we check that the actual diff is approximately equals to expected diff,
- // as we might get slightly different results locally vs. CI therefore normal Equal() would be unstable
- // diffUpperLimit := big.NewInt(0).Add(tc.diff, big.NewInt(1e9))
- //diffLowerLimit := big.NewInt(0).Add(tc.diff, big.NewInt(-1e9))
- //require.Equalf(t, -1, diff.Cmp(diffUpperLimit), "actual diff (%s) is larger than expected (%s)", diff.String(), diffUpperLimit.String())
- //require.Equal(t, 1, diff.Cmp(diffLowerLimit), "actual diff (%s) is smaller than expected (%s)", diff.String(), diffLowerLimit.String())
})
}
}
diff --git a/core/services/ocr2/plugins/ccip/clo_ccip_integration_test.go b/core/services/ocr2/plugins/ccip/clo_ccip_integration_test.go
index daac8cc37f9..52eb15c77d2 100644
--- a/core/services/ocr2/plugins/ccip/clo_ccip_integration_test.go
+++ b/core/services/ocr2/plugins/ccip/clo_ccip_integration_test.go
@@ -22,6 +22,7 @@ import (
)
func Test_CLOSpecApprovalFlow_pipeline(t *testing.T) {
+ t.Parallel()
ccipTH := integrationtesthelpers.SetupCCIPIntegrationTH(
t,
testhelpers.SourceChainID,
@@ -40,6 +41,7 @@ func Test_CLOSpecApprovalFlow_pipeline(t *testing.T) {
}
func Test_CLOSpecApprovalFlow_dynamicPriceGetter(t *testing.T) {
+ t.Parallel()
ccipTH := integrationtesthelpers.SetupCCIPIntegrationTH(
t,
testhelpers.SourceChainID,
diff --git a/core/services/ocr2/plugins/ccip/integration_test.go b/core/services/ocr2/plugins/ccip/integration_test.go
index e644a3e6f4a..b116a470363 100644
--- a/core/services/ocr2/plugins/ccip/integration_test.go
+++ b/core/services/ocr2/plugins/ccip/integration_test.go
@@ -29,6 +29,7 @@ import (
)
func TestIntegration_CCIP(t *testing.T) {
+ t.Parallel()
// Run tke batches of tests for both pipeline and dynamic price getter setups.
// We will remove the pipeline batch once the feature is deleted from the code.
tests := []struct {
@@ -650,6 +651,7 @@ func TestIntegration_CCIP(t *testing.T) {
// TestReorg ensures that CCIP works even when a below finality depth reorg happens
func TestReorg(t *testing.T) {
+ t.Parallel()
// We need higher finality depth on the destination to perform reorg deep enough to revert commit and execution reports
destinationFinalityDepth := uint32(50)
ccipTH := integrationtesthelpers.SetupCCIPIntegrationTH(
diff --git a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm_test.go b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm_test.go
index 78de2699688..bff4bf16a10 100644
--- a/core/services/ocr2/plugins/ccip/internal/pricegetter/evm_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/pricegetter/evm_test.go
@@ -12,7 +12,7 @@ import (
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc"
diff --git a/core/services/ocr2/plugins/ccip/metrics_test.go b/core/services/ocr2/plugins/ccip/metrics_test.go
index eec67db7dd0..0487df2b28d 100644
--- a/core/services/ocr2/plugins/ccip/metrics_test.go
+++ b/core/services/ocr2/plugins/ccip/metrics_test.go
@@ -13,6 +13,7 @@ const (
)
func Test_SequenceNumbers(t *testing.T) {
+ t.Parallel()
collector := NewPluginMetricsCollector("test", sourceChainId, destChainId)
collector.SequenceNumber(Report, 10)
@@ -23,6 +24,7 @@ func Test_SequenceNumbers(t *testing.T) {
}
func Test_NumberOfMessages(t *testing.T) {
+ t.Parallel()
collector := NewPluginMetricsCollector("test", sourceChainId, destChainId)
collector2 := NewPluginMetricsCollector("test2", destChainId, sourceChainId)
@@ -37,6 +39,7 @@ func Test_NumberOfMessages(t *testing.T) {
}
func Test_UnexpiredCommitRoots(t *testing.T) {
+ t.Parallel()
collector := NewPluginMetricsCollector("test", sourceChainId, destChainId)
collector.UnexpiredCommitRoots(10)
diff --git a/core/services/ocr2/plugins/ccip/observations_test.go b/core/services/ocr2/plugins/ccip/observations_test.go
index a3143f157d7..c39be8e5a2c 100644
--- a/core/services/ocr2/plugins/ccip/observations_test.go
+++ b/core/services/ocr2/plugins/ccip/observations_test.go
@@ -22,6 +22,7 @@ import (
)
func TestObservationFilter(t *testing.T) {
+ t.Parallel()
lggr := logger.TestLogger(t)
obs1 := CommitObservation{Interval: cciptypes.CommitStoreInterval{Min: 1, Max: 10}}
b1, err := obs1.Marshal()
@@ -39,6 +40,7 @@ type CommitObservationLegacy struct {
}
func TestObservationCompat_MultiChainGas(t *testing.T) {
+ t.Parallel()
obsLegacy := CommitObservationLegacy{
Interval: cciptypes.CommitStoreInterval{
Min: 1,
@@ -66,6 +68,7 @@ func TestObservationCompat_MultiChainGas(t *testing.T) {
}
func TestCommitObservationJsonDeserialization(t *testing.T) {
+ t.Parallel()
expectedObservation := CommitObservation{
Interval: cciptypes.CommitStoreInterval{
Min: 1,
@@ -93,6 +96,7 @@ func TestCommitObservationJsonDeserialization(t *testing.T) {
}
func TestCommitObservationMarshal(t *testing.T) {
+ t.Parallel()
obs := CommitObservation{
Interval: cciptypes.CommitStoreInterval{
Min: 1,
@@ -120,6 +124,7 @@ func TestCommitObservationMarshal(t *testing.T) {
}
func TestExecutionObservationJsonDeserialization(t *testing.T) {
+ t.Parallel()
expectedObservation := ExecutionObservation{Messages: map[uint64]MsgData{
2: {TokenData: tokenData("c")},
1: {TokenData: tokenData("c")},
@@ -142,6 +147,7 @@ func TestExecutionObservationJsonDeserialization(t *testing.T) {
}
func TestObservationSize(t *testing.T) {
+ t.Parallel()
testParams := gopter.DefaultTestParameters()
testParams.MinSuccessfulTests = 100
p := gopter.NewProperties(testParams)
@@ -166,6 +172,7 @@ func TestObservationSize(t *testing.T) {
}
func TestNewExecutionObservation(t *testing.T) {
+ t.Parallel()
tests := []struct {
name string
observations []ObservedMessage
@@ -222,6 +229,7 @@ func tokenData(value string) [][]byte {
}
func TestCommitObservationJsonSerializationDeserialization(t *testing.T) {
+ t.Parallel()
jsonEncoded := `{
"interval": {
"Min":1,
@@ -276,6 +284,7 @@ func TestCommitObservationJsonSerializationDeserialization(t *testing.T) {
}
func TestAddressEncodingBackwardsCompatibility(t *testing.T) {
+ t.Parallel()
// The intention of this test is to remind including proper formatting of addresses after config is updated.
//
// The following tests will fail when a new cciptypes.Address field is added or removed.
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
index c2fec2903e8..6875bae1419 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
@@ -201,7 +201,7 @@ type Common struct {
WrappedNative *weth9.WETH9
WrappedNativePool *lock_release_token_pool.LockReleaseTokenPool
ARM *mock_rmn_contract.MockRMNContract
- ARMProxy *rmn_proxy_contract.RMNProxyContract
+ ARMProxy *rmn_proxy_contract.RMNProxy
PriceRegistry *price_registry_1_2_0.PriceRegistry
TokenAdminRegistry *token_admin_registry.TokenAdminRegistry
FinalityDepth uint32
@@ -698,14 +698,14 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh
require.NoError(t, err)
sourceARM, err := mock_rmn_contract.NewMockRMNContract(armSourceAddress, sourceChain.Client())
require.NoError(t, err)
- armProxySourceAddress, _, _, err := rmn_proxy_contract.DeployRMNProxyContract(
+ armProxySourceAddress, _, _, err := rmn_proxy_contract.DeployRMNProxy(
sourceUser,
sourceChain.Client(),
armSourceAddress,
)
require.NoError(t, err)
sourceChain.Commit()
- sourceARMProxy, err := rmn_proxy_contract.NewRMNProxyContract(armProxySourceAddress, sourceChain.Client())
+ sourceARMProxy, err := rmn_proxy_contract.NewRMNProxy(armProxySourceAddress, sourceChain.Client())
require.NoError(t, err)
armDestAddress, _, _, err := mock_rmn_contract.DeployMockRMNContract(
@@ -714,7 +714,7 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh
)
require.NoError(t, err)
destChain.Commit()
- armProxyDestAddress, _, _, err := rmn_proxy_contract.DeployRMNProxyContract(
+ armProxyDestAddress, _, _, err := rmn_proxy_contract.DeployRMNProxy(
destUser,
destChain.Client(),
armDestAddress,
@@ -723,7 +723,7 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh
destChain.Commit()
destARM, err := mock_rmn_contract.NewMockRMNContract(armDestAddress, destChain.Client())
require.NoError(t, err)
- destARMProxy, err := rmn_proxy_contract.NewRMNProxyContract(armProxyDestAddress, destChain.Client())
+ destARMProxy, err := rmn_proxy_contract.NewRMNProxy(armProxyDestAddress, destChain.Client())
require.NoError(t, err)
// ================================================================
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/integration/jobspec.go b/core/services/ocr2/plugins/ccip/testhelpers/integration/jobspec.go
index b10f51a9426..a520580e614 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/integration/jobspec.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/integration/jobspec.go
@@ -2,11 +2,13 @@ package integrationtesthelpers
import (
"bytes"
+ "crypto/sha256"
"fmt"
"text/template"
"time"
"github.com/ethereum/go-ethereum/common"
+ "github.com/google/uuid"
"github.com/lib/pq"
"github.com/smartcontractkit/chainlink-common/pkg/types"
@@ -28,6 +30,7 @@ type OCR2TaskJobSpec struct {
ForwardingAllowed bool `toml:"forwardingAllowed"`
OCR2OracleSpec job.OCR2OracleSpec
ObservationSource string `toml:"observationSource"` // List of commands for the Chainlink node
+ ExternalJobID string `toml:"externalJobID"`
}
// Type returns the type of the job
@@ -39,9 +42,14 @@ func (o *OCR2TaskJobSpec) String() (string, error) {
if o.OCR2OracleSpec.FeedID != nil {
feedID = o.OCR2OracleSpec.FeedID.Hex()
}
+ externalID, err := ExternalJobID(o.Name)
+ if err != nil {
+ return "", err
+ }
specWrap := struct {
Name string
JobType string
+ ExternalJobID string
MaxTaskDuration string
ForwardingAllowed bool
ContractID string
@@ -62,6 +70,7 @@ func (o *OCR2TaskJobSpec) String() (string, error) {
}{
Name: o.Name,
JobType: o.JobType,
+ ExternalJobID: externalID,
ForwardingAllowed: o.ForwardingAllowed,
MaxTaskDuration: o.MaxTaskDuration,
ContractID: o.OCR2OracleSpec.ContractID,
@@ -82,6 +91,7 @@ func (o *OCR2TaskJobSpec) String() (string, error) {
ocr2TemplateString := `
type = "{{ .JobType }}"
name = "{{.Name}}"
+externalJobID = "{{.ExternalJobID}}"
forwardingAllowed = {{.ForwardingAllowed}}
{{if .MaxTaskDuration}}
maxTaskDuration = "{{ .MaxTaskDuration }}" {{end}}
@@ -332,3 +342,18 @@ func (c *CCIPIntegrationTestHarness) NewCCIPJobSpecParams(tokenPricesUSDPipeline
USDCAttestationAPI: usdcAttestationAPI,
}
}
+
+func ExternalJobID(jobName string) (string, error) {
+ in := []byte(jobName)
+ sha256Hash := sha256.New()
+ sha256Hash.Write(in)
+ in = sha256Hash.Sum(nil)[:16]
+ // tag as valid UUID v4 https://github.com/google/uuid/blob/0f11ee6918f41a04c201eceeadf612a377bc7fbc/version4.go#L53-L54
+ in[6] = (in[6] & 0x0f) | 0x40 // Version 4
+ in[8] = (in[8] & 0x3f) | 0x80 // Variant is 10
+ id, err := uuid.FromBytes(in)
+ if err != nil {
+ return "", err
+ }
+ return id.String(), nil
+}
diff --git a/core/services/ocr2/plugins/mercury/plugin.go b/core/services/ocr2/plugins/mercury/plugin.go
index 8a4101804dd..b0983e55c89 100644
--- a/core/services/ocr2/plugins/mercury/plugin.go
+++ b/core/services/ocr2/plugins/mercury/plugin.go
@@ -1,6 +1,7 @@
package mercury
import (
+ "context"
"encoding/json"
"fmt"
"os/exec"
@@ -79,14 +80,13 @@ func NewServices(
return nil, errors.New("expected job to have a non-nil PipelineSpec")
}
- var err error
var pluginConfig config.PluginConfig
if len(jb.OCR2OracleSpec.PluginConfig) == 0 {
if !enableTriggerCapability {
return nil, fmt.Errorf("at least one transmission option must be configured")
}
} else {
- err = json.Unmarshal(jb.OCR2OracleSpec.PluginConfig.Bytes(), &pluginConfig)
+ err := json.Unmarshal(jb.OCR2OracleSpec.PluginConfig.Bytes(), &pluginConfig)
if err != nil {
return nil, errors.WithStack(err)
}
@@ -101,8 +101,8 @@ func NewServices(
// encapsulate all the subservices and ensure we close them all if any fail to start
srvs := []job.ServiceCtx{ocr2Provider}
abort := func() {
- if err = services.MultiCloser(srvs).Close(); err != nil {
- lggr.Errorw("Error closing unused services", "err", err)
+ if cerr := services.MultiCloser(srvs).Close(); cerr != nil {
+ lggr.Errorw("Error closing unused services", "err", cerr)
}
}
saver := ocrcommon.NewResultRunSaver(pipelineRunner, lggr, cfg.MaxSuccessfulRuns(), cfg.ResultWriteQueueDepth())
@@ -112,6 +112,7 @@ func NewServices(
var (
factory ocr3types.MercuryPluginFactory
factoryServices []job.ServiceCtx
+ fErr error
)
fCfg := factoryCfg{
orm: orm,
@@ -127,31 +128,31 @@ func NewServices(
}
switch feedID.Version() {
case 1:
- factory, factoryServices, err = newv1factory(fCfg)
- if err != nil {
+ factory, factoryServices, fErr = newv1factory(fCfg)
+ if fErr != nil {
abort()
- return nil, fmt.Errorf("failed to create mercury v1 factory: %w", err)
+ return nil, fmt.Errorf("failed to create mercury v1 factory: %w", fErr)
}
srvs = append(srvs, factoryServices...)
case 2:
- factory, factoryServices, err = newv2factory(fCfg)
- if err != nil {
+ factory, factoryServices, fErr = newv2factory(fCfg)
+ if fErr != nil {
abort()
- return nil, fmt.Errorf("failed to create mercury v2 factory: %w", err)
+ return nil, fmt.Errorf("failed to create mercury v2 factory: %w", fErr)
}
srvs = append(srvs, factoryServices...)
case 3:
- factory, factoryServices, err = newv3factory(fCfg)
- if err != nil {
+ factory, factoryServices, fErr = newv3factory(fCfg)
+ if fErr != nil {
abort()
- return nil, fmt.Errorf("failed to create mercury v3 factory: %w", err)
+ return nil, fmt.Errorf("failed to create mercury v3 factory: %w", fErr)
}
srvs = append(srvs, factoryServices...)
case 4:
- factory, factoryServices, err = newv4factory(fCfg)
- if err != nil {
+ factory, factoryServices, fErr = newv4factory(fCfg)
+ if fErr != nil {
abort()
- return nil, fmt.Errorf("failed to create mercury v4 factory: %w", err)
+ return nil, fmt.Errorf("failed to create mercury v4 factory: %w", fErr)
}
srvs = append(srvs, factoryServices...)
default:
@@ -214,13 +215,14 @@ func newv4factory(factoryCfg factoryCfg) (ocr3types.MercuryPluginFactory, []job.
loopEnabled := loopCmd != ""
if loopEnabled {
- cmdFn, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
+ cmdFn, unregisterer, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
if err != nil {
return nil, nil, fmt.Errorf("failed to init loop for feed %s: %w", factoryCfg.feedID, err)
}
// in loop mode, the factory is grpc server, and we need to handle the server lifecycle
+ // and unregistration of the loop
factoryServer := loop.NewMercuryV4Service(mercuryLggr, opts, cmdFn, factoryCfg.ocr2Provider, ds)
- srvs = append(srvs, factoryServer)
+ srvs = append(srvs, factoryServer, unregisterer)
// adapt the grpc server to the vanilla mercury plugin factory interface used by the oracle
factory = factoryServer
} else {
@@ -253,13 +255,14 @@ func newv3factory(factoryCfg factoryCfg) (ocr3types.MercuryPluginFactory, []job.
loopEnabled := loopCmd != ""
if loopEnabled {
- cmdFn, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
+ cmdFn, unregisterer, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
if err != nil {
return nil, nil, fmt.Errorf("failed to init loop for feed %s: %w", factoryCfg.feedID, err)
}
// in loopp mode, the factory is grpc server, and we need to handle the server lifecycle
+ // and unregistration of the loop
factoryServer := loop.NewMercuryV3Service(mercuryLggr, opts, cmdFn, factoryCfg.ocr2Provider, ds)
- srvs = append(srvs, factoryServer)
+ srvs = append(srvs, factoryServer, unregisterer)
// adapt the grpc server to the vanilla mercury plugin factory interface used by the oracle
factory = factoryServer
} else {
@@ -292,13 +295,14 @@ func newv2factory(factoryCfg factoryCfg) (ocr3types.MercuryPluginFactory, []job.
loopEnabled := loopCmd != ""
if loopEnabled {
- cmdFn, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
+ cmdFn, unregisterer, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
if err != nil {
return nil, nil, fmt.Errorf("failed to init loop for feed %s: %w", factoryCfg.feedID, err)
}
// in loopp mode, the factory is grpc server, and we need to handle the server lifecycle
+ // and unregistration of the loop
factoryServer := loop.NewMercuryV2Service(mercuryLggr, opts, cmdFn, factoryCfg.ocr2Provider, ds)
- srvs = append(srvs, factoryServer)
+ srvs = append(srvs, factoryServer, unregisterer)
// adapt the grpc server to the vanilla mercury plugin factory interface used by the oracle
factory = factoryServer
} else {
@@ -329,13 +333,14 @@ func newv1factory(factoryCfg factoryCfg) (ocr3types.MercuryPluginFactory, []job.
loopEnabled := loopCmd != ""
if loopEnabled {
- cmdFn, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
+ cmdFn, unregisterer, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
if err != nil {
return nil, nil, fmt.Errorf("failed to init loop for feed %s: %w", factoryCfg.feedID, err)
}
// in loopp mode, the factory is grpc server, and we need to handle the server lifecycle
+ // and unregistration of the loop
factoryServer := loop.NewMercuryV1Service(mercuryLggr, opts, cmdFn, factoryCfg.ocr2Provider, ds)
- srvs = append(srvs, factoryServer)
+ srvs = append(srvs, factoryServer, unregisterer)
// adapt the grpc server to the vanilla mercury plugin factory interface used by the oracle
factory = factoryServer
} else {
@@ -344,20 +349,46 @@ func newv1factory(factoryCfg factoryCfg) (ocr3types.MercuryPluginFactory, []job.
return factory, srvs, nil
}
-func initLoop(cmd string, cfg Config, feedID utils.FeedID, lggr logger.Logger) (func() *exec.Cmd, loop.GRPCOpts, logger.Logger, error) {
+func initLoop(cmd string, cfg Config, feedID utils.FeedID, lggr logger.Logger) (func() *exec.Cmd, *loopUnregisterCloser, loop.GRPCOpts, logger.Logger, error) {
lggr.Debugw("Initializing Mercury loop", "command", cmd)
mercuryLggr := lggr.Named(fmt.Sprintf("MercuryV%d", feedID.Version())).Named(feedID.String())
envVars, err := plugins.ParseEnvFile(env.MercuryPlugin.Env.Get())
if err != nil {
- return nil, loop.GRPCOpts{}, nil, fmt.Errorf("failed to parse mercury env file: %w", err)
+ return nil, nil, loop.GRPCOpts{}, nil, fmt.Errorf("failed to parse mercury env file: %w", err)
}
+ loopID := mercuryLggr.Name()
cmdFn, opts, err := cfg.RegisterLOOP(plugins.CmdConfig{
- ID: mercuryLggr.Name(),
+ ID: loopID,
Cmd: cmd,
Env: envVars,
})
if err != nil {
- return nil, loop.GRPCOpts{}, nil, fmt.Errorf("failed to register loop: %w", err)
+ return nil, nil, loop.GRPCOpts{}, nil, fmt.Errorf("failed to register loop: %w", err)
+ }
+ return cmdFn, newLoopUnregister(cfg, loopID), opts, mercuryLggr, nil
+}
+
+// loopUnregisterCloser is a helper to unregister a loop
+// as a service
+// TODO BCF-3451 all other jobs that use custom plugin providers that should be refactored to use this pattern
+// perhaps it can be implemented in the delegate on job delete.
+type loopUnregisterCloser struct {
+ r plugins.RegistrarConfig
+ id string
+}
+
+func (l *loopUnregisterCloser) Close() error {
+ l.r.UnregisterLOOP(l.id)
+ return nil
+}
+
+func (l *loopUnregisterCloser) Start(ctx context.Context) error {
+ return nil
+}
+
+func newLoopUnregister(r plugins.RegistrarConfig, id string) *loopUnregisterCloser {
+ return &loopUnregisterCloser{
+ r: r,
+ id: id,
}
- return cmdFn, opts, mercuryLggr, nil
}
diff --git a/core/services/ocr2/plugins/mercury/plugin_test.go b/core/services/ocr2/plugins/mercury/plugin_test.go
index 22aaf7522de..eb67da53100 100644
--- a/core/services/ocr2/plugins/mercury/plugin_test.go
+++ b/core/services/ocr2/plugins/mercury/plugin_test.go
@@ -2,6 +2,7 @@ package mercury_test
import (
"context"
+ "errors"
"os/exec"
"reflect"
"testing"
@@ -9,6 +10,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink/v2/core/config/env"
"github.com/smartcontractkit/chainlink/v2/core/logger"
@@ -22,6 +24,7 @@ import (
v2 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v2"
v3 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v3"
v4 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v4"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
mercuryocr2 "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/mercury"
@@ -92,21 +95,23 @@ var (
// this is kind of gross, but it's the best way to test return values of the services
expectedEmbeddedServiceCnt = 3
- expectedLoopServiceCnt = expectedEmbeddedServiceCnt + 1
+ expectedLoopServiceCnt = expectedEmbeddedServiceCnt + 2 // factory server and loop unregisterer
)
func TestNewServices(t *testing.T) {
type args struct {
pluginConfig job.JSONConfig
feedID utils.FeedID
+ cfg mercuryocr2.Config
}
- tests := []struct {
+ testCases := []struct {
name string
args args
loopMode bool
wantLoopFactory any
wantServiceCnt int
wantErr bool
+ wantErrStr string
}{
{
name: "no plugin config error ",
@@ -186,6 +191,19 @@ func TestNewServices(t *testing.T) {
wantErr: false,
wantLoopFactory: &loop.MercuryV3Service{},
},
+ {
+ name: "v3 loop err",
+ loopMode: true,
+ args: args{
+ pluginConfig: v3jsonCfg,
+ feedID: v3FeedId,
+ cfg: mercuryocr2.NewMercuryConfig(1, 1, &testRegistrarConfig{failRegister: true}),
+ },
+ wantServiceCnt: expectedLoopServiceCnt,
+ wantErr: true,
+ wantLoopFactory: &loop.MercuryV3Service{},
+ wantErrStr: "failed to init loop for feed",
+ },
{
name: "v4 loop",
loopMode: true,
@@ -198,17 +216,27 @@ func TestNewServices(t *testing.T) {
wantLoopFactory: &loop.MercuryV4Service{},
},
}
- for _, tt := range tests {
+ for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
if tt.loopMode {
t.Setenv(string(env.MercuryPlugin.Cmd), "fake_cmd")
assert.NotEmpty(t, env.MercuryPlugin.Cmd.Get())
}
- got, err := newServicesTestWrapper(t, tt.args.pluginConfig, tt.args.feedID)
+ // use default config if not provided
+ if tt.args.cfg == nil {
+ tt.args.cfg = testCfg
+ }
+ got, err := newServicesTestWrapper(t, tt.args.pluginConfig, tt.args.feedID, tt.args.cfg)
if (err != nil) != tt.wantErr {
t.Errorf("NewServices() error = %v, wantErr %v", err, tt.wantErr)
return
}
+ if err != nil {
+ if tt.wantErrStr != "" {
+ assert.Contains(t, err.Error(), tt.wantErrStr)
+ }
+ return
+ }
assert.Len(t, got, tt.wantServiceCnt)
if tt.loopMode {
foundLoopFactory := false
@@ -222,15 +250,97 @@ func TestNewServices(t *testing.T) {
}
})
}
+
+ t.Run("restartable loop", func(t *testing.T) {
+ // setup a real loop registry to test restartability
+ registry := plugins.NewLoopRegistry(logger.TestLogger(t), nil, nil, nil, "")
+ loopRegistrarConfig := plugins.NewRegistrarConfig(loop.GRPCOpts{}, registry.Register, registry.Unregister)
+ prodCfg := mercuryocr2.NewMercuryConfig(1, 1, loopRegistrarConfig)
+ type args struct {
+ pluginConfig job.JSONConfig
+ feedID utils.FeedID
+ cfg mercuryocr2.Config
+ }
+ testCases := []struct {
+ name string
+ args args
+ wantErr bool
+ }{
+ {
+ name: "v1 loop",
+ args: args{
+ pluginConfig: v1jsonCfg,
+ feedID: v1FeedId,
+ cfg: prodCfg,
+ },
+ wantErr: false,
+ },
+ {
+ name: "v2 loop",
+ args: args{
+ pluginConfig: v2jsonCfg,
+ feedID: v2FeedId,
+ cfg: prodCfg,
+ },
+ wantErr: false,
+ },
+ {
+ name: "v3 loop",
+ args: args{
+ pluginConfig: v3jsonCfg,
+ feedID: v3FeedId,
+ cfg: prodCfg,
+ },
+ wantErr: false,
+ },
+ {
+ name: "v4 loop",
+ args: args{
+ pluginConfig: v4jsonCfg,
+ feedID: v4FeedId,
+ cfg: prodCfg,
+ },
+ wantErr: false,
+ },
+ }
+
+ for _, tt := range testCases {
+ t.Run(tt.name, func(t *testing.T) {
+ t.Setenv(string(env.MercuryPlugin.Cmd), "fake_cmd")
+ assert.NotEmpty(t, env.MercuryPlugin.Cmd.Get())
+
+ got, err := newServicesTestWrapper(t, tt.args.pluginConfig, tt.args.feedID, tt.args.cfg)
+ if (err != nil) != tt.wantErr {
+ t.Errorf("NewServices() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+ // hack to simulate a restart. we don't have enough boilerplate to start the oracle service
+ // only care about the subservices so we start all except the oracle, which happens to be the last one
+ for i := 0; i < len(got)-1; i++ {
+ require.NoError(t, got[i].Start(tests.Context(t)))
+ }
+ // if we don't close the services, we get conflicts with the loop registry
+ _, err = newServicesTestWrapper(t, tt.args.pluginConfig, tt.args.feedID, tt.args.cfg)
+ require.ErrorContains(t, err, "plugin already registered")
+
+ // close all services and try again
+ for i := len(got) - 2; i >= 0; i-- {
+ require.NoError(t, got[i].Close())
+ }
+ _, err = newServicesTestWrapper(t, tt.args.pluginConfig, tt.args.feedID, tt.args.cfg)
+ require.NoError(t, err)
+ })
+ }
+ })
}
// we are only varying the version via feedID (and the plugin config)
// this wrapper supplies dummy values for the rest of the arguments
-func newServicesTestWrapper(t *testing.T, pluginConfig job.JSONConfig, feedID utils.FeedID) ([]job.ServiceCtx, error) {
+func newServicesTestWrapper(t *testing.T, pluginConfig job.JSONConfig, feedID utils.FeedID, cfg mercuryocr2.Config) ([]job.ServiceCtx, error) {
t.Helper()
jb := testJob
jb.OCR2OracleSpec.PluginConfig = pluginConfig
- return mercuryocr2.NewServices(jb, &testProvider{}, nil, logger.TestLogger(t), testArgsNoPlugin, testCfg, nil, &testDataSourceORM{}, feedID, false)
+ return mercuryocr2.NewServices(jb, &testProvider{}, nil, logger.TestLogger(t), testArgsNoPlugin, cfg, nil, &testDataSourceORM{}, feedID, false)
}
type testProvider struct{}
@@ -292,16 +402,21 @@ func (*testProvider) ReportCodecV3() v3.ReportCodec { return nil }
func (*testProvider) ReportCodecV4() v4.ReportCodec { return nil }
// Start implements types.MercuryProvider.
-func (*testProvider) Start(context.Context) error { panic("unimplemented") }
+func (*testProvider) Start(context.Context) error { return nil }
var _ commontypes.MercuryProvider = (*testProvider)(nil)
-type testRegistrarConfig struct{}
+type testRegistrarConfig struct {
+ failRegister bool
+}
func (c *testRegistrarConfig) UnregisterLOOP(ID string) {}
// RegisterLOOP implements plugins.RegistrarConfig.
-func (*testRegistrarConfig) RegisterLOOP(config plugins.CmdConfig) (func() *exec.Cmd, loop.GRPCOpts, error) {
+func (c *testRegistrarConfig) RegisterLOOP(config plugins.CmdConfig) (func() *exec.Cmd, loop.GRPCOpts, error) {
+ if c.failRegister {
+ return nil, loop.GRPCOpts{}, errors.New("failed to register")
+ }
return nil, loop.GRPCOpts{}, nil
}
diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_test.go
index 66112756370..2283559365c 100644
--- a/core/services/ocr2/plugins/ocr2keeper/integration_test.go
+++ b/core/services/ocr2/plugins/ocr2keeper/integration_test.go
@@ -29,6 +29,8 @@ import (
"github.com/smartcontractkit/chainlink-automation/pkg/v2/config"
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
"github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
@@ -200,7 +202,7 @@ func getUpkeepIDFromTx(t *testing.T, registry *keeper_registry_wrapper2_0.Keeper
}
func TestIntegration_KeeperPluginBasic(t *testing.T) {
- testutils.SkipFlakey(t, "https://smartcontract-it.atlassian.net/browse/AUTO-11072")
+ tests.SkipFlakey(t, "https://smartcontract-it.atlassian.net/browse/AUTO-11072")
runKeeperPluginBasic(t)
}
diff --git a/core/services/ocr2/validate/validate.go b/core/services/ocr2/validate/validate.go
index c2f3e455232..27a5a885369 100644
--- a/core/services/ocr2/validate/validate.go
+++ b/core/services/ocr2/validate/validate.go
@@ -269,8 +269,8 @@ func validateGenericPluginSpec(ctx context.Context, spec *job.OCR2OracleSpec, rc
loopID := fmt.Sprintf("%s-%s-%s", p.PluginName, spec.ContractID, spec.GetID())
// Starting and stopping a LOOPP isn't efficient; ideally, we'd initiate the LOOPP once and then reference
- //it later to conserve resources. This code will be revisited once BCF-3126 is implemented, and we have
- //the ability to reference the LOOPP for future use.
+ // it later to conserve resources. This code will be revisited once BCF-3126 is implemented, and we have
+ // the ability to reference the LOOPP for future use.
cmdFn, grpcOpts, err := rc.RegisterLOOP(plugins.CmdConfig{
ID: loopID,
Cmd: command,
diff --git a/core/services/ocr3/promwrapper/factory.go b/core/services/ocr3/promwrapper/factory.go
index 6518cea3c0d..e369b3260ef 100644
--- a/core/services/ocr3/promwrapper/factory.go
+++ b/core/services/ocr3/promwrapper/factory.go
@@ -47,6 +47,7 @@ func (r ReportingPluginFactory[RI]) NewReportingPlugin(ctx context.Context, conf
config.ConfigDigest.String(),
promOCR3ReportsGenerated,
promOCR3Durations,
+ promOCR3Sizes,
promOCR3PluginStatus,
)
return wrapped, info, err
diff --git a/core/services/ocr3/promwrapper/plugin.go b/core/services/ocr3/promwrapper/plugin.go
index dcee5050d1e..aa5fb87a6ee 100644
--- a/core/services/ocr3/promwrapper/plugin.go
+++ b/core/services/ocr3/promwrapper/plugin.go
@@ -21,6 +21,7 @@ type reportingPlugin[RI any] struct {
// Prometheus components for tracking metrics
reportsGenerated *prometheus.CounterVec
durations *prometheus.HistogramVec
+ sizes *prometheus.CounterVec
status *prometheus.GaugeVec
}
@@ -31,6 +32,7 @@ func newReportingPlugin[RI any](
configDigest string,
reportsGenerated *prometheus.CounterVec,
durations *prometheus.HistogramVec,
+ sizes *prometheus.CounterVec,
status *prometheus.GaugeVec,
) *reportingPlugin[RI] {
return &reportingPlugin[RI]{
@@ -40,6 +42,7 @@ func newReportingPlugin[RI any](
configDigest: configDigest,
reportsGenerated: reportsGenerated,
durations: durations,
+ sizes: sizes,
status: status,
}
}
@@ -51,9 +54,11 @@ func (p *reportingPlugin[RI]) Query(ctx context.Context, outctx ocr3types.Outcom
}
func (p *reportingPlugin[RI]) Observation(ctx context.Context, outctx ocr3types.OutcomeContext, query ocrtypes.Query) (ocrtypes.Observation, error) {
- return withObservedExecution(p, observation, func() (ocrtypes.Observation, error) {
+ result, err := withObservedExecution(p, observation, func() (ocrtypes.Observation, error) {
return p.ReportingPlugin.Observation(ctx, outctx, query)
})
+ p.trackSize(observation, len(result), err)
+ return result, err
}
func (p *reportingPlugin[RI]) ValidateObservation(ctx context.Context, outctx ocr3types.OutcomeContext, query ocrtypes.Query, ao ocrtypes.AttributedObservation) error {
@@ -65,9 +70,11 @@ func (p *reportingPlugin[RI]) ValidateObservation(ctx context.Context, outctx oc
}
func (p *reportingPlugin[RI]) Outcome(ctx context.Context, outctx ocr3types.OutcomeContext, query ocrtypes.Query, aos []ocrtypes.AttributedObservation) (ocr3types.Outcome, error) {
- return withObservedExecution(p, outcome, func() (ocr3types.Outcome, error) {
+ result, err := withObservedExecution(p, outcome, func() (ocr3types.Outcome, error) {
return p.ReportingPlugin.Outcome(ctx, outctx, query, aos)
})
+ p.trackSize(outcome, len(result), err)
+ return result, err
}
func (p *reportingPlugin[RI]) Reports(ctx context.Context, seqNr uint64, outcome ocr3types.Outcome) ([]ocr3types.ReportPlus[RI], error) {
@@ -111,6 +118,15 @@ func (p *reportingPlugin[RI]) updateStatus(status bool) {
Set(float64(boolToInt(status)))
}
+func (p *reportingPlugin[RI]) trackSize(function functionType, size int, err error) {
+ if err != nil {
+ return
+ }
+ p.sizes.
+ WithLabelValues(p.chainID, p.plugin, string(function)).
+ Add(float64(size))
+}
+
func boolToInt(arg bool) int {
if arg {
return 1
diff --git a/core/services/ocr3/promwrapper/plugin_test.go b/core/services/ocr3/promwrapper/plugin_test.go
index 9a7b6f2e648..a10a467799f 100644
--- a/core/services/ocr3/promwrapper/plugin_test.go
+++ b/core/services/ocr3/promwrapper/plugin_test.go
@@ -17,17 +17,20 @@ import (
)
func Test_ReportsGeneratedGauge(t *testing.T) {
+ pluginObservationSize := 5
+ pluginOutcomeSize := 3
+
plugin1 := newReportingPlugin(
fakePlugin[uint]{reports: make([]ocr3types.ReportPlus[uint], 2)},
- "123", "empty", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3PluginStatus,
+ "123", "empty", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3Sizes, promOCR3PluginStatus,
)
plugin2 := newReportingPlugin(
- fakePlugin[bool]{reports: make([]ocr3types.ReportPlus[bool], 10)},
- "solana", "different_plugin", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3PluginStatus,
+ fakePlugin[bool]{reports: make([]ocr3types.ReportPlus[bool], 10), observationSize: pluginObservationSize, outcomeSize: pluginOutcomeSize},
+ "solana", "different_plugin", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3Sizes, promOCR3PluginStatus,
)
plugin3 := newReportingPlugin(
fakePlugin[string]{err: errors.New("error")},
- "1234", "empty", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3PluginStatus,
+ "1234", "empty", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3Sizes, promOCR3PluginStatus,
)
r1, err := plugin1.Reports(tests.Context(t), 1, nil)
@@ -64,20 +67,33 @@ func Test_ReportsGeneratedGauge(t *testing.T) {
require.NoError(t, plugin1.Close())
pluginHealth = testutil.ToFloat64(promOCR3PluginStatus.WithLabelValues("123", "empty", "abc"))
require.Equal(t, 0, int(pluginHealth))
+
+ iterations := 10
+ for i := 0; i < iterations; i++ {
+ _, err1 := plugin2.Outcome(tests.Context(t), ocr3types.OutcomeContext{}, nil, nil)
+ require.NoError(t, err1)
+ }
+ _, err1 := plugin2.Observation(tests.Context(t), ocr3types.OutcomeContext{}, nil)
+ require.NoError(t, err1)
+
+ outcomesLen := testutil.ToFloat64(promOCR3Sizes.WithLabelValues("solana", "different_plugin", "outcome"))
+ require.Equal(t, pluginOutcomeSize*iterations, int(outcomesLen))
+ observationLen := testutil.ToFloat64(promOCR3Sizes.WithLabelValues("solana", "different_plugin", "observation"))
+ require.Equal(t, pluginObservationSize, int(observationLen))
}
func Test_DurationHistograms(t *testing.T) {
plugin1 := newReportingPlugin(
fakePlugin[uint]{},
- "123", "empty", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3PluginStatus,
+ "123", "empty", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3Sizes, promOCR3PluginStatus,
)
plugin2 := newReportingPlugin(
fakePlugin[uint]{err: errors.New("error")},
- "123", "empty", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3PluginStatus,
+ "123", "empty", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3Sizes, promOCR3PluginStatus,
)
plugin3 := newReportingPlugin(
fakePlugin[uint]{},
- "solana", "commit", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3PluginStatus,
+ "solana", "commit", "abc", promOCR3ReportsGenerated, promOCR3Durations, promOCR3Sizes, promOCR3PluginStatus,
)
for _, p := range []*reportingPlugin[uint]{plugin1, plugin2, plugin3} {
@@ -102,8 +118,10 @@ func Test_DurationHistograms(t *testing.T) {
}
type fakePlugin[RI any] struct {
- reports []ocr3types.ReportPlus[RI]
- err error
+ reports []ocr3types.ReportPlus[RI]
+ observationSize int
+ outcomeSize int
+ err error
}
func (f fakePlugin[RI]) Query(context.Context, ocr3types.OutcomeContext) (ocrtypes.Query, error) {
@@ -117,7 +135,7 @@ func (f fakePlugin[RI]) Observation(context.Context, ocr3types.OutcomeContext, o
if f.err != nil {
return nil, f.err
}
- return ocrtypes.Observation{}, nil
+ return make([]byte, f.observationSize), nil
}
func (f fakePlugin[RI]) ValidateObservation(context.Context, ocr3types.OutcomeContext, ocrtypes.Query, ocrtypes.AttributedObservation) error {
@@ -132,7 +150,7 @@ func (f fakePlugin[RI]) Outcome(context.Context, ocr3types.OutcomeContext, ocrty
if f.err != nil {
return nil, f.err
}
- return ocr3types.Outcome{}, nil
+ return make([]byte, f.outcomeSize), nil
}
func (f fakePlugin[RI]) Reports(context.Context, uint64, ocr3types.Outcome) ([]ocr3types.ReportPlus[RI], error) {
diff --git a/core/services/ocr3/promwrapper/types.go b/core/services/ocr3/promwrapper/types.go
index 2fa29dcdf20..59468358783 100644
--- a/core/services/ocr3/promwrapper/types.go
+++ b/core/services/ocr3/promwrapper/types.go
@@ -48,6 +48,13 @@ var (
},
[]string{"chainID", "plugin", "function", "success"},
)
+ promOCR3Sizes = promauto.NewCounterVec(
+ prometheus.CounterOpts{
+ Name: "ocr3_reporting_plugin_data_sizes",
+ Help: "Tracks the size of the data produced by OCR3 plugin in bytes (e.g. reports, observations etc.)",
+ },
+ []string{"chainID", "plugin", "function"},
+ )
promOCR3PluginStatus = promauto.NewGaugeVec(
prometheus.GaugeOpts{
Name: "ocr3_reporting_plugin_status",
diff --git a/core/services/ocrcommon/telemetry.go b/core/services/ocrcommon/telemetry.go
index 5e4a65180d5..3872955e5a3 100644
--- a/core/services/ocrcommon/telemetry.go
+++ b/core/services/ocrcommon/telemetry.go
@@ -261,13 +261,11 @@ func hexStringToDecimal(hexString string) (decimal.Decimal, bool) {
func (e *EnhancedTelemetryService[T]) getObservation(finalResult *pipeline.FinalResult) int64 {
singularResult, err := finalResult.SingularResult()
if err != nil {
- e.lggr.Warnf("cannot get singular result, job %d", e.job.ID)
return 0
}
finalResultDecimal, err := utils.ToDecimal(singularResult.Value)
if err != nil {
- e.lggr.Warnf("cannot parse singular result from bridge task, job %d", e.job.ID)
return 0
}
@@ -277,7 +275,6 @@ func (e *EnhancedTelemetryService[T]) getObservation(finalResult *pipeline.Final
func (e *EnhancedTelemetryService[T]) getParsedValue(trrs *pipeline.TaskRunResults, trr pipeline.TaskRunResult) float64 {
parsedValue := getJsonParsedValue(trr, trrs)
if parsedValue == nil {
- e.lggr.Warnf("cannot get json parse value, job %d, id %s", e.job.ID, trr.Task.DotID())
return 0
}
return *parsedValue
@@ -302,23 +299,16 @@ func (e *EnhancedTelemetryService[T]) collectAndSend(trrs *pipeline.TaskRunResul
if trr.Task.Type() != pipeline.TaskTypeBridge {
continue
}
- var bridgeName string
- if b, is := trr.Task.(*pipeline.BridgeTask); is {
- bridgeName = b.Name
- }
if trr.Result.Error != nil {
- e.lggr.Warnw(fmt.Sprintf("cannot get bridge response from bridge task, job=%d, id=%s, name=%q", e.job.ID, trr.Task.DotID(), bridgeName), "err", trr.Result.Error, "jobID", e.job.ID, "dotID", trr.Task.DotID(), "bridgeName", bridgeName)
continue
}
bridgeRawResponse, ok := trr.Result.Value.(string)
if !ok {
- e.lggr.Warnw(fmt.Sprintf("cannot parse bridge response from bridge task, job=%d, id=%s, name=%q: expected string, got: %v (type %T)", e.job.ID, trr.Task.DotID(), bridgeName, trr.Result.Value, trr.Result.Value), "jobID", e.job.ID, "dotID", trr.Task.DotID(), "bridgeName", bridgeName)
continue
}
eaTelem, err := parseEATelemetry([]byte(bridgeRawResponse))
if err != nil {
- e.lggr.Warnw(fmt.Sprintf("cannot parse EA telemetry, job=%d, id=%s, name=%q", e.job.ID, trr.Task.DotID(), bridgeName), "err", err, "jobID", e.job.ID, "dotID", trr.Task.DotID(), "bridgeName", bridgeName)
continue
}
value := e.getParsedValue(trrs, trr)
@@ -635,12 +625,11 @@ func getPricesFromBridgeTaskByTelemetryField(lggr logger.Logger, bridgeTask pipe
func parsePriceFromTask(lggr logger.Logger, trr pipeline.TaskRunResult) float64 {
var val float64
if trr.Result.Error != nil {
- lggr.Warnw(fmt.Sprintf("got error on EA telemetry price task, id %s: %s", trr.Task.DotID(), trr.Result.Error), "err", trr.Result.Error)
return 0
}
val, err := getResultFloat64(&trr)
if err != nil {
- lggr.Warnw(fmt.Sprintf("cannot parse EA telemetry price to float64, DOT id %s", trr.Task.DotID()), "task_type", trr.Task.Type(), "task_tags", trr.Task.TaskTags(), "err", err)
+ return 0
}
return val
}
diff --git a/core/services/ocrcommon/telemetry_test.go b/core/services/ocrcommon/telemetry_test.go
index 4c8f0eb1127..1059d653b62 100644
--- a/core/services/ocrcommon/telemetry_test.go
+++ b/core/services/ocrcommon/telemetry_test.go
@@ -385,8 +385,7 @@ func TestGetObservation(t *testing.T) {
obs := e.getObservation(&pipeline.FinalResult{})
assert.Equal(t, obs, int64(0))
- assert.Equal(t, logs.Len(), 1)
- assert.Contains(t, logs.All()[0].Message, "cannot get singular result")
+ assert.Equal(t, 0, logs.Len())
finalResult := &pipeline.FinalResult{
Values: []interface{}{"123456"},
@@ -457,8 +456,7 @@ func TestCollectAndSend(t *testing.T) {
}
wg.Wait()
- assert.Equal(t, logs.Len(), 2)
- assert.Contains(t, logs.All()[0].Message, "cannot parse bridge response from bridge task")
+ assert.Equal(t, 0, logs.Len())
badTrrs = &pipeline.TaskRunResults{
pipeline.TaskRunResult{
@@ -475,9 +473,7 @@ func TestCollectAndSend(t *testing.T) {
RepTimestamp: observationTimestamp,
}
wg.Wait()
- assert.Equal(t, 2, logs.Len())
- assert.Contains(t, logs.All()[0].Message, "cannot parse bridge response from bridge task")
- assert.Contains(t, logs.All()[1].Message, "cannot get json parse value")
+ assert.Equal(t, 0, logs.Len())
doneCh <- struct{}{}
}
@@ -707,10 +703,7 @@ func TestGetPricesFromBridgeTaskByOrder(t *testing.T) {
require.Equal(t, benchmarkPrice, float64(0))
require.Equal(t, bid, float64(0))
require.Equal(t, ask, float64(0))
- require.Equal(t, 3, logs.Len())
- require.Contains(t, logs.All()[0].Message, "cannot parse EA telemetry price to float64, DOT id ds1_benchmark")
- require.Contains(t, logs.All()[1].Message, "cannot parse EA telemetry price to float64, DOT id ds2_bid")
- require.Contains(t, logs.All()[2].Message, "cannot parse EA telemetry price to float64, DOT id ds3_ask")
+ require.Equal(t, 0, logs.Len())
benchmarkPrice, bid, ask = getPricesFromBridgeTask(lggr, trrsMercuryV1[0], trrsMercuryV2, 2)
require.Equal(t, 123456.123456, benchmarkPrice)
diff --git a/core/services/pg/connection.go b/core/services/pg/connection.go
index 64a137762fc..bf3663e82ce 100644
--- a/core/services/pg/connection.go
+++ b/core/services/pg/connection.go
@@ -19,7 +19,7 @@ import (
"go.opentelemetry.io/otel"
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
)
// NOTE: This is the default level in Postgres anyway, we just make it
@@ -51,7 +51,7 @@ type ConnectionConfig interface {
MaxIdleConns() int
}
-func NewConnection(ctx context.Context, uri string, dialect dialects.DialectName, config ConnectionConfig) (*sqlx.DB, error) {
+func NewConnection(ctx context.Context, uri string, dialect pgcommon.DialectName, config ConnectionConfig) (*sqlx.DB, error) {
opts := []otelsql.Option{otelsql.WithAttributes(semconv.DBSystemPostgreSQL),
otelsql.WithTracerProvider(otel.GetTracerProvider()),
otelsql.WithSQLCommenter(true),
@@ -70,7 +70,7 @@ func NewConnection(ctx context.Context, uri string, dialect dialects.DialectName
lockTimeout, idleInTxSessionTimeout, defaultIsolation.String())
var sqldb *sql.DB
- if dialect == dialects.TransactionWrappedPostgres {
+ if dialect == pgcommon.TransactionWrappedPostgres {
// Dbtx uses the uri as a unique identifier for each transaction. Each ORM
// should be encapsulated in it's own transaction, and thus needs its own
// unique id.
@@ -78,7 +78,11 @@ func NewConnection(ctx context.Context, uri string, dialect dialects.DialectName
// We can happily throw away the original uri here because if we are using
// txdb it should have already been set at the point where we called
// txdb.Register
- var err error
+
+ err := pgcommon.RegisterTxDb(uri)
+ if err != nil {
+ return nil, fmt.Errorf("failed to register txdb: %w", err)
+ }
sqldb, err = otelsql.Open(string(dialect), uuid.New().String(), opts...)
if err != nil {
return nil, fmt.Errorf("failed to open txdb: %w", err)
diff --git a/core/services/pg/connection_test.go b/core/services/pg/connection_test.go
index c4314bfb309..3ae70d14637 100644
--- a/core/services/pg/connection_test.go
+++ b/core/services/pg/connection_test.go
@@ -4,15 +4,13 @@ import (
"testing"
"time"
- "github.com/google/uuid"
_ "github.com/jackc/pgx/v4/stdlib"
- "github.com/jmoiron/sqlx"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
)
var _ Getter = &mockGetter{}
@@ -67,11 +65,9 @@ func Test_checkVersion(t *testing.T) {
func Test_disallowReplica(t *testing.T) {
testutils.SkipShortDB(t)
- db, err := sqlx.Open(string(dialects.TransactionWrappedPostgres), uuid.New().String())
- require.NoError(t, err)
- t.Cleanup(func() { require.NoError(t, db.Close()) })
+ db := pgtest.NewSqlxDB(t)
- _, err = db.Exec("SET session_replication_role= 'origin'")
+ _, err := db.Exec("SET session_replication_role= 'origin'")
require.NoError(t, err)
err = disallowReplica(db)
require.NoError(t, err)
diff --git a/core/services/pg/locked_db.go b/core/services/pg/locked_db.go
index 14ddb2317a5..baea01b43a5 100644
--- a/core/services/pg/locked_db.go
+++ b/core/services/pg/locked_db.go
@@ -11,10 +11,11 @@ import (
"github.com/jmoiron/sqlx"
"github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
+
"github.com/smartcontractkit/chainlink/v2/core/config"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/static"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
)
// LockedDB bounds DB connection and DB locks.
@@ -28,7 +29,7 @@ type LockedDBConfig interface {
ConnectionConfig
URL() url.URL
DefaultQueryTimeout() time.Duration
- Dialect() dialects.DialectName
+ Dialect() pg.DialectName
}
type lockedDb struct {
diff --git a/core/services/registrysyncer/local_registry.go b/core/services/registrysyncer/local_registry.go
index 5bec59412f4..3ac8927c028 100644
--- a/core/services/registrysyncer/local_registry.go
+++ b/core/services/registrysyncer/local_registry.go
@@ -7,7 +7,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/capabilities"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/logger"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
)
diff --git a/core/services/registrysyncer/orm.go b/core/services/registrysyncer/orm.go
index 9c666200752..7992f45413a 100644
--- a/core/services/registrysyncer/orm.go
+++ b/core/services/registrysyncer/orm.go
@@ -9,7 +9,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/logger"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
)
diff --git a/core/services/registrysyncer/orm_test.go b/core/services/registrysyncer/orm_test.go
index 429bfff664b..b527f1ad8d7 100644
--- a/core/services/registrysyncer/orm_test.go
+++ b/core/services/registrysyncer/orm_test.go
@@ -17,7 +17,7 @@ import (
capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink-common/pkg/values"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_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"
diff --git a/core/services/registrysyncer/syncer.go b/core/services/registrysyncer/syncer.go
index 461824b403b..02797b42dd2 100644
--- a/core/services/registrysyncer/syncer.go
+++ b/core/services/registrysyncer/syncer.go
@@ -13,7 +13,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/logger"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
evmrelaytypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
@@ -76,7 +76,6 @@ func New(
registryAddress string,
orm ORM,
) (RegistrySyncer, error) {
-
metricLabeler, err := newSyncerMetricLabeler()
if err != nil {
return nil, fmt.Errorf("failed to create syncer metric labeler: %w", err)
diff --git a/core/services/registrysyncer/syncer_test.go b/core/services/registrysyncer/syncer_test.go
index e4a1dce476c..33920c36a55 100644
--- a/core/services/registrysyncer/syncer_test.go
+++ b/core/services/registrysyncer/syncer_test.go
@@ -31,7 +31,7 @@ import (
evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_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"
diff --git a/core/services/relay/evm/cap_encoder.go b/core/services/relay/evm/cap_encoder.go
index 2a6f288a5de..713a9796dd2 100644
--- a/core/services/relay/evm/cap_encoder.go
+++ b/core/services/relay/evm/cap_encoder.go
@@ -8,6 +8,7 @@ import (
"fmt"
consensustypes "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/ocr3/types"
+ commoncodec "github.com/smartcontractkit/chainlink-common/pkg/codec"
commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink-common/pkg/values"
@@ -17,8 +18,9 @@ import (
)
const (
- abiConfigFieldName = "abi"
- encoderName = "user"
+ abiConfigFieldName = "abi"
+ subabiConfigFieldName = "subabi"
+ encoderName = "user"
)
type capEncoder struct {
@@ -46,9 +48,33 @@ func NewEVMEncoder(config *values.Map) (consensustypes.Encoder, error) {
return nil, err
}
+ chainCodecConfig := types.ChainCodecConfig{
+ TypeABI: string(jsonSelector),
+ }
+
+ var subabi map[string]string
+ subabiConfig, ok := config.Underlying[subabiConfigFieldName]
+ if ok {
+ err2 := subabiConfig.UnwrapTo(&subabi)
+ if err2 != nil {
+ return nil, err2
+ }
+ codecs, err2 := makePreCodecModifierCodecs(subabi)
+ if err2 != nil {
+ return nil, err2
+ }
+ chainCodecConfig.ModifierConfigs = commoncodec.ModifiersConfig{
+ &commoncodec.PreCodecModifierConfig{
+ Fields: subabi,
+ Codecs: codecs,
+ },
+ }
+ }
+
codecConfig := types.CodecConfig{Configs: map[string]types.ChainCodecConfig{
- encoderName: {TypeABI: string(jsonSelector)},
+ encoderName: chainCodecConfig,
}}
+
c, err := codec.NewCodec(codecConfig)
if err != nil {
return nil, err
@@ -57,6 +83,32 @@ func NewEVMEncoder(config *values.Map) (consensustypes.Encoder, error) {
return &capEncoder{codec: c}, nil
}
+func makePreCodecModifierCodecs(subabi map[string]string) (map[string]commontypes.RemoteCodec, error) {
+ codecs := map[string]commontypes.RemoteCodec{}
+ for _, abi := range subabi {
+ selector, err := abiutil.ParseSelector("inner(" + abi + ")")
+ if err != nil {
+ return nil, err
+ }
+ jsonSelector, err := json.Marshal(selector.Inputs)
+ if err != nil {
+ return nil, err
+ }
+ emptyName := ""
+ codecConfig := types.CodecConfig{Configs: map[string]types.ChainCodecConfig{
+ emptyName: {
+ TypeABI: string(jsonSelector),
+ },
+ }}
+ codec, err := codec.NewCodec(codecConfig)
+ if err != nil {
+ return nil, err
+ }
+ codecs[abi] = codec
+ }
+ return codecs, nil
+}
+
func (c *capEncoder) Encode(ctx context.Context, input values.Map) ([]byte, error) {
unwrappedInput, err := input.Unwrap()
if err != nil {
diff --git a/core/services/relay/evm/cap_encoder_test.go b/core/services/relay/evm/cap_encoder_test.go
index d290a7fd2b0..4c0285fc987 100644
--- a/core/services/relay/evm/cap_encoder_test.go
+++ b/core/services/relay/evm/cap_encoder_test.go
@@ -217,6 +217,78 @@ func TestEVMEncoder_InvalidIDs(t *testing.T) {
assert.ErrorContains(t, err, "incorrect length for id")
}
+func TestEVMEncoder_SubABI(t *testing.T) {
+ config := map[string]any{
+ "abi": "(bytes32 FeedID, bytes Bundle, uint32 Timestamp)[] Reports",
+ "subabi": map[string]string{
+ "Reports.Bundle": "uint256 Ask, uint256 Bid",
+ },
+ }
+ wrapped, err := values.NewMap(config)
+ require.NoError(t, err)
+ enc, err := evm.NewEVMEncoder(wrapped)
+ require.NoError(t, err)
+
+ type SubReport struct {
+ Ask int
+ Bid int
+ }
+ type ReportStruct struct {
+ FeedID [32]byte
+ Bundle SubReport
+ Timestamp uint32
+ }
+ reportOne := ReportStruct{
+ FeedID: [32]byte{1},
+ Bundle: SubReport{
+ Ask: 5,
+ Bid: 6,
+ },
+ Timestamp: 47890122,
+ }
+ reportTwo := ReportStruct{
+ FeedID: [32]byte{2},
+ Bundle: SubReport{
+ Ask: 7,
+ Bid: 8,
+ },
+ Timestamp: 47890122,
+ }
+
+ // output of a reduce aggregator + metadata fields appended by OCR
+ input := map[string]any{
+ "Reports": []any{reportOne, reportTwo},
+ consensustypes.MetadataFieldName: getMetadata(workflowID),
+ }
+ wrapped, err = values.NewMap(input)
+ require.NoError(t, err)
+ encoded, err := enc.Encode(testutils.Context(t), *wrapped)
+ require.NoError(t, err)
+
+ expected :=
+ // start of the outer tuple
+ getHexMetadata() +
+ // start of the inner tuple (user_fields)
+ "0000000000000000000000000000000000000000000000000000000000000020" + // offset of Reports array
+ "0000000000000000000000000000000000000000000000000000000000000002" + // length of Reports array
+ "0000000000000000000000000000000000000000000000000000000000000040" + // offset of ReportOne
+ "0000000000000000000000000000000000000000000000000000000000000100" + // offset of ReportTwo
+ "0100000000000000000000000000000000000000000000000000000000000000" + // ReportOne FeedID
+ "0000000000000000000000000000000000000000000000000000000000000060" + // offset of ReportOne Bundle
+ "0000000000000000000000000000000000000000000000000000000002dabeca" + // ReportOne Timestamp
+ "0000000000000000000000000000000000000000000000000000000000000040" + // length of ReportOne Bundle
+ "0000000000000000000000000000000000000000000000000000000000000005" + // ReportOne Ask
+ "0000000000000000000000000000000000000000000000000000000000000006" + // ReportOne Bid
+ "0200000000000000000000000000000000000000000000000000000000000000" + // ReportTwo FeedID
+ "0000000000000000000000000000000000000000000000000000000000000060" + // offset of ReportTwo Bundle
+ "0000000000000000000000000000000000000000000000000000000002dabeca" + // ReportTwo Timestamp
+ "0000000000000000000000000000000000000000000000000000000000000040" + // length of ReportTwo Bundle
+ "0000000000000000000000000000000000000000000000000000000000000007" + // ReportTwo Ask
+ "0000000000000000000000000000000000000000000000000000000000000008" // ReportTwo Bid
+
+ require.Equal(t, expected, hex.EncodeToString(encoded))
+}
+
func getHexMetadata() string {
return "01" + executionID + timestampHex + donIDHex + configVersionHex + workflowID + workflowName + workflowOwnerID + reportID
}
diff --git a/core/services/relay/evm/capabilities/log_event_trigger_test.go b/core/services/relay/evm/capabilities/log_event_trigger_test.go
index d248dbdc87f..c74f171a6c6 100644
--- a/core/services/relay/evm/capabilities/log_event_trigger_test.go
+++ b/core/services/relay/evm/capabilities/log_event_trigger_test.go
@@ -3,7 +3,6 @@ package logevent_test
import (
"math/big"
"testing"
- "time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
@@ -13,6 +12,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
commonmocks "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/triggers/logevent"
coretestutils "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/capabilities/testutils"
@@ -135,7 +135,7 @@ func emitLogTxnAndWaitForLog(t *testing.T,
for _, expectedLogVal := range expectedLogVals {
// Wait for logs with a timeout
- _, output, err := testutils.WaitForLog(th.BackendTH.Lggr, log1Ch, 15*time.Second)
+ _, output, err := testutils.WaitForLog(th.BackendTH.Lggr, log1Ch, tests.WaitTimeout(t))
require.NoError(t, err)
th.BackendTH.Lggr.Infow("EmitLog", "output", output)
diff --git a/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go b/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go
index 3c6ee8a1d04..48b805295ff 100644
--- a/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go
+++ b/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go
@@ -6,7 +6,9 @@ import (
"encoding/base64"
"encoding/hex"
"fmt"
+ rand2 "math/rand/v2"
"strings"
+ "sync"
"testing"
"time"
@@ -20,6 +22,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/services"
"github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
"github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
"github.com/smartcontractkit/chainlink-common/pkg/workflows"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper"
coretestutils "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
@@ -31,17 +34,38 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/utils/crypto"
"github.com/stretchr/testify/require"
+
+ crypto2 "github.com/ethereum/go-ethereum/crypto"
)
type testEvtHandler struct {
events []syncer.Event
+ mux sync.Mutex
}
func (m *testEvtHandler) Handle(ctx context.Context, event syncer.Event) error {
+ m.mux.Lock()
+ defer m.mux.Unlock()
m.events = append(m.events, event)
return nil
}
+func (m *testEvtHandler) ClearEvents() {
+ m.mux.Lock()
+ defer m.mux.Unlock()
+ m.events = make([]syncer.Event, 0)
+}
+
+func (m *testEvtHandler) GetEvents() []syncer.Event {
+ m.mux.Lock()
+ defer m.mux.Unlock()
+
+ eventsCopy := make([]syncer.Event, len(m.events))
+ copy(eventsCopy, m.events)
+
+ return eventsCopy
+}
+
func newTestEvtHandler() *testEvtHandler {
return &testEvtHandler{
events: make([]syncer.Event, 0),
@@ -68,6 +92,134 @@ func (m *testWorkflowRegistryContractLoader) LoadWorkflows(ctx context.Context,
}, nil
}
+func Test_EventHandlerStateSync(t *testing.T) {
+ lggr := logger.TestLogger(t)
+ backendTH := testutils.NewEVMBackendTH(t)
+ donID := uint32(1)
+
+ eventPollTicker := time.NewTicker(50 * time.Millisecond)
+ defer eventPollTicker.Stop()
+
+ // Deploy a test workflow_registry
+ wfRegistryAddr, _, wfRegistryC, err := workflow_registry_wrapper.DeployWorkflowRegistry(backendTH.ContractsOwner, backendTH.Backend.Client())
+ backendTH.Backend.Commit()
+ require.NoError(t, err)
+
+ // setup contract state to allow the secrets to be updated
+ updateAllowedDONs(t, backendTH, wfRegistryC, []uint32{donID}, true)
+ updateAuthorizedAddress(t, backendTH, wfRegistryC, []common.Address{backendTH.ContractsOwner.From}, true)
+
+ // Create some initial static state
+ numberWorkflows := 20
+ for i := 0; i < numberWorkflows; i++ {
+ var workflowID [32]byte
+ _, err = rand.Read((workflowID)[:])
+ require.NoError(t, err)
+ workflow := RegisterWorkflowCMD{
+ Name: fmt.Sprintf("test-wf-%d", i),
+ DonID: donID,
+ Status: uint8(1),
+ SecretsURL: "someurl",
+ }
+ workflow.ID = workflowID
+ registerWorkflow(t, backendTH, wfRegistryC, workflow)
+ }
+
+ testEventHandler := newTestEvtHandler()
+
+ // Create the registry
+ registry := syncer.NewWorkflowRegistry(
+ lggr,
+ func(ctx context.Context, bytes []byte) (syncer.ContractReader, error) {
+ return backendTH.NewContractReader(ctx, t, bytes)
+ },
+ wfRegistryAddr.Hex(),
+ syncer.WorkflowEventPollerConfig{
+ QueryCount: 20,
+ },
+ testEventHandler,
+ &testDonNotifier{
+ don: capabilities.DON{
+ ID: donID,
+ },
+ err: nil,
+ },
+ syncer.WithTicker(eventPollTicker.C),
+ )
+
+ servicetest.Run(t, registry)
+
+ require.Eventually(t, func() bool {
+ numEvents := len(testEventHandler.GetEvents())
+ return numEvents == numberWorkflows
+ }, tests.WaitTimeout(t), time.Second)
+
+ for _, event := range testEventHandler.GetEvents() {
+ assert.Equal(t, syncer.WorkflowRegisteredEvent, event.GetEventType())
+ }
+
+ testEventHandler.ClearEvents()
+
+ // Create different event types for a number of workflows and confirm that the event handler processes them in order
+ numberOfEventCycles := 50
+ for i := 0; i < numberOfEventCycles; i++ {
+ var workflowID [32]byte
+ _, err = rand.Read((workflowID)[:])
+ require.NoError(t, err)
+ workflow := RegisterWorkflowCMD{
+ Name: "test-wf-register-event",
+ DonID: donID,
+ Status: uint8(1),
+ SecretsURL: "",
+ }
+ workflow.ID = workflowID
+
+ // Generate events of different types with some jitter
+ registerWorkflow(t, backendTH, wfRegistryC, workflow)
+ time.Sleep(time.Millisecond * time.Duration(rand2.IntN(10)))
+ data := append(backendTH.ContractsOwner.From.Bytes(), []byte(workflow.Name)...)
+ workflowKey := crypto2.Keccak256Hash(data)
+ activateWorkflow(t, backendTH, wfRegistryC, workflowKey)
+ time.Sleep(time.Millisecond * time.Duration(rand2.IntN(10)))
+ pauseWorkflow(t, backendTH, wfRegistryC, workflowKey)
+ time.Sleep(time.Millisecond * time.Duration(rand2.IntN(10)))
+ var newWorkflowID [32]byte
+ _, err = rand.Read((newWorkflowID)[:])
+ require.NoError(t, err)
+ updateWorkflow(t, backendTH, wfRegistryC, workflowKey, newWorkflowID, workflow.BinaryURL+"2", workflow.ConfigURL, workflow.SecretsURL)
+ time.Sleep(time.Millisecond * time.Duration(rand2.IntN(10)))
+ deleteWorkflow(t, backendTH, wfRegistryC, workflowKey)
+ }
+
+ // Confirm the expected number of events are received in the correct order
+ require.Eventually(t, func() bool {
+ events := testEventHandler.GetEvents()
+ numEvents := len(events)
+ expectedNumEvents := 5 * numberOfEventCycles
+
+ if numEvents == expectedNumEvents {
+ // verify the events are the expected types in the expected order
+ for idx, event := range events {
+ switch idx % 5 {
+ case 0:
+ assert.Equal(t, syncer.WorkflowRegisteredEvent, event.GetEventType())
+ case 1:
+ assert.Equal(t, syncer.WorkflowActivatedEvent, event.GetEventType())
+ case 2:
+ assert.Equal(t, syncer.WorkflowPausedEvent, event.GetEventType())
+ case 3:
+ assert.Equal(t, syncer.WorkflowUpdatedEvent, event.GetEventType())
+ case 4:
+ assert.Equal(t, syncer.WorkflowDeletedEvent, event.GetEventType())
+ }
+ }
+ return true
+ }
+
+ return false
+ }, tests.WaitTimeout(t), time.Second)
+}
+
func Test_InitialStateSync(t *testing.T) {
lggr := logger.TestLogger(t)
backendTH := testutils.NewEVMBackendTH(t)
@@ -100,9 +252,6 @@ func Test_InitialStateSync(t *testing.T) {
}
testEventHandler := newTestEvtHandler()
- loader := syncer.NewWorkflowRegistryContractLoader(lggr, wfRegistryAddr.Hex(), func(ctx context.Context, bytes []byte) (syncer.ContractReader, error) {
- return backendTH.NewContractReader(ctx, t, bytes)
- }, testEventHandler)
// Create the worker
worker := syncer.NewWorkflowRegistry(
@@ -115,7 +264,6 @@ func Test_InitialStateSync(t *testing.T) {
QueryCount: 20,
},
testEventHandler,
- loader,
&testDonNotifier{
don: capabilities.DON{
ID: donID,
@@ -128,10 +276,10 @@ func Test_InitialStateSync(t *testing.T) {
servicetest.Run(t, worker)
require.Eventually(t, func() bool {
- return len(testEventHandler.events) == numberWorkflows
- }, 5*time.Second, time.Second)
+ return len(testEventHandler.GetEvents()) == numberWorkflows
+ }, tests.WaitTimeout(t), time.Second)
- for _, event := range testEventHandler.events {
+ for _, event := range testEventHandler.GetEvents() {
assert.Equal(t, syncer.WorkflowRegisteredEvent, event.GetEventType())
}
}
@@ -191,8 +339,11 @@ func Test_SecretsWorker(t *testing.T) {
require.NoError(t, err)
require.Equal(t, contents, giveContents)
- handler := syncer.NewEventHandler(lggr, orm, fetcherFn, nil, nil,
- emitter, clockwork.NewFakeClock(), workflowkey.Key{})
+ handler := &testSecretsWorkEventHandler{
+ wrappedHandler: syncer.NewEventHandler(lggr, orm, fetcherFn, nil, nil,
+ emitter, clockwork.NewFakeClock(), workflowkey.Key{}),
+ registeredCh: make(chan syncer.Event, 1),
+ }
worker := syncer.NewWorkflowRegistry(
lggr,
@@ -202,7 +353,6 @@ func Test_SecretsWorker(t *testing.T) {
wfRegistryAddr.Hex(),
syncer.WorkflowEventPollerConfig{QueryCount: 20},
handler,
- &testWorkflowRegistryContractLoader{},
&testDonNotifier{
don: capabilities.DON{
ID: donID,
@@ -219,6 +369,9 @@ func Test_SecretsWorker(t *testing.T) {
servicetest.Run(t, worker)
+ // wait for the workflow to be registered
+ <-handler.registeredCh
+
// generate a log event
requestForceUpdateSecrets(t, backendTH, wfRegistryC, giveSecretsURL)
@@ -228,7 +381,7 @@ func Test_SecretsWorker(t *testing.T) {
lggr.Debugf("got secrets %v", secrets)
require.NoError(t, err)
return secrets == wantContents
- }, 15*time.Second, time.Second)
+ }, tests.WaitTimeout(t), time.Second)
}
func Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused(t *testing.T) {
@@ -263,7 +416,7 @@ func Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused(t *testing.T) {
require.NoError(t, err)
from := [20]byte(backendTH.ContractsOwner.From)
- id, err := workflows.GenerateWorkflowID(from[:], []byte(wantContents), []byte(""), "")
+ id, err := workflows.GenerateWorkflowID(from[:], "test-wf", []byte(wantContents), []byte(""), "")
require.NoError(t, err)
giveWorkflow.ID = id
@@ -279,7 +432,6 @@ func Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused(t *testing.T) {
wfRegistryAddr.Hex(),
syncer.WorkflowEventPollerConfig{QueryCount: 20},
handler,
- &testWorkflowRegistryContractLoader{},
&testDonNotifier{
don: capabilities.DON{
ID: donID,
@@ -308,7 +460,7 @@ func Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused(t *testing.T) {
owner := strings.ToLower(backendTH.ContractsOwner.From.Hex()[2:])
_, err := orm.GetWorkflowSpec(ctx, owner, "test-wf")
return err == nil
- }, 15*time.Second, time.Second)
+ }, tests.WaitTimeout(t), time.Second)
}
type mockService struct{}
@@ -361,7 +513,7 @@ func Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated(t *testing.T) {
require.NoError(t, err)
from := [20]byte(backendTH.ContractsOwner.From)
- id, err := workflows.GenerateWorkflowID(from[:], []byte(wantContents), []byte(""), "")
+ id, err := workflows.GenerateWorkflowID(from[:], "test-wf", []byte(wantContents), []byte(""), "")
require.NoError(t, err)
giveWorkflow.ID = id
@@ -388,7 +540,6 @@ func Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated(t *testing.T) {
wfRegistryAddr.Hex(),
syncer.WorkflowEventPollerConfig{QueryCount: 20},
handler,
- &testWorkflowRegistryContractLoader{},
&testDonNotifier{
don: capabilities.DON{
ID: donID,
@@ -417,7 +568,7 @@ func Test_RegistrySyncer_WorkflowRegistered_InitiallyActivated(t *testing.T) {
owner := strings.ToLower(backendTH.ContractsOwner.From.Hex()[2:])
_, err = orm.GetWorkflowSpec(ctx, owner, "test-wf")
return err == nil
- }, 15*time.Second, time.Second)
+ }, tests.WaitTimeout(t), time.Second)
}
func updateAuthorizedAddress(
@@ -497,3 +648,80 @@ func requestForceUpdateSecrets(
th.Backend.Commit()
th.Backend.Commit()
}
+
+func activateWorkflow(
+ t *testing.T,
+ th *testutils.EVMBackendTH,
+ wfRegC *workflow_registry_wrapper.WorkflowRegistry,
+ workflowKey [32]byte,
+) {
+ t.Helper()
+ _, err := wfRegC.ActivateWorkflow(th.ContractsOwner, workflowKey)
+ require.NoError(t, err, "failed to activate workflow")
+ th.Backend.Commit()
+ th.Backend.Commit()
+ th.Backend.Commit()
+}
+
+func pauseWorkflow(
+ t *testing.T,
+ th *testutils.EVMBackendTH,
+ wfRegC *workflow_registry_wrapper.WorkflowRegistry,
+ workflowKey [32]byte,
+) {
+ t.Helper()
+ _, err := wfRegC.PauseWorkflow(th.ContractsOwner, workflowKey)
+ require.NoError(t, err, "failed to pause workflow")
+ th.Backend.Commit()
+ th.Backend.Commit()
+ th.Backend.Commit()
+}
+
+func deleteWorkflow(
+ t *testing.T,
+ th *testutils.EVMBackendTH,
+ wfRegC *workflow_registry_wrapper.WorkflowRegistry,
+ workflowKey [32]byte,
+) {
+ t.Helper()
+ _, err := wfRegC.DeleteWorkflow(th.ContractsOwner, workflowKey)
+ require.NoError(t, err, "failed to delete workflow")
+ th.Backend.Commit()
+ th.Backend.Commit()
+ th.Backend.Commit()
+}
+
+func updateWorkflow(
+ t *testing.T,
+ th *testutils.EVMBackendTH,
+ wfRegC *workflow_registry_wrapper.WorkflowRegistry,
+ workflowKey [32]byte, newWorkflowID [32]byte, binaryURL string, configURL string, secretsURL string,
+) {
+ t.Helper()
+ _, err := wfRegC.UpdateWorkflow(th.ContractsOwner, workflowKey, newWorkflowID, binaryURL, configURL, secretsURL)
+ require.NoError(t, err, "failed to update workflow")
+ th.Backend.Commit()
+ th.Backend.Commit()
+ th.Backend.Commit()
+}
+
+type evtHandler interface {
+ Handle(ctx context.Context, event syncer.Event) error
+}
+
+type testSecretsWorkEventHandler struct {
+ wrappedHandler evtHandler
+ registeredCh chan syncer.Event
+}
+
+func (m *testSecretsWorkEventHandler) Handle(ctx context.Context, event syncer.Event) error {
+ switch {
+ case event.GetEventType() == syncer.ForceUpdateSecretsEvent:
+ return m.wrappedHandler.Handle(ctx, event)
+ case event.GetEventType() == syncer.WorkflowRegisteredEvent:
+ m.registeredCh <- event
+ return nil
+ default:
+ panic(fmt.Sprintf("unexpected event type: %v", event.GetEventType()))
+ }
+}
diff --git a/core/services/relay/evm/chain_components_test.go b/core/services/relay/evm/chain_components_test.go
index bc2703d9678..006236c060a 100644
--- a/core/services/relay/evm/chain_components_test.go
+++ b/core/services/relay/evm/chain_components_test.go
@@ -3,15 +3,18 @@ package evm_test
import (
"context"
"crypto/ecdsa"
+ "errors"
"fmt"
"math"
"math/big"
"os"
"strconv"
+ "sync"
"testing"
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
evmtypes "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethclient/simulated"
@@ -19,15 +22,21 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
+
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
commontestutils "github.com/smartcontractkit/chainlink-common/pkg/loop/testutils"
clcommontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink-common/pkg/types/interfacetests"
+ htMocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
+ lpMocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks"
evmtxmgr "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
+ clevmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
"github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
@@ -42,6 +51,7 @@ import (
)
const commonGasLimitOnEvms = uint64(4712388)
+const finalityDepth = 4
func TestContractReaderEventsInitValidation(t *testing.T) {
tests := []struct {
@@ -206,18 +216,65 @@ func TestContractReaderEventsInitValidation(t *testing.T) {
}
}
+func TestChainReader_HealthReport(t *testing.T) {
+ lp := lpMocks.NewLogPoller(t)
+ lp.EXPECT().HealthReport().Return(map[string]error{"lp_name": clcommontypes.ErrFinalityViolated}).Once()
+ ht := htMocks.NewHeadTracker[*clevmtypes.Head, common.Hash](t)
+ htError := errors.New("head tracker error")
+ ht.EXPECT().HealthReport().Return(map[string]error{"ht_name": htError}).Once()
+ cr, err := evm.NewChainReaderService(testutils.Context(t), logger.NullLogger, lp, ht, nil, types.ChainReaderConfig{Contracts: nil})
+ require.NoError(t, err)
+ healthReport := cr.HealthReport()
+ require.True(t, services.ContainsError(healthReport, clcommontypes.ErrFinalityViolated), "expected chain reader to propagate logpoller's error")
+ require.True(t, services.ContainsError(healthReport, htError), "expected chain reader to propagate headtracker's error")
+}
+
func TestChainComponents(t *testing.T) {
- testutils.SkipFlakey(t, "https://smartcontract-it.atlassian.net/browse/BCFR-1083")
t.Parallel()
- it := &EVMChainComponentsInterfaceTester[*testing.T]{Helper: &helper{}}
- // TODO, generated binding tests are broken
- it.DisableTests([]string{interfacetests.ContractReaderGetLatestValue})
- it.Init(t)
-
+ // shared helper so all tests can run efficiently in parallel
+ helper := &helper{}
+ helper.Init(t)
+ deployLock := sync.Mutex{}
// add new subtests here so that it can be run on real chains too
- RunChainComponentsEvmTests(t, it)
- RunChainComponentsInLoopEvmTests[*testing.T](t, commontestutils.WrapContractReaderTesterForLoop(it))
- RunChainComponentsInLoopEvmTests(t, WrapContractReaderTesterWithBindings(t, it))
+ t.Run("RunChainComponentsEvmTests", func(t *testing.T) {
+ t.Parallel()
+ it := &EVMChainComponentsInterfaceTester[*testing.T]{Helper: helper, DeployLock: &deployLock}
+ // These tests are broken in develop as well, so disable them for now
+ it.DisableTests([]string{
+ interfacetests.ContractReaderQueryKeysReturnsDataTwoEventTypes,
+ interfacetests.ContractReaderQueryKeysReturnsDataAsValuesDotValue,
+ interfacetests.ContractReaderQueryKeysCanFilterWithValueComparator,
+ })
+ it.Setup(t)
+
+ RunChainComponentsEvmTests(t, it)
+ })
+
+ t.Run("RunChainComponentsInLoopEvmTests", func(t *testing.T) {
+ t.Parallel()
+ it := &EVMChainComponentsInterfaceTester[*testing.T]{Helper: helper, DeployLock: &deployLock}
+ wrapped := commontestutils.WrapContractReaderTesterForLoop(it)
+ // These tests are broken in develop as well, so disable them for now
+ wrapped.DisableTests([]string{
+ interfacetests.ContractReaderQueryKeysReturnsDataTwoEventTypes,
+ interfacetests.ContractReaderQueryKeysReturnsDataAsValuesDotValue,
+ interfacetests.ContractReaderQueryKeysCanFilterWithValueComparator,
+ })
+ wrapped.Setup(t)
+
+ RunChainComponentsInLoopEvmTests[*testing.T](t, wrapped, true)
+ })
+
+ t.Run("RunChainComponentsInLoopEvmTestsWithBindings", func(t *testing.T) {
+ t.Parallel()
+ it := &EVMChainComponentsInterfaceTester[*testing.T]{Helper: helper, DeployLock: &deployLock}
+ wrapped := WrapContractReaderTesterWithBindings(t, it)
+ // TODO, generated binding tests are broken
+ wrapped.DisableTests([]string{interfacetests.ContractReaderGetLatestValue})
+ wrapped.Setup(t)
+ // generated tests are not compatible with parallel running atm
+ RunChainComponentsInLoopEvmTests(t, wrapped, false)
+ })
}
type helper struct {
@@ -228,6 +285,40 @@ type helper struct {
txm evmtxmgr.TxManager
client client.Client
db *sqlx.DB
+ lp logpoller.LogPoller
+ ht logpoller.HeadTracker
+}
+
+func getLPOpts() logpoller.Opts {
+ return logpoller.Opts{
+ PollPeriod: time.Millisecond,
+ FinalityDepth: finalityDepth,
+ BackfillBatchSize: 1,
+ RpcBatchSize: 1,
+ KeepFinalizedBlocksDepth: 10000,
+ }
+}
+
+func (h *helper) LogPoller(t *testing.T) logpoller.LogPoller {
+ if h.lp != nil {
+ return h.lp
+ }
+ ctx := testutils.Context(t)
+ lggr := logger.NullLogger
+ db := h.Database()
+
+ h.lp = logpoller.NewLogPoller(logpoller.NewORM(h.ChainID(), db, lggr), h.Client(t), lggr, h.HeadTracker(t), getLPOpts())
+ require.NoError(t, h.lp.Start(ctx))
+ return h.lp
+}
+
+func (h *helper) HeadTracker(t *testing.T) logpoller.HeadTracker {
+ if h.ht != nil {
+ return h.ht
+ }
+ lpOpts := getLPOpts()
+ h.ht = headtracker.NewSimulatedHeadTracker(h.Client(t), lpOpts.UseFinalityTag, lpOpts.FinalityDepth)
+ return h.ht
}
func (h *helper) Init(t *testing.T) {
@@ -239,6 +330,7 @@ func (h *helper) Init(t *testing.T) {
h.Backend()
h.client = h.Client(t)
+ h.LogPoller(t)
h.txm = h.TXM(t, h.client)
}
@@ -299,6 +391,10 @@ func (h *helper) ChainID() *big.Int {
return testutils.SimulatedChainID
}
+func (h *helper) Database() *sqlx.DB {
+ return h.db
+}
+
func (h *helper) NewSqlxDB(t *testing.T) *sqlx.DB {
return pgtest.NewSqlxDB(t)
}
diff --git a/core/services/relay/evm/chain_reader.go b/core/services/relay/evm/chain_reader.go
index 99be89eae17..ffe9cd19aea 100644
--- a/core/services/relay/evm/chain_reader.go
+++ b/core/services/relay/evm/chain_reader.go
@@ -20,6 +20,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/types/query"
"github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
"github.com/smartcontractkit/chainlink-common/pkg/values"
+
evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
@@ -179,7 +180,13 @@ func (cr *chainReader) Close() error {
func (cr *chainReader) Ready() error { return nil }
func (cr *chainReader) HealthReport() map[string]error {
- return map[string]error{cr.Name(): nil}
+ report := map[string]error{
+ cr.Name(): cr.Healthy(),
+ }
+
+ commonservices.CopyHealth(report, cr.lp.HealthReport())
+ commonservices.CopyHealth(report, cr.ht.HealthReport())
+ return report
}
func (cr *chainReader) Bind(ctx context.Context, bindings []commontypes.BoundContract) error {
@@ -199,7 +206,11 @@ func (cr *chainReader) GetLatestValue(ctx context.Context, readName string, conf
ptrToValue, isValue := returnVal.(*values.Value)
if !isValue {
_, err = binding.GetLatestValueWithHeadData(ctx, common.HexToAddress(address), confidenceLevel, params, returnVal)
- return err
+ if err != nil {
+ return err
+ }
+
+ return nil
}
contractType, err := cr.CreateContractType(readName, false)
diff --git a/core/services/relay/evm/codec/codec_test.go b/core/services/relay/evm/codec/codec_test.go
index 66fc45a3037..ae75fff6eb6 100644
--- a/core/services/relay/evm/codec/codec_test.go
+++ b/core/services/relay/evm/codec/codec_test.go
@@ -19,7 +19,7 @@ import (
looptestutils "github.com/smartcontractkit/chainlink-common/pkg/loop/testutils"
commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/chain_reader_tester"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/chain_reader_tester"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/codec"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
diff --git a/core/services/relay/evm/commit_provider.go b/core/services/relay/evm/commit_provider.go
index 1a9260120f3..95d7371ab16 100644
--- a/core/services/relay/evm/commit_provider.go
+++ b/core/services/relay/evm/commit_provider.go
@@ -225,7 +225,7 @@ func (p *SrcCommitProvider) Start(ctx context.Context) error {
if p.startBlock > math.MaxInt64 {
return fmt.Errorf("start block overflows int64: %d", p.startBlock)
}
- return p.lp.Replay(ctx, int64(p.startBlock)) //nolint:gosec // G115 false positive
+ return p.lp.Replay(ctx, int64(p.startBlock))
}
return nil
}
@@ -236,7 +236,7 @@ func (p *DstCommitProvider) Start(ctx context.Context) error {
if p.startBlock > math.MaxInt64 {
return fmt.Errorf("start block overflows int64: %d", p.startBlock)
}
- return p.lp.Replay(ctx, int64(p.startBlock)) //nolint:gosec // G115 false positive
+ return p.lp.Replay(ctx, int64(p.startBlock))
}
return nil
}
diff --git a/core/services/relay/evm/evmtesting/chain_components_interface_tester.go b/core/services/relay/evm/evmtesting/chain_components_interface_tester.go
index 71bd94f0e9f..23fd97dd4d8 100644
--- a/core/services/relay/evm/evmtesting/chain_components_interface_tester.go
+++ b/core/services/relay/evm/evmtesting/chain_components_interface_tester.go
@@ -2,8 +2,8 @@ package evmtesting
import (
"context"
- "encoding/json"
"math/big"
+ "sync"
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -15,17 +15,16 @@ import (
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink-common/pkg/codec"
+ "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
clcommontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/gas"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
evmtxmgr "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/chain_reader_tester"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/chain_reader_tester"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
_ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" // force binding for tx type
"github.com/smartcontractkit/chainlink/v2/core/logger"
@@ -40,14 +39,13 @@ const (
triggerWithAllTopics = "TriggeredWithFourTopics"
triggerWithAllTopicsWithHashed = "TriggeredWithFourTopicsWithHashed"
staticBytesEventName = "StaticBytes"
- finalityDepth = 4
)
type EVMChainComponentsInterfaceTesterHelper[T TestingT[T]] interface {
- Init(t T)
Client(t T) client.Client
Commit()
Backend() bind.ContractBackend
+ Database() *sqlx.DB
ChainID() *big.Int
Context(t T) context.Context
NewSqlxDB(t T) *sqlx.DB
@@ -58,67 +56,21 @@ type EVMChainComponentsInterfaceTesterHelper[T TestingT[T]] interface {
// To enable the historical wrappers required for Simulated Backend tests.
ChainReaderEVMClient(ctx context.Context, t T, ht logpoller.HeadTracker, conf types.ChainReaderConfig) client.Client
WrappedChainWriter(cw clcommontypes.ContractWriter, client client.Client) clcommontypes.ContractWriter
+ LogPoller(t T) logpoller.LogPoller
+ HeadTracker(t T) logpoller.HeadTracker
}
type EVMChainComponentsInterfaceTester[T TestingT[T]] struct {
TestSelectionSupport
Helper EVMChainComponentsInterfaceTesterHelper[T]
+ DeployLock *sync.Mutex
client client.Client
- address string
- address2 string
- contractTesters map[string]*chain_reader_tester.ChainReaderTester
- chainReaderConfig types.ChainReaderConfig
- chainWriterConfig types.ChainWriterConfig
- deployerAuth *bind.TransactOpts
- senderAuth *bind.TransactOpts
- cr evm.ChainReaderService
- cw evm.ChainWriterService
- dirtyContracts bool
- txm evmtxmgr.TxManager
- gasEstimator gas.EvmFeeEstimator
chainReaderConfigSupplier func(t T) types.ChainReaderConfig
chainWriterConfigSupplier func(t T) types.ChainWriterConfig
- dirtyConfig bool
}
-func (it *EVMChainComponentsInterfaceTester[T]) Setup(t T) {
- t.Cleanup(func() {
- // DB may be closed by the test already, ignore errors
- if it.cr != nil {
- _ = it.cr.Close()
- }
- it.cr = nil
-
- if it.dirtyContracts {
- it.contractTesters = nil
- }
-
- if it.cw != nil {
- _ = it.cw.Close()
- }
- it.cw = nil
- })
-
- // can re-use the same chain for tests, just make new contract for each test
- if it.client != nil && !it.dirtyConfig {
- it.deployNewContracts(t)
- return
- }
-
- // Need to separate accounts to ensure the nonce doesn't get misaligned after the
- // contract deployments.
- accounts := it.Helper.Accounts(t)
- it.deployerAuth = accounts[0]
- it.senderAuth = accounts[1]
-
- it.chainReaderConfig = it.chainReaderConfigSupplier(t)
- it.GetContractReader(t)
-
- it.txm = it.Helper.TXM(t, it.client)
- it.chainWriterConfig = it.chainWriterConfigSupplier(t)
-
- it.deployNewContracts(t)
- it.dirtyConfig = false
+func (it *EVMChainComponentsInterfaceTester[T]) GetBindings(t T) []clcommontypes.BoundContract {
+ return it.deployNewContracts(t)
}
func (it *EVMChainComponentsInterfaceTester[T]) getChainReaderConfig(t T) types.ChainReaderConfig {
@@ -357,138 +309,94 @@ func (it *EVMChainComponentsInterfaceTester[T]) GetAccountString(i int) string {
func (it *EVMChainComponentsInterfaceTester[T]) GetContractReader(t T) clcommontypes.ContractReader {
ctx := it.Helper.Context(t)
- if it.cr != nil {
- return it.cr
- }
-
lggr := logger.NullLogger
- db := it.Helper.NewSqlxDB(t)
- lpOpts := logpoller.Opts{
- PollPeriod: time.Millisecond,
- FinalityDepth: finalityDepth,
- BackfillBatchSize: 1,
- RpcBatchSize: 1,
- KeepFinalizedBlocksDepth: 10000,
- }
- ht := headtracker.NewSimulatedHeadTracker(it.Helper.Client(t), lpOpts.UseFinalityTag, lpOpts.FinalityDepth)
- lp := logpoller.NewLogPoller(logpoller.NewORM(it.Helper.ChainID(), db, lggr), it.Helper.Client(t), lggr, ht, lpOpts)
- require.NoError(t, lp.Start(ctx))
- // encode and decode the config to ensure the test covers type issues
- confBytes, err := json.Marshal(it.chainReaderConfig)
+ cr, err := evm.NewChainReaderService(ctx, lggr, it.Helper.LogPoller(t), it.Helper.HeadTracker(t), it.client, it.chainReaderConfigSupplier(t))
require.NoError(t, err)
+ servicetest.Run(t, cr)
- conf, err := types.ChainReaderConfigFromBytes(confBytes)
- require.NoError(t, err)
-
- cwh := it.Helper.ChainReaderEVMClient(ctx, t, ht, conf)
- it.client = cwh
-
- cr, err := evm.NewChainReaderService(ctx, lggr, lp, ht, it.client, conf)
- require.NoError(t, err)
- require.NoError(t, cr.Start(ctx))
- it.cr = cr
return cr
}
-// This function is no longer necessary for Simulated Backend or Testnet tests.
-func (it *EVMChainComponentsInterfaceTester[T]) GenerateBlocksTillConfidenceLevel(t T, contractName, readName string, confidenceLevel primitives.ConfidenceLevel) {
-}
-
func (it *EVMChainComponentsInterfaceTester[T]) GetContractWriter(t T) clcommontypes.ContractWriter {
- ctx := it.Helper.Context(t)
- if it.cw != nil {
- return it.cw
- }
-
- cw, err := evm.NewChainWriterService(logger.NullLogger, it.client, it.txm, it.gasEstimator, it.chainWriterConfig)
+ cw, err := evm.NewChainWriterService(logger.NullLogger, it.client, it.Helper.TXM(t, it.client), nil, it.chainWriterConfigSupplier(t))
require.NoError(t, err)
- it.cw = it.Helper.WrappedChainWriter(cw, it.client)
+
+ cw = it.Helper.WrappedChainWriter(cw, it.client)
require.NoError(t, err)
- require.NoError(t, cw.Start(ctx))
- return it.cw
+
+ servicetest.Run(t, cw)
+
+ return cw
}
-func (it *EVMChainComponentsInterfaceTester[T]) GetBindings(_ T) []clcommontypes.BoundContract {
- return []clcommontypes.BoundContract{
- {Name: AnyContractName, Address: it.address},
- {Name: AnySecondContractName, Address: it.address2},
- }
+// This function is no longer necessary for Simulated Backend or Testnet tests.
+func (it *EVMChainComponentsInterfaceTester[T]) GenerateBlocksTillConfidenceLevel(t T, contractName, readName string, confidenceLevel primitives.ConfidenceLevel) {
}
func (it *EVMChainComponentsInterfaceTester[T]) DirtyContracts() {
- it.dirtyContracts = true
}
func (it *EVMChainComponentsInterfaceTester[T]) GetAuthWithGasSet(t T) *bind.TransactOpts {
- gasPrice, err := it.client.SuggestGasPrice(it.Helper.Context(t))
+ auth := *it.Helper.Accounts(t)[0]
+ gasPrice, err := it.Helper.Client(t).SuggestGasPrice(it.Helper.Context(t))
require.NoError(t, err)
extra := new(big.Int).Mul(gasPrice, big.NewInt(it.Helper.GasPriceBufferPercent()))
extra = extra.Div(extra, big.NewInt(100))
- it.deployerAuth.GasPrice = gasPrice.Add(gasPrice, extra)
- return it.deployerAuth
-}
-
-func (it *EVMChainComponentsInterfaceTester[T]) IncNonce() {
- if it.deployerAuth.Nonce == nil {
- it.deployerAuth.Nonce = big.NewInt(1)
- } else {
- it.deployerAuth.Nonce = it.deployerAuth.Nonce.Add(it.deployerAuth.Nonce, big.NewInt(1))
- }
+ auth.GasPrice = gasPrice.Add(gasPrice, extra)
+ auth.GasLimit = 10552800
+ nonce, err := it.client.PendingNonceAt(it.Helper.Context(t), auth.From)
+ require.NoError(t, err)
+ auth.Nonce = new(big.Int).SetUint64(nonce)
+ return &auth
}
func (it *EVMChainComponentsInterfaceTester[T]) AwaitTx(t T, tx *gethtypes.Transaction) {
ctx := it.Helper.Context(t)
- receipt, err := bind.WaitMined(ctx, it.client, tx)
+ receipt, err := bind.WaitMined(ctx, it.Helper.Client(t), tx)
require.NoError(t, err)
require.Equal(t, gethtypes.ReceiptStatusSuccessful, receipt.Status)
}
-func (it *EVMChainComponentsInterfaceTester[T]) deployNewContracts(t T) {
- // First test deploy both contracts, otherwise only deploy contracts if cleanup decides that we need to.
- if it.address == "" || it.contractTesters == nil {
- it.contractTesters = make(map[string]*chain_reader_tester.ChainReaderTester, 2)
- address, ts1 := it.deployNewContract(t)
- address2, ts2 := it.deployNewContract(t)
- it.address, it.address2 = address, address2
- it.contractTesters[it.address] = ts1
- it.contractTesters[it.address2] = ts2
- it.dirtyContracts = false
+func (it *EVMChainComponentsInterfaceTester[T]) deployNewContracts(t T) []clcommontypes.BoundContract {
+ it.DeployLock.Lock()
+ defer it.DeployLock.Unlock()
+ address := it.deployNewContract(t)
+ address2 := it.deployNewContract(t)
+ return []clcommontypes.BoundContract{
+ {Name: AnyContractName, Address: address},
+ {Name: AnySecondContractName, Address: address2},
}
}
-func (it *EVMChainComponentsInterfaceTester[T]) deployNewContract(t T) (string, *chain_reader_tester.ChainReaderTester) {
- // 105528 was in the error: gas too low: have 0, want 105528
- // Not sure if there's a better way to get it.
- it.deployerAuth.GasLimit = 10552800
-
- address, tx, ts, err := chain_reader_tester.DeployChainReaderTester(it.GetAuthWithGasSet(t), it.Helper.Backend())
+func (it *EVMChainComponentsInterfaceTester[T]) deployNewContract(t T) string {
+ address, tx, _, err := chain_reader_tester.DeployChainReaderTester(it.GetAuthWithGasSet(t), it.Helper.Backend())
require.NoError(t, err)
- it.Helper.Commit()
- it.IncNonce()
it.AwaitTx(t, tx)
- return address.String(), ts
+ return address.String()
}
func (it *EVMChainComponentsInterfaceTester[T]) MaxWaitTimeForEvents() time.Duration {
return it.Helper.MaxWaitTimeForEvents()
}
-func (it *EVMChainComponentsInterfaceTester[T]) Init(t T) {
- it.Helper.Init(t)
- it.chainWriterConfigSupplier = func(t T) types.ChainWriterConfig { return it.getChainWriterConfig(t) }
- it.chainReaderConfigSupplier = func(t T) types.ChainReaderConfig { return it.getChainReaderConfig(t) }
+func (it *EVMChainComponentsInterfaceTester[T]) Setup(t T) {
+ if it.chainReaderConfigSupplier == nil {
+ it.chainReaderConfigSupplier = func(t T) types.ChainReaderConfig { return it.getChainReaderConfig(t) }
+ }
+ if it.chainWriterConfigSupplier == nil {
+ it.chainWriterConfigSupplier = func(t T) types.ChainWriterConfig { return it.getChainWriterConfig(t) }
+ }
+ it.client = it.Helper.ChainReaderEVMClient(it.Helper.Context(t), t, it.Helper.HeadTracker(t), it.chainReaderConfigSupplier(t))
}
func (it *EVMChainComponentsInterfaceTester[T]) SetChainReaderConfigSupplier(chainReaderConfigSupplier func(t T) types.ChainReaderConfig) {
- it.dirtyConfig = true
it.chainReaderConfigSupplier = chainReaderConfigSupplier
}
func (it *EVMChainComponentsInterfaceTester[T]) SetChainWriterConfigSupplier(chainWriterConfigSupplier func(t T) types.ChainWriterConfig) {
- it.dirtyConfig = true
it.chainWriterConfigSupplier = chainWriterConfigSupplier
}
diff --git a/core/services/relay/evm/evmtesting/run_tests.go b/core/services/relay/evm/evmtesting/run_tests.go
index b6abffdcb2f..469cc3594b8 100644
--- a/core/services/relay/evm/evmtesting/run_tests.go
+++ b/core/services/relay/evm/evmtesting/run_tests.go
@@ -37,31 +37,31 @@ func RunChainComponentsEvmTests[T TestingT[T]](t T, it *EVMChainComponentsInterf
// Add ChainWriter tests here
}
-func RunChainComponentsInLoopEvmTests[T TestingT[T]](t T, it ChainComponentsInterfaceTester[T]) {
- RunContractReaderInLoopTests[T](t, it)
+func RunChainComponentsInLoopEvmTests[T TestingT[T]](t T, it ChainComponentsInterfaceTester[T], parallel bool) {
+ RunContractReaderInLoopTests[T](t, it, parallel)
// Add ChainWriter tests here
}
func RunContractReaderEvmTests[T TestingT[T]](t T, it *EVMChainComponentsInterfaceTester[T]) {
- RunContractReaderInterfaceTests[T](t, it, false)
+ RunContractReaderInterfaceTests[T](t, it, false, true)
testCases := []Testcase[T]{
{
Name: ContractReaderDynamicTypedTopicsFilterAndCorrectReturn,
Test: func(t T) {
- it.Setup(t)
+ cr := it.GetContractReader(t)
+ cw := it.GetContractWriter(t)
+ bindings := it.GetBindings(t)
anyString := "foo"
ctx := it.Helper.Context(t)
- cr := it.GetContractReader(t)
- bindings := it.GetBindings(t)
require.NoError(t, cr.Bind(ctx, bindings))
type DynamicEvent struct {
Field string
}
- SubmitTransactionToCW(t, it, "triggerEventWithDynamicTopic", DynamicEvent{Field: anyString}, bindings[0], types.Unconfirmed)
+ SubmitTransactionToCW(t, it, cw, "triggerEventWithDynamicTopic", DynamicEvent{Field: anyString}, bindings[0], types.Unconfirmed)
input := struct{ Field string }{Field: anyString}
tp := cr.(clcommontypes.ContractTypeProvider)
@@ -88,17 +88,17 @@ func RunContractReaderEvmTests[T TestingT[T]](t T, it *EVMChainComponentsInterfa
{
Name: ContractReaderMultipleTopicCanFilterTogether,
Test: func(t T) {
- it.Setup(t)
- ctx := it.Helper.Context(t)
cr := it.GetContractReader(t)
+ cw := it.GetContractWriter(t)
bindings := it.GetBindings(t)
+ ctx := it.Helper.Context(t)
require.NoError(t, cr.Bind(ctx, bindings))
- triggerFourTopics(t, it, int32(1), int32(2), int32(3))
- triggerFourTopics(t, it, int32(2), int32(2), int32(3))
- triggerFourTopics(t, it, int32(1), int32(3), int32(3))
- triggerFourTopics(t, it, int32(1), int32(2), int32(4))
+ triggerFourTopics(t, it, cw, bindings, int32(1), int32(2), int32(3))
+ triggerFourTopics(t, it, cw, bindings, int32(2), int32(2), int32(3))
+ triggerFourTopics(t, it, cw, bindings, int32(1), int32(3), int32(3))
+ triggerFourTopics(t, it, cw, bindings, int32(1), int32(2), int32(4))
var bound types.BoundContract
for idx := range bindings {
@@ -121,17 +121,17 @@ func RunContractReaderEvmTests[T TestingT[T]](t T, it *EVMChainComponentsInterfa
{
Name: ContractReaderFilteringCanBeDoneOnHashedIndexedTopics,
Test: func(t T) {
- it.Setup(t)
-
cr := it.GetContractReader(t)
- ctx := it.Helper.Context(t)
+ cw := it.GetContractWriter(t)
bindings := it.GetBindings(t)
+ ctx := it.Helper.Context(t)
+
require.NoError(t, cr.Bind(ctx, bindings))
- triggerFourTopicsWithHashed(t, it, "1", [32]uint8{2}, [32]byte{5})
- triggerFourTopicsWithHashed(t, it, "2", [32]uint8{2}, [32]byte{3})
- triggerFourTopicsWithHashed(t, it, "1", [32]uint8{3}, [32]byte{3})
+ triggerFourTopicsWithHashed(t, it, cw, bindings, "1", [32]uint8{2}, [32]byte{5})
+ triggerFourTopicsWithHashed(t, it, cw, bindings, "2", [32]uint8{2}, [32]byte{3})
+ triggerFourTopicsWithHashed(t, it, cw, bindings, "1", [32]uint8{3}, [32]byte{3})
var bound types.BoundContract
for idx := range bindings {
@@ -158,10 +158,9 @@ func RunContractReaderEvmTests[T TestingT[T]](t T, it *EVMChainComponentsInterfa
{
Name: ContractReaderBindReturnsErrorOnMissingContractAtAddress,
Test: func(t T) {
- it.Setup(t)
+ reader := it.GetContractReader(t)
addr := common.BigToAddress(big.NewInt(42))
- reader := it.GetContractReader(t)
ctx := it.Helper.Context(t)
err := reader.Bind(ctx, []clcommontypes.BoundContract{{Name: AnyContractName, Address: addr.Hex()}})
@@ -170,29 +169,29 @@ func RunContractReaderEvmTests[T TestingT[T]](t T, it *EVMChainComponentsInterfa
},
},
}
- RunTests(t, it, testCases)
+ RunTestsInParallel(t, it, testCases)
}
-func RunContractReaderInLoopTests[T TestingT[T]](t T, it ChainComponentsInterfaceTester[T]) {
- RunContractReaderInterfaceTests[T](t, it, false)
+func RunContractReaderInLoopTests[T TestingT[T]](t T, it ChainComponentsInterfaceTester[T], parallel bool) {
+ RunContractReaderInterfaceTests[T](t, it, false, parallel)
testCases := []Testcase[T]{
{
Name: ContractReaderQueryKeyFilterOnDataWordsWithValueComparator,
Test: func(t T) {
- ctx := tests.Context(t)
cr := it.GetContractReader(t)
- require.NoError(t, cr.Bind(ctx, it.GetBindings(t)))
+ cw := it.GetContractWriter(t)
bindings := it.GetBindings(t)
- boundContract := BindingsByName(bindings, AnyContractName)[0]
+ ctx := tests.Context(t)
require.NoError(t, cr.Bind(ctx, bindings))
+ boundContract := BindingsByName(bindings, AnyContractName)[0]
ts1 := CreateTestStruct[T](0, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts1, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts1, boundContract, types.Unconfirmed)
ts2 := CreateTestStruct[T](15, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts2, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts2, boundContract, types.Unconfirmed)
ts3 := CreateTestStruct[T](35, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts3, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts3, boundContract, types.Unconfirmed)
ts := &TestStruct{}
assert.Eventually(t, func() bool {
sequences, err := cr.QueryKey(ctx, boundContract, query.KeyFilter{
@@ -211,19 +210,20 @@ func RunContractReaderInLoopTests[T TestingT[T]](t T, it ChainComponentsInterfac
{
Name: ContractReaderQueryKeyOnDataWordsWithValueComparatorOnNestedField,
Test: func(t T) {
- ctx := tests.Context(t)
cr := it.GetContractReader(t)
- require.NoError(t, cr.Bind(ctx, it.GetBindings(t)))
+ cw := it.GetContractWriter(t)
bindings := it.GetBindings(t)
+ ctx := tests.Context(t)
+
boundContract := BindingsByName(bindings, AnyContractName)[0]
require.NoError(t, cr.Bind(ctx, bindings))
ts1 := CreateTestStruct[T](0, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts1, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts1, boundContract, types.Unconfirmed)
ts2 := CreateTestStruct[T](15, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts2, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts2, boundContract, types.Unconfirmed)
ts3 := CreateTestStruct[T](35, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts3, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts3, boundContract, types.Unconfirmed)
ts := &TestStruct{}
assert.Eventually(t, func() bool {
sequences, err := cr.QueryKey(ctx, boundContract, query.KeyFilter{
@@ -247,19 +247,19 @@ func RunContractReaderInLoopTests[T TestingT[T]](t T, it ChainComponentsInterfac
{
Name: ContractReaderQueryKeyFilterOnDataWordsWithValueComparatorOnDynamicField,
Test: func(t T) {
- ctx := tests.Context(t)
cr := it.GetContractReader(t)
- require.NoError(t, cr.Bind(ctx, it.GetBindings(t)))
+ cw := it.GetContractWriter(t)
bindings := it.GetBindings(t)
- boundContract := BindingsByName(bindings, AnyContractName)[0]
+ ctx := tests.Context(t)
require.NoError(t, cr.Bind(ctx, bindings))
+ boundContract := BindingsByName(bindings, AnyContractName)[0]
ts1 := CreateTestStruct[T](0, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts1, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts1, boundContract, types.Unconfirmed)
ts2 := CreateTestStruct[T](15, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts2, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts2, boundContract, types.Unconfirmed)
ts3 := CreateTestStruct[T](35, it)
- _ = SubmitTransactionToCW(t, it, MethodTriggeringEvent, ts3, boundContract, types.Unconfirmed)
+ _ = SubmitTransactionToCW(t, it, cw, MethodTriggeringEvent, ts3, boundContract, types.Unconfirmed)
ts := &TestStruct{}
assert.Eventually(t, func() bool {
sequences, err := cr.QueryKey(ctx, boundContract, query.KeyFilter{
@@ -283,12 +283,12 @@ func RunContractReaderInLoopTests[T TestingT[T]](t T, it ChainComponentsInterfac
{
Name: ContractReaderQueryKeyFilteringOnDataWordsUsingValueComparatorsOnFieldsWithManualIndex,
Test: func(t T) {
- ctx := tests.Context(t)
cr := it.GetContractReader(t)
- require.NoError(t, cr.Bind(ctx, it.GetBindings(t)))
+ cw := it.GetContractWriter(t)
bindings := it.GetBindings(t)
- boundContract := BindingsByName(bindings, AnyContractName)[0]
+ ctx := tests.Context(t)
require.NoError(t, cr.Bind(ctx, bindings))
+ boundContract := BindingsByName(bindings, AnyContractName)[0]
empty12Bytes := [12]byte{}
val1, val2, val3, val4 := uint32(1), uint32(2), uint32(3), uint64(4)
val5, val6, val7 := [32]byte{}, [32]byte{6}, [32]byte{7}
@@ -313,10 +313,10 @@ func RunContractReaderInLoopTests[T TestingT[T]](t T, it ChainComponentsInterfac
wrapExpectedRes := eventResAsStruct{Message: &resExpected}
// emit the one we want to search for and a couple of random ones to confirm that filtering works
- triggerStaticBytes(t, it, val1, val2, val3, val4, val5, val6, val7, raw)
- triggerStaticBytes(t, it, 1337, 7331, 4747, val4, val5, val6, val7, raw)
- triggerStaticBytes(t, it, 7331, 4747, 1337, val4, val5, val6, val7, raw)
- triggerStaticBytes(t, it, 4747, 1337, 7331, val4, val5, val6, val7, raw)
+ triggerStaticBytes(t, it, cw, bindings, val1, val2, val3, val4, val5, val6, val7, raw)
+ triggerStaticBytes(t, it, cw, bindings, 1337, 7331, 4747, val4, val5, val6, val7, raw)
+ triggerStaticBytes(t, it, cw, bindings, 7331, 4747, 1337, val4, val5, val6, val7, raw)
+ triggerStaticBytes(t, it, cw, bindings, 4747, 1337, 7331, val4, val5, val6, val7, raw)
assert.Eventually(t, func() bool {
sequences, err := cr.QueryKey(ctx, boundContract, query.KeyFilter{
@@ -333,31 +333,33 @@ func RunContractReaderInLoopTests[T TestingT[T]](t T, it ChainComponentsInterfac
},
},
}
- RunTests(t, it, testCases)
+ if parallel {
+ RunTestsInParallel(t, it, testCases)
+ } else {
+ RunTests(t, it, testCases)
+ }
}
-func triggerFourTopics[T TestingT[T]](t T, it *EVMChainComponentsInterfaceTester[T], i1, i2, i3 int32) {
+func triggerFourTopics[T TestingT[T]](t T, it *EVMChainComponentsInterfaceTester[T], cw clcommontypes.ContractWriter, bindings []clcommontypes.BoundContract, i1, i2, i3 int32) {
type DynamicEvent struct {
Field1 int32
Field2 int32
Field3 int32
}
- contracts := it.GetBindings(t)
- SubmitTransactionToCW(t, it, "triggerWithFourTopics", DynamicEvent{Field1: i1, Field2: i2, Field3: i3}, contracts[0], types.Unconfirmed)
+ SubmitTransactionToCW(t, it, cw, "triggerWithFourTopics", DynamicEvent{Field1: i1, Field2: i2, Field3: i3}, bindings[0], types.Unconfirmed)
}
-func triggerFourTopicsWithHashed[T TestingT[T]](t T, it *EVMChainComponentsInterfaceTester[T], i1 string, i2 [32]uint8, i3 [32]byte) {
+func triggerFourTopicsWithHashed[T TestingT[T]](t T, it *EVMChainComponentsInterfaceTester[T], cw clcommontypes.ContractWriter, bindings []clcommontypes.BoundContract, i1 string, i2 [32]uint8, i3 [32]byte) {
type DynamicEvent struct {
Field1 string
Field2 [32]uint8
Field3 [32]byte
}
- contracts := it.GetBindings(t)
- SubmitTransactionToCW(t, it, "triggerWithFourTopicsWithHashed", DynamicEvent{Field1: i1, Field2: i2, Field3: i3}, contracts[0], types.Unconfirmed)
+ SubmitTransactionToCW(t, it, cw, "triggerWithFourTopicsWithHashed", DynamicEvent{Field1: i1, Field2: i2, Field3: i3}, bindings[0], types.Unconfirmed)
}
// triggerStaticBytes emits a staticBytes events and returns the expected event bytes.
-func triggerStaticBytes[T TestingT[T]](t T, it ChainComponentsInterfaceTester[T], val1, val2, val3 uint32, val4 uint64, val5, val6, val7 [32]byte, raw []byte) {
+func triggerStaticBytes[T TestingT[T]](t T, it ChainComponentsInterfaceTester[T], cw clcommontypes.ContractWriter, bindings []clcommontypes.BoundContract, val1, val2, val3 uint32, val4 uint64, val5, val6, val7 [32]byte, raw []byte) {
type StaticBytesEvent struct {
Val1 uint32
Val2 uint32
@@ -369,8 +371,7 @@ func triggerStaticBytes[T TestingT[T]](t T, it ChainComponentsInterfaceTester[T]
Raw []byte
}
- contracts := it.GetBindings(t)
- SubmitTransactionToCW(t, it, "triggerStaticBytes",
+ SubmitTransactionToCW(t, it, cw, "triggerStaticBytes",
StaticBytesEvent{
Val1: val1,
Val2: val2,
@@ -381,5 +382,5 @@ func triggerStaticBytes[T TestingT[T]](t T, it ChainComponentsInterfaceTester[T]
Val7: val7,
Raw: raw,
},
- contracts[0], types.Unconfirmed)
+ bindings[0], types.Unconfirmed)
}
diff --git a/core/services/relay/evm/mercury/transmitter.go b/core/services/relay/evm/mercury/transmitter.go
index 4e57a3d07cf..be500593bf3 100644
--- a/core/services/relay/evm/mercury/transmitter.go
+++ b/core/services/relay/evm/mercury/transmitter.go
@@ -106,7 +106,6 @@ type BenchmarkPriceDecoder func(ctx context.Context, feedID mercuryutils.FeedID,
var _ Transmitter = (*mercuryTransmitter)(nil)
type TransmitterConfig interface {
- TransmitQueueMaxSize() uint32
TransmitTimeout() commonconfig.Duration
}
@@ -237,7 +236,7 @@ func (s *server) runQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup, feed
}
res, err := func(ctx context.Context) (*pb.TransmitResponse, error) {
ctx, cancel := context.WithTimeout(ctx, utils.WithJitter(s.transmitTimeout))
- cancel()
+ defer cancel()
return s.c.Transmit(ctx, t.Req)
}(ctx)
if ctx.Err() != nil {
@@ -287,14 +286,16 @@ func (s *server) runQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup, feed
}
}
+const TransmitQueueMaxSize = 10_000 // hardcode this for legacy transmitter since we want the config var to apply only to LLO
+
func newServer(lggr logger.Logger, cfg TransmitterConfig, client wsrpc.Client, pm *PersistenceManager, serverURL, feedIDHex string) *server {
return &server{
logger.Sugared(lggr),
cfg.TransmitTimeout().Duration(),
client,
pm,
- NewTransmitQueue(lggr, serverURL, feedIDHex, int(cfg.TransmitQueueMaxSize()), pm),
- make(chan *pb.TransmitRequest, int(cfg.TransmitQueueMaxSize())),
+ NewTransmitQueue(lggr, serverURL, feedIDHex, TransmitQueueMaxSize, pm),
+ make(chan *pb.TransmitRequest, TransmitQueueMaxSize),
serverURL,
transmitSuccessCount.WithLabelValues(feedIDHex, serverURL),
transmitDuplicateCount.WithLabelValues(feedIDHex, serverURL),
@@ -311,7 +312,7 @@ func NewTransmitter(lggr logger.Logger, cfg TransmitterConfig, clients map[strin
servers := make(map[string]*server, len(clients))
for serverURL, client := range clients {
cLggr := sugared.Named(serverURL).With("serverURL", serverURL)
- pm := NewPersistenceManager(cLggr, serverURL, orm, jobID, int(cfg.TransmitQueueMaxSize()), flushDeletesFrequency, pruneFrequency)
+ pm := NewPersistenceManager(cLggr, serverURL, orm, jobID, TransmitQueueMaxSize, flushDeletesFrequency, pruneFrequency)
servers[serverURL] = newServer(cLggr, cfg, client, pm, serverURL, feedIDHex)
}
return &mercuryTransmitter{
diff --git a/core/services/relay/evm/ocr3_capability_provider.go b/core/services/relay/evm/ocr3_capability_provider.go
index 00859befe4c..f5bfdf46da4 100644
--- a/core/services/relay/evm/ocr3_capability_provider.go
+++ b/core/services/relay/evm/ocr3_capability_provider.go
@@ -16,7 +16,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability"
+ ocr3_capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0"
"github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon"
)
diff --git a/core/services/relay/evm/read/batch.go b/core/services/relay/evm/read/batch.go
index 16333149f11..ce1c546ad73 100644
--- a/core/services/relay/evm/read/batch.go
+++ b/core/services/relay/evm/read/batch.go
@@ -241,32 +241,36 @@ func (c *defaultEvmBatchCaller) unpackBatchResults(
return nil, callErr
}
- if err = c.codec.Decode(
- ctx,
- packedBytes,
- call.ReturnVal,
- codec.WrapItemType(call.ContractName, call.ReadName, false),
- ); err != nil {
- if len(packedBytes) == 0 {
- callErr := newErrorFromCall(
- fmt.Errorf("%w: %w: %s", types.ErrInternal, errEmptyOutput, err.Error()),
- call, block, batchReadType,
- )
-
- callErr.Result = &hexEncodedOutputs[idx]
-
- results[idx].err = callErr
- } else {
- callErr := newErrorFromCall(
- fmt.Errorf("%w: codec decode result: %s", types.ErrInvalidType, err.Error()),
- call, block, batchReadType,
- )
-
- callErr.Result = &hexEncodedOutputs[idx]
- results[idx].err = callErr
- }
+ // the codec can't do anything with no bytes, so skip decoding and allow
+ // the result to be the empty struct or value
+ if len(packedBytes) > 0 {
+ if err = c.codec.Decode(
+ ctx,
+ packedBytes,
+ call.ReturnVal,
+ codec.WrapItemType(call.ContractName, call.ReadName, false),
+ ); err != nil {
+ if len(packedBytes) == 0 {
+ callErr := newErrorFromCall(
+ fmt.Errorf("%w: %w: %s", types.ErrInternal, errEmptyOutput, err.Error()),
+ call, block, batchReadType,
+ )
+
+ callErr.Result = &hexEncodedOutputs[idx]
+
+ results[idx].err = callErr
+ } else {
+ callErr := newErrorFromCall(
+ fmt.Errorf("%w: codec decode result: %s", types.ErrInvalidType, err.Error()),
+ call, block, batchReadType,
+ )
+
+ callErr.Result = &hexEncodedOutputs[idx]
+ results[idx].err = callErr
+ }
- continue
+ continue
+ }
}
results[idx].returnVal = call.ReturnVal
diff --git a/core/services/relay/evm/read/method.go b/core/services/relay/evm/read/method.go
index e988e4352f7..ed44e1aa9ca 100644
--- a/core/services/relay/evm/read/method.go
+++ b/core/services/relay/evm/read/method.go
@@ -2,6 +2,7 @@ package read
import (
"context"
+ "errors"
"fmt"
"math/big"
"sync"
@@ -22,6 +23,8 @@ import (
evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
)
+var ErrEmptyContractReturnValue = errors.New("the contract return value was empty")
+
type MethodBinding struct {
// read-only properties
contractName string
@@ -173,6 +176,12 @@ func (b *MethodBinding) GetLatestValueWithHeadData(ctx context.Context, addr com
return nil, callErr
}
+ // there may be cases where the contract value has not been set and the RPC returns with a value of 0x
+ // which is a set of empty bytes. there is no need for the codec to run in this case.
+ if len(bytes) == 0 {
+ return block.ToChainAgnosticHead(), nil
+ }
+
if err = b.codec.Decode(ctx, bytes, returnVal, codec.WrapItemType(b.contractName, b.method, false)); err != nil {
callErr := newErrorFromCall(
fmt.Errorf("%w: decode return data: %s", commontypes.ErrInvalidType, err.Error()),
diff --git a/core/services/relay/evm/statuschecker/txm_status_checker_test.go b/core/services/relay/evm/statuschecker/txm_status_checker_test.go
index 456d07e7a7d..7a682d708e2 100644
--- a/core/services/relay/evm/statuschecker/txm_status_checker_test.go
+++ b/core/services/relay/evm/statuschecker/txm_status_checker_test.go
@@ -10,12 +10,13 @@ import (
"github.com/stretchr/testify/mock"
"github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
"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, "")
+ tests.SkipShort(t, "")
ctx := context.Background()
mockTxManager := mocks.NewMockEvmTxManager(t)
checker := NewTxmStatusChecker(mockTxManager.GetTransactionStatus)
diff --git a/core/services/relay/evm/write_target.go b/core/services/relay/evm/write_target.go
index 994dbbb77ce..f14c13e5daa 100644
--- a/core/services/relay/evm/write_target.go
+++ b/core/services/relay/evm/write_target.go
@@ -11,7 +11,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/capabilities/targets"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
+ forwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0"
relayevmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
)
diff --git a/core/services/relay/evm/write_target_test.go b/core/services/relay/evm/write_target_test.go
index 24d7dd8646e..c82c9ba81b9 100644
--- a/core/services/relay/evm/write_target_test.go
+++ b/core/services/relay/evm/write_target_test.go
@@ -27,7 +27,7 @@ import (
txmmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr/mocks"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
evmmocks "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm/mocks"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
+ forwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0"
"github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
diff --git a/core/services/transmission/integration_test.go b/core/services/transmission/integration_test.go
deleted file mode 100644
index 6e38687313c..00000000000
--- a/core/services/transmission/integration_test.go
+++ /dev/null
@@ -1,495 +0,0 @@
-package transmission_test
-
-import (
- "math/big"
- "testing"
-
- "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/stretchr/testify/require"
-
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/mock_v3_aggregator_contract"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_consumer_interface_v08"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_mock"
-
- "github.com/ethereum/go-ethereum/core/types"
-
- evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/transmission/generated/entry_point"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/transmission/generated/greeter_wrapper"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/transmission/generated/paymaster_wrapper"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/transmission/generated/sca_wrapper"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/transmission/generated/smart_contract_account_factory"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/transmission/generated/smart_contract_account_helper"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
- "github.com/smartcontractkit/chainlink/v2/core/services/transmission"
-)
-
-var (
- greeterABI = evmtypes.MustGetABI(greeter_wrapper.GreeterABI)
- consumerABI = evmtypes.MustGetABI(solidity_vrf_consumer_interface_v08.VRFConsumerABI)
- entrypointABI = evmtypes.MustGetABI(entry_point.EntryPointABI)
-)
-
-type EntryPointUniverse struct {
- holder1 *bind.TransactOpts
- holder1Key ethkey.KeyV2
- holder2 *bind.TransactOpts
- backend evmtypes.Backend
- entryPointAddress common.Address
- entryPoint *entry_point.EntryPoint
- factoryAddress common.Address
- helper *smart_contract_account_helper.SmartContractAccountHelper
- greeterAddress common.Address
- greeter *greeter_wrapper.Greeter
- linkTokenAddress common.Address
- linkToken *link_token_interface.LinkToken
- linkEthFeedAddress common.Address
- vrfCoordinatorAddress common.Address
- vrfCoordinator *vrf_coordinator_mock.VRFCoordinatorMock
- vrfConsumerAddress common.Address
-}
-
-func deployTransmissionUniverse(t *testing.T) *EntryPointUniverse {
- // Create a key for holder1 that we can use to sign
- holder1Key := cltest.MustGenerateRandomKey(t)
- t.Log("Holder key:", holder1Key.String())
-
- // Construct simulated blockchain environment.
- holder1Transactor, err := bind.NewKeyedTransactorWithChainID(holder1Key.ToEcdsaPrivKey(), testutils.SimulatedChainID)
- require.NoError(t, err)
- var (
- holder1 = holder1Transactor
- holder2 = testutils.MustNewSimTransactor(t)
- )
- genesisData := types.GenesisAlloc{
- holder1.From: {Balance: assets.Ether(1000).ToInt()},
- holder2.From: {Balance: assets.Ether(1000).ToInt()},
- }
- backend := cltest.NewSimulatedBackend(t, genesisData, 30e6)
- backend.Commit()
-
- // Setup all contracts and addresses used by tests.
- entryPointAddress, _, entryPoint, err := entry_point.DeployEntryPoint(holder1, backend.Client())
- require.NoError(t, err)
- factoryAddress, _, _, _ := smart_contract_account_factory.DeploySmartContractAccountFactory(holder1, backend.Client())
- require.NoError(t, err)
- _, _, helper, err := smart_contract_account_helper.DeploySmartContractAccountHelper(holder1, backend.Client())
- require.NoError(t, err)
- greeterAddress, _, greeter, err := greeter_wrapper.DeployGreeter(holder1, backend.Client())
- require.NoError(t, err)
- linkTokenAddress, _, linkToken, err := link_token_interface.DeployLinkToken(holder1, backend.Client())
- require.NoError(t, err)
- linkEthFeedAddress, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(
- holder1,
- backend.Client(),
- 18,
- (*big.Int)(assets.GWei(5000000)), // .005 ETH
- )
- require.NoError(t, err)
- vrfCoordinatorAddress, _, vrfCoordinator, err := vrf_coordinator_mock.DeployVRFCoordinatorMock(holder1, backend.Client(), linkTokenAddress)
- require.NoError(t, err)
- vrfConsumerAddress, _, _, err := solidity_vrf_consumer_interface_v08.DeployVRFConsumer(holder1, backend.Client(), vrfCoordinatorAddress, linkTokenAddress)
- require.NoError(t, err)
- backend.Commit()
-
- return &EntryPointUniverse{
- holder1: holder1,
- holder1Key: holder1Key,
- holder2: holder2,
- backend: backend,
- entryPointAddress: entryPointAddress,
- entryPoint: entryPoint,
- factoryAddress: factoryAddress,
- helper: helper,
- greeterAddress: greeterAddress,
- greeter: greeter,
- linkTokenAddress: linkTokenAddress,
- linkToken: linkToken,
- linkEthFeedAddress: linkEthFeedAddress,
- vrfCoordinatorAddress: vrfCoordinatorAddress,
- vrfCoordinator: vrfCoordinator,
- vrfConsumerAddress: vrfConsumerAddress,
- }
-}
-
-func Test4337Basic(t *testing.T) {
- // Deploy universe.
- universe := deployTransmissionUniverse(t)
- holder1 := universe.holder1
- holder2 := universe.holder2
- backend := universe.backend
-
- // Ensure no greeting is already set.
- initialGreeting, err := universe.greeter.GetGreeting(nil)
- require.NoError(t, err)
- require.Equal(t, "", initialGreeting)
-
- // Get the address at which the Smart Contract Account will be deployed.
- toDeployAddress, err := universe.helper.CalculateSmartContractAccountAddress(
- nil,
- holder1.From,
- universe.entryPointAddress,
- universe.factoryAddress,
- )
- require.NoError(t, err)
- t.Log("Smart Contract Account Address:", toDeployAddress)
-
- // Get the initialization code for the Smart Contract Account.
- fullInitializeCode, err := universe.helper.GetInitCode(nil, universe.factoryAddress, holder1.From, universe.entryPointAddress)
- require.NoError(t, err)
- t.Log("Full initialization code:", common.Bytes2Hex(fullInitializeCode))
-
- // Construct calldata for setGreeting.
- encodedGreetingCall, err := greeterABI.Pack("setGreeting", "bye")
- require.NoError(t, err)
- t.Log("Encoded greeting call:", common.Bytes2Hex(encodedGreetingCall))
-
- // Construct the calldata to be passed in the user operation.
- var (
- value = big.NewInt(0)
- nonce = big.NewInt(0)
- deadline = big.NewInt(1000)
- )
- fullEncoding, err := universe.helper.GetFullEndTxEncoding(nil, universe.greeterAddress, value, deadline, encodedGreetingCall)
- require.NoError(t, err)
- t.Log("Full user operation calldata:", common.Bytes2Hex(fullEncoding))
-
- // Construct and execute user operation.
- userOp := entry_point.UserOperation{
- Sender: toDeployAddress,
- Nonce: nonce,
- InitCode: fullInitializeCode,
- CallData: fullEncoding,
- CallGasLimit: big.NewInt(10_000_000),
- VerificationGasLimit: big.NewInt(10_000_000),
- PreVerificationGas: big.NewInt(10_000_000),
- MaxFeePerGas: big.NewInt(100),
- MaxPriorityFeePerGas: big.NewInt(200),
- PaymasterAndData: []byte(""),
- Signature: []byte(""),
- }
-
- // Generate hash from user operation, sign it, and include it in the user operation.
- userOpHash, err := universe.entryPoint.GetUserOpHash(nil, userOp)
- require.NoError(t, err)
- fullHash, err := universe.helper.GetFullHashForSigning(nil, userOpHash, toDeployAddress)
- require.NoError(t, err)
- t.Log("Full hash for signing:", common.Bytes2Hex(fullHash[:]))
- sig, err := transmission.SignMessage(universe.holder1Key.ToEcdsaPrivKey(), fullHash[:])
- require.NoError(t, err)
- t.Log("Signature:", common.Bytes2Hex(sig))
- userOp.Signature = sig
-
- // Deposit to the SCA's account to pay for this transaction.
- holder1.Value = assets.Ether(10).ToInt()
- tx, err := universe.entryPoint.DepositTo(holder1, toDeployAddress)
- require.NoError(t, err)
- backend.Commit()
- _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx)
- require.NoError(t, err)
- holder1.Value = assets.Ether(0).ToInt()
- balance, err := universe.entryPoint.BalanceOf(nil, toDeployAddress)
- require.NoError(t, err)
- require.Equal(t, assets.Ether(10).ToInt(), balance)
-
- // Run handleOps from holder2's account, to demonstrate that any account can execute this signed user operation.
- tx, err = universe.entryPoint.HandleOps(holder2, []entry_point.UserOperation{userOp}, holder1.From)
- require.NoError(t, err)
- backend.Commit()
- _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx)
- require.NoError(t, err)
-
- // Ensure "bye" was successfully set as the greeting.
- greetingResult, err := universe.greeter.GetGreeting(nil)
- require.NoError(t, err)
- require.Equal(t, "bye", greetingResult)
-
- // Assert smart contract account is created and nonce incremented.
- sca, err := sca_wrapper.NewSCA(toDeployAddress, backend.Client())
- require.NoError(t, err)
- onChainNonce, err := sca.SNonce(nil)
- require.NoError(t, err)
- require.Equal(t, big.NewInt(1), onChainNonce)
-}
-
-func Test4337WithLinkTokenPaymaster(t *testing.T) {
- // Deploy universe.
- universe := deployTransmissionUniverse(t)
- holder1 := universe.holder1
- holder2 := universe.holder2
- backend := universe.backend
-
- // Ensure no greeting is already set.
- initialGreeting, err := universe.greeter.GetGreeting(nil)
- require.NoError(t, err)
- require.Equal(t, "", initialGreeting)
-
- // Get the address at which the Smart Contract Account will be deployed.
- toDeployAddress, err := universe.helper.CalculateSmartContractAccountAddress(
- nil,
- holder1.From,
- universe.entryPointAddress,
- universe.factoryAddress,
- )
- require.NoError(t, err)
- t.Log("Smart Contract Account Address:", toDeployAddress)
-
- // Get the initialization code for the Smart Contract Account.
- fullInitializeCode, err := universe.helper.GetInitCode(nil, universe.factoryAddress, holder1.From, universe.entryPointAddress)
- require.NoError(t, err)
- t.Log("Full initialization code:", common.Bytes2Hex(fullInitializeCode))
-
- // Construct calldata for setGreeting.
- encodedGreetingCall, err := greeterABI.Pack("setGreeting", "bye")
- require.NoError(t, err)
- t.Log("Encoded greeting call:", common.Bytes2Hex(encodedGreetingCall))
-
- // Construct the calldata to be passed in the user operation.
- var (
- value = big.NewInt(0)
- nonce = big.NewInt(0)
- deadline = big.NewInt(1000)
- )
- fullEncoding, err := universe.helper.GetFullEndTxEncoding(nil, universe.greeterAddress, value, deadline, encodedGreetingCall)
- require.NoError(t, err)
- t.Log("Full user operation calldata:", common.Bytes2Hex(fullEncoding))
-
- // Deposit to LINK paymaster.
- linkTokenAddress, _, linkToken, err := link_token_interface.DeployLinkToken(holder1, backend.Client())
- require.NoError(t, err)
- linkEthFeedAddress, _, _, err := mock_v3_aggregator_contract.DeployMockV3AggregatorContract(
- holder1,
- backend.Client(),
- 18,
- (*big.Int)(assets.GWei(5000000)), // .005 ETH
- )
- require.NoError(t, err)
- paymasterAddress, _, _, err := paymaster_wrapper.DeployPaymaster(holder1, backend.Client(), linkTokenAddress, linkEthFeedAddress, universe.entryPointAddress)
- require.NoError(t, err)
- backend.Commit()
- tx, err := linkToken.TransferAndCall(
- holder1,
- paymasterAddress,
- assets.Ether(1000).ToInt(),
- common.LeftPadBytes(toDeployAddress.Bytes(), 32),
- )
- require.NoError(t, err)
- backend.Commit()
- _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx)
- require.NoError(t, err)
-
- // Construct and execute user operation.
- userOp := entry_point.UserOperation{
- Sender: toDeployAddress,
- Nonce: nonce,
- InitCode: fullInitializeCode,
- CallData: fullEncoding,
- CallGasLimit: big.NewInt(10_000_000),
- VerificationGasLimit: big.NewInt(10_000_000),
- PreVerificationGas: big.NewInt(10_000_000),
- MaxFeePerGas: big.NewInt(100),
- MaxPriorityFeePerGas: big.NewInt(200),
- PaymasterAndData: paymasterAddress.Bytes(),
- Signature: []byte(""),
- }
-
- // Generate hash from user operation, sign it, and include it in the user operation.
- userOpHash, err := universe.entryPoint.GetUserOpHash(nil, userOp)
- require.NoError(t, err)
- fullHash, err := universe.helper.GetFullHashForSigning(nil, userOpHash, toDeployAddress)
- require.NoError(t, err)
- t.Log("Full hash for signing:", common.Bytes2Hex(fullHash[:]))
- sig, err := transmission.SignMessage(universe.holder1Key.ToEcdsaPrivKey(), fullHash[:])
- require.NoError(t, err)
- t.Log("Signature:", common.Bytes2Hex(sig))
- userOp.Signature = sig
-
- // Deposit to the Paymaster's account to pay for this transaction.
- holder1.Value = assets.Ether(10).ToInt()
- tx, err = universe.entryPoint.DepositTo(holder1, paymasterAddress)
- require.NoError(t, err)
- backend.Commit()
- _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx)
- require.NoError(t, err)
- holder1.Value = assets.Ether(0).ToInt()
- balance, err := universe.entryPoint.BalanceOf(nil, paymasterAddress)
- require.NoError(t, err)
- require.Equal(t, assets.Ether(10).ToInt(), balance)
-
- // Run handleOps from holder2's account, to demonstrate that any account can execute this signed user operation.
- tx, err = universe.entryPoint.HandleOps(holder2, []entry_point.UserOperation{userOp}, holder1.From)
- require.NoError(t, err)
- backend.Commit()
- _, err = bind.WaitMined(testutils.Context(t), backend.Client(), tx)
- require.NoError(t, err)
-
- // Ensure "bye" was successfully set as the greeting.
- greetingResult, err := universe.greeter.GetGreeting(nil)
- require.NoError(t, err)
- require.Equal(t, "bye", greetingResult)
-
- // Assert smart contract account is created and nonce incremented.
- sca, err := sca_wrapper.NewSCA(toDeployAddress, backend.Client())
- require.NoError(t, err)
- onChainNonce, err := sca.SNonce(nil)
- require.NoError(t, err)
- require.Equal(t, big.NewInt(1), onChainNonce)
-}
-
-func Test4337WithLinkTokenVRFRequestAndPaymaster(t *testing.T) {
- // Deploy universe.
- universe := deployTransmissionUniverse(t)
- holder1 := universe.holder1
- holder2 := universe.holder2
- backend := universe.backend
-
- // Get the address at which the Smart Contract Account will be deployed.
- toDeployAddress, err := universe.helper.CalculateSmartContractAccountAddress(
- nil,
- holder1.From,
- universe.entryPointAddress,
- universe.factoryAddress,
- )
- require.NoError(t, err)
- t.Log("Smart Contract Account Address:", toDeployAddress)
-
- // Get the initialization code for the Smart Contract Account.
- fullInitializeCode, err := universe.helper.GetInitCode(nil, universe.factoryAddress, holder1.From, universe.entryPointAddress)
- require.NoError(t, err)
- t.Log("Full initialization code:", common.Bytes2Hex(fullInitializeCode))
-
- // Construct calldata for the vrf request.
- var keyhash [32]byte
- copy(keyhash[:], common.LeftPadBytes(big.NewInt(123).Bytes(), 32))
- var fee = assets.Ether(1).ToInt()
- encodedVRFRequest, err := consumerABI.Pack("doRequestRandomness", keyhash, fee)
- require.NoError(t, err)
- t.Log("Encoded vrf request:", common.Bytes2Hex(encodedVRFRequest))
-
- // Construct the calldata to be passed in the user operation.
- var (
- value = big.NewInt(0)
- nonce = big.NewInt(0)
- deadline = big.NewInt(1000)
- )
- fullEncoding, err := universe.helper.GetFullEndTxEncoding(nil, universe.vrfConsumerAddress, value, deadline, encodedVRFRequest)
- require.NoError(t, err)
- t.Log("Full user operation calldata:", common.Bytes2Hex(fullEncoding))
-
- // Deposit to LINK paymaster.
- paymasterAddress, _, _, err := paymaster_wrapper.DeployPaymaster(holder1, backend.Client(), universe.linkTokenAddress, universe.linkEthFeedAddress, universe.entryPointAddress)
- require.NoError(t, err)
- backend.Commit()
- tx, err := universe.linkToken.TransferAndCall(
- holder1,
- paymasterAddress,
- assets.Ether(1000).ToInt(),
- common.LeftPadBytes(toDeployAddress.Bytes(), 32),
- )
- require.NoError(t, err)
- backend.Commit()
-
- ctx := testutils.Context(t)
- _, err = bind.WaitMined(ctx, backend.Client(), tx)
- require.NoError(t, err)
-
- // Generate encoded paymaster data to fund the VRF consumer.
- encodedPaymasterData, err := universe.helper.GetAbiEncodedDirectRequestData(nil, universe.vrfConsumerAddress, fee, fee)
- require.NoError(t, err)
-
- // Construct and execute user operation.
- userOp := entry_point.UserOperation{
- Sender: toDeployAddress,
- Nonce: nonce,
- InitCode: fullInitializeCode,
- CallData: fullEncoding,
- CallGasLimit: big.NewInt(10_000_000),
- VerificationGasLimit: big.NewInt(10_000_000),
- PreVerificationGas: big.NewInt(10_000_000),
- MaxFeePerGas: big.NewInt(100),
- MaxPriorityFeePerGas: big.NewInt(200),
- PaymasterAndData: append(append(paymasterAddress.Bytes(), byte(0)), encodedPaymasterData...),
- Signature: []byte(""),
- }
-
- // Generate hash from user operation, sign it, and include it in the user operation.
- userOpHash, err := universe.entryPoint.GetUserOpHash(nil, userOp)
- require.NoError(t, err)
- fullHash, err := universe.helper.GetFullHashForSigning(nil, userOpHash, toDeployAddress)
- require.NoError(t, err)
- t.Log("Full hash for signing:", common.Bytes2Hex(fullHash[:]))
- sig, err := transmission.SignMessage(universe.holder1Key.ToEcdsaPrivKey(), fullHash[:])
- require.NoError(t, err)
- t.Log("Signature:", common.Bytes2Hex(sig))
- userOp.Signature = sig
-
- // Deposit to the Paymaster's account to pay for this transaction.
- holder1.Value = assets.Ether(10).ToInt()
- tx, err = universe.entryPoint.DepositTo(holder1, paymasterAddress)
- require.NoError(t, err)
- backend.Commit()
- _, err = bind.WaitMined(ctx, backend.Client(), tx)
- require.NoError(t, err)
- holder1.Value = assets.Ether(0).ToInt()
- balance, err := universe.entryPoint.BalanceOf(nil, paymasterAddress)
- require.NoError(t, err)
- require.Equal(t, assets.Ether(10).ToInt(), balance)
-
- // Run handleOps from holder2's account, to demonstrate that any account can execute this signed user operation.
- // Manually execute transaction to test ABI packing.
- gasPrice, err := backend.Client().SuggestGasPrice(ctx)
- require.NoError(t, err)
- accountNonce, err := backend.Client().PendingNonceAt(ctx, holder2.From)
- require.NoError(t, err)
- payload, err := entrypointABI.Pack("handleOps", []entry_point.UserOperation{userOp}, holder1.From)
- require.NoError(t, err)
- gas, err := backend.Client().EstimateGas(ctx, ethereum.CallMsg{
- From: holder2.From,
- To: &universe.entryPointAddress,
- Gas: 0,
- Data: payload,
- GasPrice: gasPrice,
- })
- unsigned := types.NewTx(&types.LegacyTx{
- Nonce: accountNonce,
- Gas: gas,
- To: &universe.entryPointAddress,
- Value: big.NewInt(0),
- Data: payload,
- GasPrice: gasPrice,
- })
- require.NoError(t, err)
- signedtx, err := holder2.Signer(holder2.From, unsigned)
- require.NoError(t, err)
- err = backend.Client().SendTransaction(ctx, signedtx)
- require.NoError(t, err)
- backend.Commit()
- receipt, err := bind.WaitMined(ctx, backend.Client(), signedtx)
- require.NoError(t, err)
- t.Log("Receipt:", receipt.Status)
-
- // Assert the VRF request was correctly made.
- logs, err := backend.Client().FilterLogs(ctx, ethereum.FilterQuery{
- Addresses: []common.Address{universe.vrfCoordinatorAddress},
- })
- require.NoError(t, err)
- require.Equal(t, 1, len(logs))
- randomnessRequestLog, err := universe.vrfCoordinator.ParseRandomnessRequest(logs[0])
- require.NoError(t, err)
- require.Equal(t, fee, randomnessRequestLog.Fee)
- require.Equal(t, keyhash, randomnessRequestLog.KeyHash)
- require.Equal(t, universe.vrfConsumerAddress, randomnessRequestLog.Sender)
-
- // Assert smart contract account is created and nonce incremented.
- sca, err := sca_wrapper.NewSCA(toDeployAddress, backend.Client())
- require.NoError(t, err)
- onChainNonce, err := sca.SNonce(nil)
- require.NoError(t, err)
- require.Equal(t, big.NewInt(1), onChainNonce)
-}
diff --git a/core/services/transmission/signature.go b/core/services/transmission/signature.go
deleted file mode 100644
index 50b7bc584dc..00000000000
--- a/core/services/transmission/signature.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package transmission
-
-import (
- "crypto/ecdsa"
-
- "github.com/ethereum/go-ethereum/crypto"
-)
-
-func SignMessage(
- ownerPrivateKey *ecdsa.PrivateKey,
- message []byte,
-) ([]byte, error) {
- sig, err := crypto.Sign(message, ownerPrivateKey)
- if err != nil {
- return nil, err
- }
-
- return sig, nil
-}
diff --git a/core/services/vrf/delegate.go b/core/services/vrf/delegate.go
index c5b4df3f811..ec2139c014f 100644
--- a/core/services/vrf/delegate.go
+++ b/core/services/vrf/delegate.go
@@ -17,12 +17,12 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/log"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/batch_vrf_coordinator_v2"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_coordinator_interface"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2_5"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_owner"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore"
diff --git a/core/services/vrf/mocks/aggregator_v3_interface.go b/core/services/vrf/mocks/aggregator_v3_interface.go
index e5c1e215645..3bd209b538f 100644
--- a/core/services/vrf/mocks/aggregator_v3_interface.go
+++ b/core/services/vrf/mocks/aggregator_v3_interface.go
@@ -5,7 +5,7 @@ package mocks
import (
big "math/big"
- aggregator_v3_interface "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
+ aggregator_v3_interface "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface"
bind "github.com/ethereum/go-ethereum/accounts/abi/bind"
diff --git a/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go b/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go
index 98ca510a9ca..8b88ad73ea9 100644
--- a/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go
+++ b/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go
@@ -139,23 +139,6 @@ func TestVRFV08_CompareFieldHash(t *testing.T) {
}
}
-// randomKey deterministically generates a secp256k1 key.
-//
-// Never use this if cryptographic security is required
-//func randomKey(t *testing.T, r *mrand.Rand) *ecdsa.PrivateKey {
-// secretKey := vrfkey.FieldSize
-// for secretKey.Cmp(vrfkey.FieldSize) >= 0 { // Keep picking until secretKey < fieldSize
-// secretKey = randomUint256(t, r)
-// }
-// cKey := crypto.ToECDSAUnsafe(secretKey.Bytes())
-// return cKey
-//}
-//
-// pair returns the inputs as a length-2 big.Int array. Useful for translating
-// coordinates to the uint256[2]'s VRF.sol uses to represent secp256k1 points.
-//func pair(x, y *big.Int) [2]*big.Int { return [2]*big.Int{x, y} }
-//func asPair(p kyber.Point) [2]*big.Int { return pair(secp256k1.Coordinates(p)) }
-
func TestVRFV08_CompareHashToCurve(t *testing.T) {
t.Parallel()
r := mrand.New(mrand.NewSource(4))
@@ -173,40 +156,6 @@ func TestVRFV08_CompareHashToCurve(t *testing.T) {
}
}
-// randomPoint deterministically simulates a uniform sample of secp256k1 points,
-// given r's seed
-//
-// Never use this if cryptographic security is required
-//func randomPoint(t *testing.T, r *mrand.Rand) kyber.Point {
-// p, err := vrfkey.HashToCurve(vrfkey.Generator, randomUint256(t, r), func(*big.Int) {})
-// require.NoError(t, err,
-// "failed to hash random value to secp256k1 while generating random point")
-// if r.Int63n(2) == 1 { // Uniform sample of ±p
-// p.Neg(p)
-// }
-// return p
-//}
-//
-//// randomPointWithPair returns a random secp256k1, both as a kyber.Point and as
-//// a pair of *big.Int's. Useful for translating between the types needed by the
-//// golang contract wrappers.
-//func randomPointWithPair(t *testing.T, r *mrand.Rand) (kyber.Point, [2]*big.Int) {
-// p := randomPoint(t, r)
-// return p, asPair(p)
-//}
-
-// randomScalar deterministically simulates a uniform sample of secp256k1
-// scalars, given r's seed
-//
-// Never use this if cryptographic security is required
-//func randomScalar(t *testing.T, r *mrand.Rand) kyber.Scalar {
-// s := randomUint256(t, r)
-// for s.Cmp(secp256k1.GroupOrder) >= 0 {
-// s = randomUint256(t, r)
-// }
-// return secp256k1.IntToScalar(s)
-//}
-
func TestVRFV08_CheckSolidityPointAddition(t *testing.T) {
t.Parallel()
r := mrand.New(mrand.NewSource(5))
diff --git a/core/services/vrf/v2/integration_v2_plus_test.go b/core/services/vrf/v2/integration_v2_plus_test.go
index 75cffe1057c..d1cc030043d 100644
--- a/core/services/vrf/v2/integration_v2_plus_test.go
+++ b/core/services/vrf/v2/integration_v2_plus_test.go
@@ -17,6 +17,7 @@ import (
"github.com/stretchr/testify/require"
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
@@ -66,7 +67,7 @@ type coordinatorV2PlusUniverse struct {
}
func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumers int, trusting bool) coordinatorV2PlusUniverse {
- testutils.SkipShort(t, "VRFCoordinatorV2Universe")
+ tests.SkipShort(t, "VRFCoordinatorV2Universe")
oracleTransactor, err := bind.NewKeyedTransactorWithChainID(key.ToEcdsaPrivKey(), testutils.SimulatedChainID)
require.NoError(t, err)
var (
diff --git a/core/services/vrf/v2/integration_v2_test.go b/core/services/vrf/v2/integration_v2_test.go
index d9086a52a33..6cbcc799e1b 100644
--- a/core/services/vrf/v2/integration_v2_test.go
+++ b/core/services/vrf/v2/integration_v2_test.go
@@ -31,6 +31,8 @@ import (
commonassets "github.com/smartcontractkit/chainlink-common/pkg/assets"
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
"github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
txmgrcommon "github.com/smartcontractkit/chainlink/v2/common/txmgr"
txmgrtypes "github.com/smartcontractkit/chainlink/v2/common/txmgr/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
@@ -145,7 +147,7 @@ func makeTestTxm(t *testing.T, txStore txmgr.TestEvmTxStore, keyStore keystore.M
}
func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers int) coordinatorV2Universe {
- testutils.SkipShort(t, "VRFCoordinatorV2Universe")
+ tests.SkipShort(t, "VRFCoordinatorV2Universe")
oracleTransactor, err := bind.NewKeyedTransactorWithChainID(key.ToEcdsaPrivKey(), testutils.SimulatedChainID)
require.NoError(t, err)
var (
diff --git a/core/services/vrf/v2/listener_v2.go b/core/services/vrf/v2/listener_v2.go
index e820cff63b7..b9238d394a7 100644
--- a/core/services/vrf/v2/listener_v2.go
+++ b/core/services/vrf/v2/listener_v2.go
@@ -21,12 +21,12 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/batch_vrf_coordinator_v2"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/batch_vrf_coordinator_v2plus"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2plus_interface"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_owner"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore"
diff --git a/core/services/workflows/engine.go b/core/services/workflows/engine.go
index 943802d1962..d153e53bc07 100644
--- a/core/services/workflows/engine.go
+++ b/core/services/workflows/engine.go
@@ -28,7 +28,7 @@ import (
)
const (
- fifteenMinutesMs = 15 * 60 * 1000
+ fifteenMinutesSec = 15 * 60
reservedFieldNameStepTimeout = "cre_step_timeout"
maxStepTimeoutOverrideSec = 10 * 60 // 10 minutes
)
@@ -446,7 +446,7 @@ func (e *Engine) registerTrigger(ctx context.Context, t *triggerCapability, trig
}
eventsCh, err := t.trigger.RegisterTrigger(ctx, triggerRegRequest)
if err != nil {
- e.metrics.incrementRegisterTriggerFailureCounter(ctx)
+ e.metrics.with(platform.KeyTriggerID, triggerID).incrementRegisterTriggerFailureCounter(ctx)
// It's confusing that t.ID is different from triggerID, but
// t.ID is the capability ID, and triggerID is the trigger ID.
//
@@ -704,7 +704,7 @@ func (e *Engine) finishExecution(ctx context.Context, cma custmsg.MessageEmitter
e.metrics.updateWorkflowTimeoutDurationHistogram(ctx, executionDuration)
}
- if executionDuration > fifteenMinutesMs {
+ if executionDuration > fifteenMinutesSec {
logCustMsg(ctx, cma, fmt.Sprintf("execution duration exceeded 15 minutes: %d (seconds)", executionDuration), l)
l.Warnf("execution duration exceeded 15 minutes: %d (seconds)", executionDuration)
}
diff --git a/core/services/workflows/monitoring.go b/core/services/workflows/monitoring.go
index 8457dadeb60..b73ee6e5eda 100644
--- a/core/services/workflows/monitoring.go
+++ b/core/services/workflows/monitoring.go
@@ -143,19 +143,19 @@ func MetricViews() []sdkmetric.View {
sdkmetric.NewView(
sdkmetric.Instrument{Name: "platform_engine_workflow_earlyexit_time_seconds"},
sdkmetric.Stream{Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
- Boundaries: []float64{0, 1, 10, 100},
+ Boundaries: []float64{0, 1, 10, 30, 120},
}},
),
sdkmetric.NewView(
sdkmetric.Instrument{Name: "platform_engine_workflow_completed_time_seconds"},
sdkmetric.Stream{Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
- Boundaries: []float64{0, 100, 1000, 10_000, 50_000, 100_0000, 500_000},
+ Boundaries: []float64{0, 10, 30, 60, 120, 300, 600, 900, 1200},
}},
),
sdkmetric.NewView(
sdkmetric.Instrument{Name: "platform_engine_workflow_error_time_seconds"},
sdkmetric.Stream{Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
- Boundaries: []float64{0, 20, 60, 120, 240},
+ Boundaries: []float64{0, 30, 60, 120, 240, 600},
}},
),
sdkmetric.NewView(
diff --git a/core/services/workflows/syncer/contract_reader_mock.go b/core/services/workflows/syncer/contract_reader_mock.go
deleted file mode 100644
index e6e7c8385f5..00000000000
--- a/core/services/workflows/syncer/contract_reader_mock.go
+++ /dev/null
@@ -1,302 +0,0 @@
-// Code generated by mockery v2.46.3. DO NOT EDIT.
-
-package syncer
-
-import (
- context "context"
-
- query "github.com/smartcontractkit/chainlink-common/pkg/types/query"
- primitives "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
- mock "github.com/stretchr/testify/mock"
-
- types "github.com/smartcontractkit/chainlink-common/pkg/types"
-)
-
-// MockContractReader is an autogenerated mock type for the ContractReader type
-type MockContractReader struct {
- mock.Mock
-}
-
-type MockContractReader_Expecter struct {
- mock *mock.Mock
-}
-
-func (_m *MockContractReader) EXPECT() *MockContractReader_Expecter {
- return &MockContractReader_Expecter{mock: &_m.Mock}
-}
-
-// Bind provides a mock function with given fields: _a0, _a1
-func (_m *MockContractReader) Bind(_a0 context.Context, _a1 []types.BoundContract) error {
- ret := _m.Called(_a0, _a1)
-
- if len(ret) == 0 {
- panic("no return value specified for Bind")
- }
-
- var r0 error
- if rf, ok := ret.Get(0).(func(context.Context, []types.BoundContract) error); ok {
- r0 = rf(_a0, _a1)
- } else {
- r0 = ret.Error(0)
- }
-
- return r0
-}
-
-// MockContractReader_Bind_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Bind'
-type MockContractReader_Bind_Call struct {
- *mock.Call
-}
-
-// Bind is a helper method to define mock.On call
-// - _a0 context.Context
-// - _a1 []types.BoundContract
-func (_e *MockContractReader_Expecter) Bind(_a0 interface{}, _a1 interface{}) *MockContractReader_Bind_Call {
- return &MockContractReader_Bind_Call{Call: _e.mock.On("Bind", _a0, _a1)}
-}
-
-func (_c *MockContractReader_Bind_Call) Run(run func(_a0 context.Context, _a1 []types.BoundContract)) *MockContractReader_Bind_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(context.Context), args[1].([]types.BoundContract))
- })
- return _c
-}
-
-func (_c *MockContractReader_Bind_Call) Return(_a0 error) *MockContractReader_Bind_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockContractReader_Bind_Call) RunAndReturn(run func(context.Context, []types.BoundContract) error) *MockContractReader_Bind_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// Close provides a mock function with given fields:
-func (_m *MockContractReader) Close() error {
- ret := _m.Called()
-
- if len(ret) == 0 {
- panic("no return value specified for Close")
- }
-
- var r0 error
- if rf, ok := ret.Get(0).(func() error); ok {
- r0 = rf()
- } else {
- r0 = ret.Error(0)
- }
-
- return r0
-}
-
-// MockContractReader_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
-type MockContractReader_Close_Call struct {
- *mock.Call
-}
-
-// Close is a helper method to define mock.On call
-func (_e *MockContractReader_Expecter) Close() *MockContractReader_Close_Call {
- return &MockContractReader_Close_Call{Call: _e.mock.On("Close")}
-}
-
-func (_c *MockContractReader_Close_Call) Run(run func()) *MockContractReader_Close_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockContractReader_Close_Call) Return(_a0 error) *MockContractReader_Close_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockContractReader_Close_Call) RunAndReturn(run func() error) *MockContractReader_Close_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// GetLatestValueWithHeadData provides a mock function with given fields: ctx, readName, confidenceLevel, params, returnVal
-func (_m *MockContractReader) GetLatestValueWithHeadData(ctx context.Context, readName string, confidenceLevel primitives.ConfidenceLevel, params any, returnVal any) (*types.Head, error) {
- ret := _m.Called(ctx, readName, confidenceLevel, params, returnVal)
-
- if len(ret) == 0 {
- panic("no return value specified for GetLatestValueWithHeadData")
- }
-
- var r0 *types.Head
- var r1 error
- if rf, ok := ret.Get(0).(func(context.Context, string, primitives.ConfidenceLevel, any, any) (*types.Head, error)); ok {
- return rf(ctx, readName, confidenceLevel, params, returnVal)
- }
- if rf, ok := ret.Get(0).(func(context.Context, string, primitives.ConfidenceLevel, any, any) *types.Head); ok {
- r0 = rf(ctx, readName, confidenceLevel, params, returnVal)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(*types.Head)
- }
- }
-
- if rf, ok := ret.Get(1).(func(context.Context, string, primitives.ConfidenceLevel, any, any) error); ok {
- r1 = rf(ctx, readName, confidenceLevel, params, returnVal)
- } else {
- r1 = ret.Error(1)
- }
-
- return r0, r1
-}
-
-// MockContractReader_GetLatestValueWithHeadData_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestValueWithHeadData'
-type MockContractReader_GetLatestValueWithHeadData_Call struct {
- *mock.Call
-}
-
-// GetLatestValueWithHeadData is a helper method to define mock.On call
-// - ctx context.Context
-// - readName string
-// - confidenceLevel primitives.ConfidenceLevel
-// - params any
-// - returnVal any
-func (_e *MockContractReader_Expecter) GetLatestValueWithHeadData(ctx interface{}, readName interface{}, confidenceLevel interface{}, params interface{}, returnVal interface{}) *MockContractReader_GetLatestValueWithHeadData_Call {
- return &MockContractReader_GetLatestValueWithHeadData_Call{Call: _e.mock.On("GetLatestValueWithHeadData", ctx, readName, confidenceLevel, params, returnVal)}
-}
-
-func (_c *MockContractReader_GetLatestValueWithHeadData_Call) Run(run func(ctx context.Context, readName string, confidenceLevel primitives.ConfidenceLevel, params any, returnVal any)) *MockContractReader_GetLatestValueWithHeadData_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(context.Context), args[1].(string), args[2].(primitives.ConfidenceLevel), args[3].(any), args[4].(any))
- })
- return _c
-}
-
-func (_c *MockContractReader_GetLatestValueWithHeadData_Call) Return(head *types.Head, err error) *MockContractReader_GetLatestValueWithHeadData_Call {
- _c.Call.Return(head, err)
- return _c
-}
-
-func (_c *MockContractReader_GetLatestValueWithHeadData_Call) RunAndReturn(run func(context.Context, string, primitives.ConfidenceLevel, any, any) (*types.Head, error)) *MockContractReader_GetLatestValueWithHeadData_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// QueryKey provides a mock function with given fields: _a0, _a1, _a2, _a3, _a4
-func (_m *MockContractReader) QueryKey(_a0 context.Context, _a1 types.BoundContract, _a2 query.KeyFilter, _a3 query.LimitAndSort, _a4 any) ([]types.Sequence, error) {
- ret := _m.Called(_a0, _a1, _a2, _a3, _a4)
-
- if len(ret) == 0 {
- panic("no return value specified for QueryKey")
- }
-
- var r0 []types.Sequence
- var r1 error
- if rf, ok := ret.Get(0).(func(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) ([]types.Sequence, error)); ok {
- return rf(_a0, _a1, _a2, _a3, _a4)
- }
- if rf, ok := ret.Get(0).(func(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) []types.Sequence); ok {
- r0 = rf(_a0, _a1, _a2, _a3, _a4)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).([]types.Sequence)
- }
- }
-
- if rf, ok := ret.Get(1).(func(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) error); ok {
- r1 = rf(_a0, _a1, _a2, _a3, _a4)
- } else {
- r1 = ret.Error(1)
- }
-
- return r0, r1
-}
-
-// MockContractReader_QueryKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'QueryKey'
-type MockContractReader_QueryKey_Call struct {
- *mock.Call
-}
-
-// QueryKey is a helper method to define mock.On call
-// - _a0 context.Context
-// - _a1 types.BoundContract
-// - _a2 query.KeyFilter
-// - _a3 query.LimitAndSort
-// - _a4 any
-func (_e *MockContractReader_Expecter) QueryKey(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}, _a4 interface{}) *MockContractReader_QueryKey_Call {
- return &MockContractReader_QueryKey_Call{Call: _e.mock.On("QueryKey", _a0, _a1, _a2, _a3, _a4)}
-}
-
-func (_c *MockContractReader_QueryKey_Call) Run(run func(_a0 context.Context, _a1 types.BoundContract, _a2 query.KeyFilter, _a3 query.LimitAndSort, _a4 any)) *MockContractReader_QueryKey_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(context.Context), args[1].(types.BoundContract), args[2].(query.KeyFilter), args[3].(query.LimitAndSort), args[4].(any))
- })
- return _c
-}
-
-func (_c *MockContractReader_QueryKey_Call) Return(_a0 []types.Sequence, _a1 error) *MockContractReader_QueryKey_Call {
- _c.Call.Return(_a0, _a1)
- return _c
-}
-
-func (_c *MockContractReader_QueryKey_Call) RunAndReturn(run func(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) ([]types.Sequence, error)) *MockContractReader_QueryKey_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// Start provides a mock function with given fields: ctx
-func (_m *MockContractReader) Start(ctx context.Context) error {
- ret := _m.Called(ctx)
-
- if len(ret) == 0 {
- panic("no return value specified for Start")
- }
-
- var r0 error
- if rf, ok := ret.Get(0).(func(context.Context) error); ok {
- r0 = rf(ctx)
- } else {
- r0 = ret.Error(0)
- }
-
- return r0
-}
-
-// MockContractReader_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'
-type MockContractReader_Start_Call struct {
- *mock.Call
-}
-
-// Start is a helper method to define mock.On call
-// - ctx context.Context
-func (_e *MockContractReader_Expecter) Start(ctx interface{}) *MockContractReader_Start_Call {
- return &MockContractReader_Start_Call{Call: _e.mock.On("Start", ctx)}
-}
-
-func (_c *MockContractReader_Start_Call) Run(run func(ctx context.Context)) *MockContractReader_Start_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(context.Context))
- })
- return _c
-}
-
-func (_c *MockContractReader_Start_Call) Return(_a0 error) *MockContractReader_Start_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockContractReader_Start_Call) RunAndReturn(run func(context.Context) error) *MockContractReader_Start_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// NewMockContractReader creates a new instance of MockContractReader. 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 NewMockContractReader(t interface {
- mock.TestingT
- Cleanup(func())
-}) *MockContractReader {
- mock := &MockContractReader{}
- mock.Mock.Test(t)
-
- t.Cleanup(func() { mock.AssertExpectations(t) })
-
- return mock
-}
diff --git a/core/services/workflows/syncer/fetcher.go b/core/services/workflows/syncer/fetcher.go
index fdd0134909d..5c8856d58c1 100644
--- a/core/services/workflows/syncer/fetcher.go
+++ b/core/services/workflows/syncer/fetcher.go
@@ -18,10 +18,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/handlers/common"
)
-const (
- defaultFetchTimeoutMs = 20_000
-)
-
type FetcherService struct {
services.StateMachine
lggr logger.Logger
@@ -88,17 +84,11 @@ func hash(url string) string {
}
func (s *FetcherService) Fetch(ctx context.Context, url string) ([]byte, error) {
- payloadBytes, err := json.Marshal(ghcapabilities.Request{
- URL: url,
- Method: http.MethodGet,
- TimeoutMs: defaultFetchTimeoutMs,
- })
- if err != nil {
- return nil, fmt.Errorf("failed to marshal fetch request: %w", err)
- }
-
messageID := strings.Join([]string{ghcapabilities.MethodWorkflowSyncer, hash(url)}, "/")
- resp, err := s.och.HandleSingleNodeRequest(ctx, messageID, payloadBytes)
+ resp, err := s.och.HandleSingleNodeRequest(ctx, messageID, ghcapabilities.Request{
+ URL: url,
+ Method: http.MethodGet,
+ })
if err != nil {
return nil, err
}
@@ -110,5 +100,9 @@ func (s *FetcherService) Fetch(ctx context.Context, url string) ([]byte, error)
return nil, err
}
+ if payload.ExecutionError {
+ return nil, fmt.Errorf("execution error from gateway: %s", payload.ErrorMessage)
+ }
+
return payload.Body, nil
}
diff --git a/core/services/workflows/syncer/fetcher_test.go b/core/services/workflows/syncer/fetcher_test.go
index 8e3e58fba0d..017b052f8ab 100644
--- a/core/services/workflows/syncer/fetcher_test.go
+++ b/core/services/workflows/syncer/fetcher_test.go
@@ -15,6 +15,7 @@ import (
gcmocks "github.com/smartcontractkit/chainlink/v2/core/services/gateway/connector/mocks"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/handlers/capabilities"
ghcapabilities "github.com/smartcontractkit/chainlink/v2/core/services/gateway/handlers/capabilities"
+ "github.com/smartcontractkit/chainlink/v2/core/utils/matches"
)
type wrapper struct {
@@ -48,6 +49,7 @@ func TestNewFetcherService(t *testing.T) {
fetcher.och.HandleGatewayMessage(ctx, "gateway1", gatewayResp)
}).Return(nil).Times(1)
connector.EXPECT().DonID().Return("don-id")
+ connector.EXPECT().AwaitConnection(matches.AnyContext, "gateway1").Return(nil)
connector.EXPECT().GatewayIDs().Return([]string{"gateway1", "gateway2"})
payload, err := fetcher.Fetch(ctx, url)
@@ -56,6 +58,40 @@ func TestNewFetcherService(t *testing.T) {
expectedPayload := []byte("response body")
require.Equal(t, expectedPayload, payload)
})
+
+ t.Run("NOK-response_payload_too_large", func(t *testing.T) {
+ headers := map[string]string{"Content-Type": "application/json"}
+ responsePayload, err := json.Marshal(ghcapabilities.Response{
+ StatusCode: 400,
+ Headers: headers,
+ ErrorMessage: "http: request body too large",
+ ExecutionError: true,
+ })
+ require.NoError(t, err)
+ gatewayResponse := &api.Message{
+ Body: api.MessageBody{
+ MessageId: msgID,
+ Method: ghcapabilities.MethodWebAPITarget,
+ Payload: responsePayload,
+ },
+ }
+
+ connector.EXPECT().AddHandler([]string{capabilities.MethodWorkflowSyncer}, mock.Anything).Return(nil)
+
+ fetcher := NewFetcherService(lggr, wrapper)
+ require.NoError(t, fetcher.Start(ctx))
+ defer fetcher.Close()
+
+ connector.EXPECT().SignAndSendToGateway(mock.Anything, "gateway1", mock.Anything).Run(func(ctx context.Context, gatewayID string, msg *api.MessageBody) {
+ fetcher.och.HandleGatewayMessage(ctx, "gateway1", gatewayResponse)
+ }).Return(nil).Times(1)
+ connector.EXPECT().DonID().Return("don-id")
+ connector.EXPECT().AwaitConnection(matches.AnyContext, "gateway1").Return(nil)
+ connector.EXPECT().GatewayIDs().Return([]string{"gateway1", "gateway2"})
+
+ _, err = fetcher.Fetch(ctx, url)
+ require.Error(t, err, "execution error from gateway: http: request body too large")
+ })
}
func gatewayResponse(t *testing.T, msgID string) *api.Message {
diff --git a/core/services/workflows/syncer/handler.go b/core/services/workflows/syncer/handler.go
index b88527f905d..cb4f013d502 100644
--- a/core/services/workflows/syncer/handler.go
+++ b/core/services/workflows/syncer/handler.go
@@ -3,6 +3,7 @@ package syncer
import (
"bytes"
"context"
+ "database/sql"
"encoding/base64"
"encoding/hex"
"encoding/json"
@@ -400,25 +401,13 @@ func (h *eventHandler) workflowRegisteredEvent(
ctx context.Context,
payload WorkflowRegistryWorkflowRegisteredV1,
) error {
- // Download the contents of binaryURL, configURL and secretsURL and cache them locally.
- binary, err := h.fetcher(ctx, payload.BinaryURL)
+ // Fetch the workflow artifacts from the database or download them from the specified URLs
+ decodedBinary, config, err := h.getWorkflowArtifacts(ctx, payload)
if err != nil {
- return fmt.Errorf("failed to fetch binary from %s : %w", payload.BinaryURL, err)
- }
-
- decodedBinary, err := base64.StdEncoding.DecodeString(string(binary))
- if err != nil {
- return fmt.Errorf("failed to decode binary: %w", err)
- }
-
- var config []byte
- if payload.ConfigURL != "" {
- config, err = h.fetcher(ctx, payload.ConfigURL)
- if err != nil {
- return fmt.Errorf("failed to fetch config from %s : %w", payload.ConfigURL, err)
- }
+ return err
}
+ // Always fetch secrets from the SecretsURL
var secrets []byte
if payload.SecretsURL != "" {
secrets, err = h.fetcher(ctx, payload.SecretsURL)
@@ -428,7 +417,7 @@ func (h *eventHandler) workflowRegisteredEvent(
}
// Calculate the hash of the binary and config files
- hash, err := pkgworkflows.GenerateWorkflowID(payload.WorkflowOwner, decodedBinary, config, payload.SecretsURL)
+ hash, err := pkgworkflows.GenerateWorkflowID(payload.WorkflowOwner, payload.WorkflowName, decodedBinary, config, payload.SecretsURL)
if err != nil {
return fmt.Errorf("failed to generate workflow id: %w", err)
}
@@ -456,12 +445,13 @@ func (h *eventHandler) workflowRegisteredEvent(
}
wfID := hex.EncodeToString(payload.WorkflowID[:])
+ owner := hex.EncodeToString(payload.WorkflowOwner)
entry := &job.WorkflowSpec{
Workflow: hex.EncodeToString(decodedBinary),
Config: string(config),
WorkflowID: wfID,
Status: status,
- WorkflowOwner: hex.EncodeToString(payload.WorkflowOwner),
+ WorkflowOwner: owner,
WorkflowName: payload.WorkflowName,
SpecType: job.WASMFile,
BinaryURL: payload.BinaryURL,
@@ -480,7 +470,7 @@ func (h *eventHandler) workflowRegisteredEvent(
engine, err := h.engineFactory(
ctx,
wfID,
- string(payload.WorkflowOwner),
+ owner,
payload.WorkflowName,
config,
decodedBinary,
@@ -498,6 +488,42 @@ func (h *eventHandler) workflowRegisteredEvent(
return nil
}
+// getWorkflowArtifacts retrieves the workflow artifacts from the database if they exist,
+// or downloads them from the specified URLs if they are not found in the database.
+func (h *eventHandler) getWorkflowArtifacts(
+ ctx context.Context,
+ payload WorkflowRegistryWorkflowRegisteredV1,
+) ([]byte, []byte, error) {
+ spec, err := h.orm.GetWorkflowSpecByID(ctx, hex.EncodeToString(payload.WorkflowID[:]))
+ if err != nil {
+ binary, err2 := h.fetcher(ctx, payload.BinaryURL)
+ if err2 != nil {
+ return nil, nil, fmt.Errorf("failed to fetch binary from %s : %w", payload.BinaryURL, err2)
+ }
+
+ decodedBinary, err2 := base64.StdEncoding.DecodeString(string(binary))
+ if err2 != nil {
+ return nil, nil, fmt.Errorf("failed to decode binary: %w", err2)
+ }
+
+ var config []byte
+ if payload.ConfigURL != "" {
+ config, err2 = h.fetcher(ctx, payload.ConfigURL)
+ if err2 != nil {
+ return nil, nil, fmt.Errorf("failed to fetch config from %s : %w", payload.ConfigURL, err2)
+ }
+ }
+ return decodedBinary, config, nil
+ }
+
+ // there is no update in the BinaryURL or ConfigURL, lets decode the stored artifacts
+ decodedBinary, err := hex.DecodeString(spec.Workflow)
+ if err != nil {
+ return nil, nil, fmt.Errorf("failed to decode stored workflow spec: %w", err)
+ }
+ return decodedBinary, []byte(spec.Config), nil
+}
+
func (h *eventHandler) engineFactoryFn(ctx context.Context, id string, owner string, name string, config []byte, binary []byte) (services.Service, error) {
moduleConfig := &host.ModuleConfig{Logger: h.lggr, Labeler: h.emitter}
sdkSpec, err := host.GetWorkflowSpec(ctx, moduleConfig, binary, config)
@@ -617,9 +643,15 @@ func (h *eventHandler) workflowDeletedEvent(
return err
}
- if err := h.orm.DeleteWorkflowSpec(ctx, hex.EncodeToString(payload.WorkflowOwner), payload.WorkflowName); err != nil {
+ err := h.orm.DeleteWorkflowSpec(ctx, hex.EncodeToString(payload.WorkflowOwner), payload.WorkflowName)
+ if err != nil {
+ if errors.Is(err, sql.ErrNoRows) {
+ h.lggr.Warnw("workflow spec not found", "workflowID", hex.EncodeToString(payload.WorkflowID[:]))
+ return nil
+ }
return fmt.Errorf("failed to delete workflow spec: %w", err)
}
+
return nil
}
diff --git a/core/services/workflows/syncer/handler_test.go b/core/services/workflows/syncer/handler_test.go
index eb8b338158f..994b820b5ce 100644
--- a/core/services/workflows/syncer/handler_test.go
+++ b/core/services/workflows/syncer/handler_test.go
@@ -444,7 +444,7 @@ func testRunningWorkflow(t *testing.T, tc testCase) {
fetcher = tc.fetcher
)
- giveWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, binary, config, secretsURL)
+ giveWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, "workflow-name", binary, config, secretsURL)
require.NoError(t, err)
wfID := hex.EncodeToString(giveWFID[:])
@@ -492,7 +492,7 @@ func Test_workflowDeletedHandler(t *testing.T) {
})
)
- giveWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, binary, config, secretsURL)
+ giveWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, "workflow-name", binary, config, secretsURL)
require.NoError(t, err)
wfIDs := hex.EncodeToString(giveWFID[:])
@@ -555,6 +555,61 @@ func Test_workflowDeletedHandler(t *testing.T) {
_, err = h.engineRegistry.Get(wfIDs)
require.Error(t, err)
})
+ t.Run("success deleting non-existing workflow spec", func(t *testing.T) {
+ var (
+ ctx = testutils.Context(t)
+ lggr = logger.TestLogger(t)
+ db = pgtest.NewSqlxDB(t)
+ orm = NewWorkflowRegistryDS(db, lggr)
+ emitter = custmsg.NewLabeler()
+
+ binary = wasmtest.CreateTestBinary(binaryCmd, binaryLocation, true, t)
+ encodedBinary = []byte(base64.StdEncoding.EncodeToString(binary))
+ config = []byte("")
+ secretsURL = "http://example.com"
+ binaryURL = "http://example.com/binary"
+ configURL = "http://example.com/config"
+ wfOwner = []byte("0xOwner")
+
+ fetcher = newMockFetcher(map[string]mockFetchResp{
+ binaryURL: {Body: encodedBinary, Err: nil},
+ configURL: {Body: config, Err: nil},
+ secretsURL: {Body: []byte("secrets"), Err: nil},
+ })
+ )
+
+ giveWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, "workflow-name", binary, config, secretsURL)
+ require.NoError(t, err)
+
+ er := NewEngineRegistry()
+ store := wfstore.NewDBStore(db, lggr, clockwork.NewFakeClock())
+ registry := capabilities.NewRegistry(lggr)
+ registry.SetLocalRegistry(&capabilities.TestMetadataRegistry{})
+ h := NewEventHandler(
+ lggr,
+ orm,
+ fetcher,
+ store,
+ registry,
+ emitter,
+ clockwork.NewFakeClock(),
+ workflowkey.Key{},
+ WithEngineRegistry(er),
+ )
+
+ deleteEvent := WorkflowRegistryWorkflowDeletedV1{
+ WorkflowID: giveWFID,
+ WorkflowOwner: wfOwner,
+ WorkflowName: "workflow-name",
+ DonID: 1,
+ }
+ err = h.workflowDeletedEvent(ctx, deleteEvent)
+ require.NoError(t, err)
+
+ // Verify the record is deleted in the database
+ _, err = orm.GetWorkflowSpec(ctx, hex.EncodeToString(wfOwner), "workflow-name")
+ require.Error(t, err)
+ })
}
func Test_workflowPausedActivatedUpdatedHandler(t *testing.T) {
@@ -584,9 +639,9 @@ func Test_workflowPausedActivatedUpdatedHandler(t *testing.T) {
})
)
- giveWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, binary, config, secretsURL)
+ giveWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, "workflow-name", binary, config, secretsURL)
require.NoError(t, err)
- updatedWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, binary, updateConfig, secretsURL)
+ updatedWFID, err := pkgworkflows.GenerateWorkflowID(wfOwner, "workflow-name", binary, updateConfig, secretsURL)
require.NoError(t, err)
require.NoError(t, err)
diff --git a/core/services/workflows/syncer/heap.go b/core/services/workflows/syncer/heap.go
deleted file mode 100644
index 061293928a3..00000000000
--- a/core/services/workflows/syncer/heap.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package syncer
-
-import "container/heap"
-
-type Heap interface {
- // Push adds a new item to the heap.
- Push(x WorkflowRegistryEventResponse)
-
- // Pop removes the smallest item from the heap and returns it.
- Pop() WorkflowRegistryEventResponse
-
- // Len returns the number of items in the heap.
- Len() int
-}
-
-// publicHeap is a wrapper around the heap.Interface that exposes the Push and Pop methods.
-type publicHeap[T any] struct {
- heap heap.Interface
-}
-
-func (h *publicHeap[T]) Push(x T) {
- heap.Push(h.heap, x)
-}
-
-func (h *publicHeap[T]) Pop() T {
- return heap.Pop(h.heap).(T)
-}
-
-func (h *publicHeap[T]) Len() int {
- return h.heap.Len()
-}
-
-// blockHeightHeap is a heap.Interface that sorts WorkflowRegistryEventResponses by block height.
-type blockHeightHeap []WorkflowRegistryEventResponse
-
-// newBlockHeightHeap returns an initialized heap that sorts WorkflowRegistryEventResponses by block height.
-func newBlockHeightHeap() Heap {
- h := blockHeightHeap(make([]WorkflowRegistryEventResponse, 0))
- heap.Init(&h)
- return &publicHeap[WorkflowRegistryEventResponse]{heap: &h}
-}
-
-func (h *blockHeightHeap) Len() int { return len(*h) }
-
-func (h *blockHeightHeap) Less(i, j int) bool {
- return (*h)[i].Event.Head.Height < (*h)[j].Event.Head.Height
-}
-
-func (h *blockHeightHeap) Swap(i, j int) {
- (*h)[i], (*h)[j] = (*h)[j], (*h)[i]
-}
-
-func (h *blockHeightHeap) Push(x any) {
- *h = append(*h, x.(WorkflowRegistryEventResponse))
-}
-
-func (h *blockHeightHeap) Pop() any {
- old := *h
- n := len(old)
- x := old[n-1]
- *h = old[0 : n-1]
- return x
-}
diff --git a/core/services/workflows/syncer/mocks/orm.go b/core/services/workflows/syncer/mocks/orm.go
index da96f422361..09a543d65e3 100644
--- a/core/services/workflows/syncer/mocks/orm.go
+++ b/core/services/workflows/syncer/mocks/orm.go
@@ -540,6 +540,65 @@ func (_c *ORM_GetWorkflowSpec_Call) RunAndReturn(run func(context.Context, strin
return _c
}
+// GetWorkflowSpecByID provides a mock function with given fields: ctx, id
+func (_m *ORM) GetWorkflowSpecByID(ctx context.Context, id string) (*job.WorkflowSpec, error) {
+ ret := _m.Called(ctx, id)
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetWorkflowSpecByID")
+ }
+
+ var r0 *job.WorkflowSpec
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, string) (*job.WorkflowSpec, error)); ok {
+ return rf(ctx, id)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, string) *job.WorkflowSpec); ok {
+ r0 = rf(ctx, id)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.WorkflowSpec)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
+ r1 = rf(ctx, id)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// ORM_GetWorkflowSpecByID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWorkflowSpecByID'
+type ORM_GetWorkflowSpecByID_Call struct {
+ *mock.Call
+}
+
+// GetWorkflowSpecByID is a helper method to define mock.On call
+// - ctx context.Context
+// - id string
+func (_e *ORM_Expecter) GetWorkflowSpecByID(ctx interface{}, id interface{}) *ORM_GetWorkflowSpecByID_Call {
+ return &ORM_GetWorkflowSpecByID_Call{Call: _e.mock.On("GetWorkflowSpecByID", ctx, id)}
+}
+
+func (_c *ORM_GetWorkflowSpecByID_Call) Run(run func(ctx context.Context, id string)) *ORM_GetWorkflowSpecByID_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(string))
+ })
+ return _c
+}
+
+func (_c *ORM_GetWorkflowSpecByID_Call) Return(_a0 *job.WorkflowSpec, _a1 error) *ORM_GetWorkflowSpecByID_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *ORM_GetWorkflowSpecByID_Call) RunAndReturn(run func(context.Context, string) (*job.WorkflowSpec, error)) *ORM_GetWorkflowSpecByID_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// Update provides a mock function with given fields: ctx, secretsURL, contents
func (_m *ORM) Update(ctx context.Context, secretsURL string, contents string) (int64, error) {
ret := _m.Called(ctx, secretsURL, contents)
diff --git a/core/services/workflows/syncer/orm.go b/core/services/workflows/syncer/orm.go
index 97f2c834f36..ff9336a0893 100644
--- a/core/services/workflows/syncer/orm.go
+++ b/core/services/workflows/syncer/orm.go
@@ -52,6 +52,9 @@ type WorkflowSpecsDS interface {
// DeleteWorkflowSpec deletes the workflow spec for the given owner and name.
DeleteWorkflowSpec(ctx context.Context, owner, name string) error
+
+ // GetWorkflowSpecByID returns the workflow spec for the given workflowID.
+ GetWorkflowSpecByID(ctx context.Context, id string) (*job.WorkflowSpec, error)
}
type ORM interface {
@@ -161,6 +164,10 @@ func (orm *orm) GetContentsByWorkflowID(ctx context.Context, workflowID string)
return "", "", ErrEmptySecrets
}
+ if jr.Contents.String == "" {
+ return "", "", ErrEmptySecrets
+ }
+
return jr.SecretsURLHash.String, jr.Contents.String, nil
}
@@ -206,65 +213,73 @@ func (orm *orm) GetSecretsURLHash(owner, secretsURL []byte) ([]byte, error) {
func (orm *orm) UpsertWorkflowSpec(ctx context.Context, spec *job.WorkflowSpec) (int64, error) {
var id int64
+ err := sqlutil.TransactDataSource(ctx, orm.ds, nil, func(tx sqlutil.DataSource) error {
+ txErr := tx.QueryRowxContext(
+ ctx,
+ `DELETE FROM workflow_specs WHERE workflow_owner = $1 AND workflow_name = $2 AND workflow_id != $3`,
+ spec.WorkflowOwner,
+ spec.WorkflowName,
+ spec.WorkflowID,
+ ).Scan(nil)
+ if txErr != nil && !errors.Is(txErr, sql.ErrNoRows) {
+ return fmt.Errorf("failed to clean up previous workflow specs: %w", txErr)
+ }
- query := `
- INSERT INTO workflow_specs (
- workflow,
- config,
- workflow_id,
- workflow_owner,
- workflow_name,
- status,
- binary_url,
- config_url,
- secrets_id,
- created_at,
- updated_at,
- spec_type
- ) VALUES (
- :workflow,
- :config,
- :workflow_id,
- :workflow_owner,
- :workflow_name,
- :status,
- :binary_url,
- :config_url,
- :secrets_id,
- :created_at,
- :updated_at,
- :spec_type
- ) ON CONFLICT (workflow_owner, workflow_name) DO UPDATE
- SET
- workflow = EXCLUDED.workflow,
- config = EXCLUDED.config,
- workflow_id = EXCLUDED.workflow_id,
- workflow_owner = EXCLUDED.workflow_owner,
- workflow_name = EXCLUDED.workflow_name,
- status = EXCLUDED.status,
- binary_url = EXCLUDED.binary_url,
- config_url = EXCLUDED.config_url,
- secrets_id = EXCLUDED.secrets_id,
- created_at = EXCLUDED.created_at,
- updated_at = EXCLUDED.updated_at,
- spec_type = EXCLUDED.spec_type
- RETURNING id
- `
-
- stmt, err := orm.ds.PrepareNamedContext(ctx, query)
- if err != nil {
- return 0, err
- }
- defer stmt.Close()
+ query := `
+ INSERT INTO workflow_specs (
+ workflow,
+ config,
+ workflow_id,
+ workflow_owner,
+ workflow_name,
+ status,
+ binary_url,
+ config_url,
+ secrets_id,
+ created_at,
+ updated_at,
+ spec_type
+ ) VALUES (
+ :workflow,
+ :config,
+ :workflow_id,
+ :workflow_owner,
+ :workflow_name,
+ :status,
+ :binary_url,
+ :config_url,
+ :secrets_id,
+ :created_at,
+ :updated_at,
+ :spec_type
+ ) ON CONFLICT (workflow_owner, workflow_name) DO UPDATE
+ SET
+ workflow = EXCLUDED.workflow,
+ config = EXCLUDED.config,
+ workflow_id = EXCLUDED.workflow_id,
+ workflow_owner = EXCLUDED.workflow_owner,
+ workflow_name = EXCLUDED.workflow_name,
+ status = EXCLUDED.status,
+ binary_url = EXCLUDED.binary_url,
+ config_url = EXCLUDED.config_url,
+ secrets_id = EXCLUDED.secrets_id,
+ created_at = EXCLUDED.created_at,
+ updated_at = EXCLUDED.updated_at,
+ spec_type = EXCLUDED.spec_type
+ RETURNING id
+ `
- spec.UpdatedAt = time.Now()
- err = stmt.QueryRowxContext(ctx, spec).Scan(&id)
+ stmt, err := orm.ds.PrepareNamedContext(ctx, query)
+ if err != nil {
+ return err
+ }
+ defer stmt.Close()
- if err != nil {
- return 0, err
- }
+ spec.UpdatedAt = time.Now()
+ return stmt.QueryRowxContext(ctx, spec).Scan(&id)
+ })
- return id, nil
+ return id, err
}
func (orm *orm) UpsertWorkflowSpecWithSecrets(
@@ -289,6 +304,17 @@ func (orm *orm) UpsertWorkflowSpecWithSecrets(
return fmt.Errorf("failed to create workflow secrets: %w", txErr)
}
+ txErr = tx.QueryRowxContext(
+ ctx,
+ `DELETE FROM workflow_specs WHERE workflow_owner = $1 AND workflow_name = $2 AND workflow_id != $3`,
+ spec.WorkflowOwner,
+ spec.WorkflowName,
+ spec.WorkflowID,
+ ).Scan(nil)
+ if txErr != nil && !errors.Is(txErr, sql.ErrNoRows) {
+ return fmt.Errorf("failed to clean up previous workflow specs: %w", txErr)
+ }
+
spec.SecretsID = sql.NullInt64{Int64: sid, Valid: true}
query := `
@@ -328,10 +354,10 @@ func (orm *orm) UpsertWorkflowSpecWithSecrets(
status = EXCLUDED.status,
binary_url = EXCLUDED.binary_url,
config_url = EXCLUDED.config_url,
- secrets_id = EXCLUDED.secrets_id,
created_at = EXCLUDED.created_at,
updated_at = EXCLUDED.updated_at,
- spec_type = EXCLUDED.spec_type
+ spec_type = EXCLUDED.spec_type,
+ secrets_id = EXCLUDED.secrets_id
RETURNING id
`
@@ -363,6 +389,22 @@ func (orm *orm) GetWorkflowSpec(ctx context.Context, owner, name string) (*job.W
return &spec, nil
}
+func (orm *orm) GetWorkflowSpecByID(ctx context.Context, id string) (*job.WorkflowSpec, error) {
+ query := `
+ SELECT *
+ FROM workflow_specs
+ WHERE workflow_id = $1
+ `
+
+ var spec job.WorkflowSpec
+ err := orm.ds.GetContext(ctx, &spec, query, id)
+ if err != nil {
+ return nil, err
+ }
+
+ return &spec, nil
+}
+
func (orm *orm) DeleteWorkflowSpec(ctx context.Context, owner, name string) error {
query := `
DELETE FROM workflow_specs
diff --git a/core/services/workflows/syncer/orm_test.go b/core/services/workflows/syncer/orm_test.go
index 08c60447498..f47bd6c3731 100644
--- a/core/services/workflows/syncer/orm_test.go
+++ b/core/services/workflows/syncer/orm_test.go
@@ -6,6 +6,8 @@ import (
"testing"
"time"
+ "github.com/google/uuid"
+
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
"github.com/smartcontractkit/chainlink/v2/core/logger"
@@ -197,6 +199,45 @@ func Test_GetWorkflowSpec(t *testing.T) {
})
}
+func Test_GetWorkflowSpecByID(t *testing.T) {
+ db := pgtest.NewSqlxDB(t)
+ ctx := testutils.Context(t)
+ lggr := logger.TestLogger(t)
+ orm := &orm{ds: db, lggr: lggr}
+
+ t.Run("gets a workflow spec by ID", func(t *testing.T) {
+ spec := &job.WorkflowSpec{
+ Workflow: "test_workflow",
+ Config: "test_config",
+ WorkflowID: "cid-123",
+ WorkflowOwner: "owner-123",
+ WorkflowName: "Test Workflow",
+ Status: job.WorkflowSpecStatusActive,
+ BinaryURL: "http://example.com/binary",
+ ConfigURL: "http://example.com/config",
+ CreatedAt: time.Now(),
+ SpecType: job.WASMFile,
+ }
+
+ id, err := orm.UpsertWorkflowSpec(ctx, spec)
+ require.NoError(t, err)
+ require.NotZero(t, id)
+
+ dbSpec, err := orm.GetWorkflowSpecByID(ctx, spec.WorkflowID)
+ require.NoError(t, err)
+ require.Equal(t, spec.Workflow, dbSpec.Workflow)
+
+ err = orm.DeleteWorkflowSpec(ctx, spec.WorkflowOwner, spec.WorkflowName)
+ require.NoError(t, err)
+ })
+
+ t.Run("fails if no workflow spec exists", func(t *testing.T) {
+ dbSpec, err := orm.GetWorkflowSpecByID(ctx, "inexistent-workflow-id")
+ require.Error(t, err)
+ require.Nil(t, dbSpec)
+ })
+}
+
func Test_GetContentsByWorkflowID(t *testing.T) {
db := pgtest.NewSqlxDB(t)
ctx := testutils.Context(t)
@@ -256,3 +297,160 @@ func Test_GetContentsByWorkflowID(t *testing.T) {
assert.Equal(t, giveHash, gotHash)
assert.Equal(t, giveContent, gotContent)
}
+
+func Test_GetContentsByWorkflowID_SecretsProvidedButEmpty(t *testing.T) {
+ db := pgtest.NewSqlxDB(t)
+ ctx := testutils.Context(t)
+ lggr := logger.TestLogger(t)
+ orm := &orm{ds: db, lggr: lggr}
+
+ // workflow_id is missing
+ _, _, err := orm.GetContentsByWorkflowID(ctx, "doesnt-exist")
+ require.ErrorContains(t, err, "no rows in result set")
+
+ // secrets_id is nil; should return EmptySecrets
+ workflowID := "aWorkflowID"
+ giveURL := "https://example.com"
+ giveBytes, err := crypto.Keccak256([]byte(giveURL))
+ require.NoError(t, err)
+ giveHash := hex.EncodeToString(giveBytes)
+ giveContent := ""
+ _, err = orm.UpsertWorkflowSpecWithSecrets(ctx, &job.WorkflowSpec{
+ Workflow: "",
+ Config: "",
+ WorkflowID: workflowID,
+ WorkflowOwner: "aWorkflowOwner",
+ WorkflowName: "aWorkflowName",
+ BinaryURL: "",
+ ConfigURL: "",
+ CreatedAt: time.Now(),
+ SpecType: job.DefaultSpecType,
+ }, giveURL, giveHash, giveContent)
+ require.NoError(t, err)
+
+ _, _, err = orm.GetContentsByWorkflowID(ctx, workflowID)
+ require.ErrorIs(t, err, ErrEmptySecrets)
+}
+
+func Test_UpsertWorkflowSpecWithSecrets(t *testing.T) {
+ db := pgtest.NewSqlxDB(t)
+ ctx := testutils.Context(t)
+ lggr := logger.TestLogger(t)
+ orm := &orm{ds: db, lggr: lggr}
+
+ t.Run("inserts new spec and new secrets", func(t *testing.T) {
+ giveURL := "https://example.com"
+ giveBytes, err := crypto.Keccak256([]byte(giveURL))
+ require.NoError(t, err)
+ giveHash := hex.EncodeToString(giveBytes)
+ giveContent := "some contents"
+
+ spec := &job.WorkflowSpec{
+ Workflow: "test_workflow",
+ Config: "test_config",
+ WorkflowID: "cid-123",
+ WorkflowOwner: "owner-123",
+ WorkflowName: "Test Workflow",
+ Status: job.WorkflowSpecStatusActive,
+ BinaryURL: "http://example.com/binary",
+ ConfigURL: "http://example.com/config",
+ CreatedAt: time.Now(),
+ SpecType: job.WASMFile,
+ }
+
+ _, err = orm.UpsertWorkflowSpecWithSecrets(ctx, spec, giveURL, giveHash, giveContent)
+ require.NoError(t, err)
+
+ // Verify the record exists in the database
+ var dbSpec job.WorkflowSpec
+ err = db.Get(&dbSpec, `SELECT * FROM workflow_specs WHERE workflow_owner = $1 AND workflow_name = $2`, spec.WorkflowOwner, spec.WorkflowName)
+ require.NoError(t, err)
+ require.Equal(t, spec.Workflow, dbSpec.Workflow)
+
+ // Verify the secrets exists in the database
+ contents, err := orm.GetContents(ctx, giveURL)
+ require.NoError(t, err)
+ require.Equal(t, giveContent, contents)
+ })
+
+ t.Run("updates existing spec and secrets", func(t *testing.T) {
+ giveURL := "https://example.com"
+ giveBytes, err := crypto.Keccak256([]byte(giveURL))
+ require.NoError(t, err)
+ giveHash := hex.EncodeToString(giveBytes)
+ giveContent := "some contents"
+
+ spec := &job.WorkflowSpec{
+ Workflow: "test_workflow",
+ Config: "test_config",
+ WorkflowID: "cid-123",
+ WorkflowOwner: "owner-123",
+ WorkflowName: "Test Workflow",
+ Status: job.WorkflowSpecStatusActive,
+ BinaryURL: "http://example.com/binary",
+ ConfigURL: "http://example.com/config",
+ CreatedAt: time.Now(),
+ SpecType: job.WASMFile,
+ }
+
+ _, err = orm.UpsertWorkflowSpecWithSecrets(ctx, spec, giveURL, giveHash, giveContent)
+ require.NoError(t, err)
+
+ // Update the status
+ spec.Status = job.WorkflowSpecStatusPaused
+
+ _, err = orm.UpsertWorkflowSpecWithSecrets(ctx, spec, giveURL, giveHash, "new contents")
+ require.NoError(t, err)
+
+ // Verify the record is updated in the database
+ var dbSpec job.WorkflowSpec
+ err = db.Get(&dbSpec, `SELECT * FROM workflow_specs WHERE workflow_owner = $1 AND workflow_name = $2`, spec.WorkflowOwner, spec.WorkflowName)
+ require.NoError(t, err)
+ require.Equal(t, spec.Config, dbSpec.Config)
+
+ // Verify the secrets is updated in the database
+ contents, err := orm.GetContents(ctx, giveURL)
+ require.NoError(t, err)
+ require.Equal(t, "new contents", contents)
+ })
+
+ t.Run("updates existing spec and secrets if spec has executions", func(t *testing.T) {
+ giveURL := "https://example.com"
+ giveBytes, err := crypto.Keccak256([]byte(giveURL))
+ require.NoError(t, err)
+ giveHash := hex.EncodeToString(giveBytes)
+ giveContent := "some contents"
+
+ spec := &job.WorkflowSpec{
+ Workflow: "test_workflow",
+ Config: "test_config",
+ WorkflowID: "cid-123",
+ WorkflowOwner: "owner-123",
+ WorkflowName: "Test Workflow",
+ Status: job.WorkflowSpecStatusActive,
+ BinaryURL: "http://example.com/binary",
+ ConfigURL: "http://example.com/config",
+ CreatedAt: time.Now(),
+ SpecType: job.WASMFile,
+ }
+
+ _, err = orm.UpsertWorkflowSpecWithSecrets(ctx, spec, giveURL, giveHash, giveContent)
+ require.NoError(t, err)
+
+ _, err = db.ExecContext(
+ ctx,
+ `INSERT INTO workflow_executions (id, workflow_id, status, created_at) VALUES ($1, $2, $3, $4)`,
+ uuid.New().String(),
+ "cid-123",
+ "started",
+ time.Now(),
+ )
+ require.NoError(t, err)
+
+ // Update the status
+ spec.WorkflowID = "cid-456"
+
+ _, err = orm.UpsertWorkflowSpecWithSecrets(ctx, spec, giveURL, giveHash, "new contents")
+ require.NoError(t, err)
+ })
+}
diff --git a/core/services/workflows/syncer/workflow_registry.go b/core/services/workflows/syncer/workflow_registry.go
index 75fcc9735ad..26c23411d67 100644
--- a/core/services/workflows/syncer/workflow_registry.go
+++ b/core/services/workflows/syncer/workflow_registry.go
@@ -5,13 +5,15 @@ import (
"encoding/hex"
"encoding/json"
"fmt"
+ "iter"
+ "strings"
"sync"
"time"
"github.com/smartcontractkit/chainlink-common/pkg/capabilities"
"github.com/smartcontractkit/chainlink-common/pkg/services"
- types "github.com/smartcontractkit/chainlink-common/pkg/types"
- query "github.com/smartcontractkit/chainlink-common/pkg/types/query"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/query"
"github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
"github.com/smartcontractkit/chainlink-common/pkg/values"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper"
@@ -90,19 +92,19 @@ type WorkflowLoadConfig struct {
// FetcherFunc is an abstraction for fetching the contents stored at a URL.
type FetcherFunc func(ctx context.Context, url string) ([]byte, error)
-type ContractReaderFactory interface {
- NewContractReader(context.Context, []byte) (types.ContractReader, error)
-}
-
// ContractReader is a subset of types.ContractReader defined locally to enable mocking.
type ContractReader interface {
Start(ctx context.Context) error
Close() error
Bind(context.Context, []types.BoundContract) error
- QueryKey(context.Context, types.BoundContract, query.KeyFilter, query.LimitAndSort, any) ([]types.Sequence, error)
+ QueryKeys(ctx context.Context, keyQueries []types.ContractKeyFilter, limitAndSort query.LimitAndSort) (iter.Seq2[string, types.Sequence], error)
GetLatestValueWithHeadData(ctx context.Context, readName string, confidenceLevel primitives.ConfidenceLevel, params any, returnVal any) (head *types.Head, err error)
}
+type ContractReaderFactory interface {
+ NewContractReader(context.Context, []byte) (types.ContractReader, error)
+}
+
// WorkflowRegistrySyncer is the public interface of the package.
type WorkflowRegistrySyncer interface {
services.Service
@@ -130,22 +132,9 @@ type workflowRegistry struct {
eventPollerCfg WorkflowEventPollerConfig
eventTypes []WorkflowRegistryEventType
-
- // eventsCh is read by the handler and each event is handled once received.
- eventsCh chan WorkflowRegistryEventResponse
- handler evtHandler
- initialWorkflowsStateLoader initialWorkflowsStateLoader
-
- // batchCh is a channel that receives batches of events from the contract query goroutines.
- batchCh chan []WorkflowRegistryEventResponse
-
- // heap is a min heap that merges batches of events from the contract query goroutines. The
- // default min heap is sorted by block height.
- heap Heap
+ handler evtHandler
workflowDonNotifier donNotifier
-
- reader ContractReader
}
// WithTicker allows external callers to provide a ticker to the workflowRegistry. This is useful
@@ -160,12 +149,6 @@ type evtHandler interface {
Handle(ctx context.Context, event Event) error
}
-type initialWorkflowsStateLoader interface {
- // LoadWorkflows loads all the workflows for the given donID from the contract. Returns the head of the chain as of the
- // point in time at which the load occurred.
- LoadWorkflows(ctx context.Context, don capabilities.DON) (*types.Head, error)
-}
-
type donNotifier interface {
WaitForDon(ctx context.Context) (capabilities.DON, error)
}
@@ -180,7 +163,6 @@ func NewWorkflowRegistry(
addr string,
eventPollerConfig WorkflowEventPollerConfig,
handler evtHandler,
- initialWorkflowsStateLoader initialWorkflowsStateLoader,
workflowDonNotifier donNotifier,
opts ...func(*workflowRegistry),
) *workflowRegistry {
@@ -192,19 +174,16 @@ func NewWorkflowRegistry(
WorkflowRegisteredEvent,
WorkflowUpdatedEvent,
}
+
wr := &workflowRegistry{
- lggr: lggr,
- newContractReaderFn: newContractReaderFn,
- workflowRegistryAddress: addr,
- eventPollerCfg: eventPollerConfig,
- heap: newBlockHeightHeap(),
- stopCh: make(services.StopChan),
- eventTypes: ets,
- eventsCh: make(chan WorkflowRegistryEventResponse),
- batchCh: make(chan []WorkflowRegistryEventResponse, len(ets)),
- handler: handler,
- initialWorkflowsStateLoader: initialWorkflowsStateLoader,
- workflowDonNotifier: workflowDonNotifier,
+ lggr: lggr,
+ newContractReaderFn: newContractReaderFn,
+ workflowRegistryAddress: addr,
+ eventPollerCfg: eventPollerConfig,
+ stopCh: make(services.StopChan),
+ eventTypes: ets,
+ handler: handler,
+ workflowDonNotifier: workflowDonNotifier,
}
for _, opt := range opts {
@@ -231,22 +210,28 @@ func (w *workflowRegistry) Start(_ context.Context) error {
return
}
- w.lggr.Debugw("Loading initial workflows for DON", "DON", don.ID)
- loadWorkflowsHead, err := w.initialWorkflowsStateLoader.LoadWorkflows(ctx, don)
+ reader, err := w.newWorkflowRegistryContractReader(ctx)
if err != nil {
- w.lggr.Errorw("failed to load workflows", "err", err)
+ w.lggr.Criticalf("contract reader unavailable : %s", err)
return
}
- w.syncEventsLoop(ctx, loadWorkflowsHead.Height)
- }()
+ w.lggr.Debugw("Loading initial workflows for DON", "DON", don.ID)
+ loadWorkflowsHead, err := w.loadWorkflows(ctx, don, reader)
+ if err != nil {
+ // TODO - this is a temporary fix to handle the case where the chainreader errors because the contract
+ // contains no workflows. To track: https://smartcontract-it.atlassian.net/browse/CAPPL-393
+ if !strings.Contains(err.Error(), "attempting to unmarshal an empty string while arguments are expected") {
+ w.lggr.Errorw("failed to load workflows", "err", err)
+ return
+ }
- w.wg.Add(1)
- go func() {
- defer w.wg.Done()
- defer cancel()
+ loadWorkflowsHead = &types.Head{
+ Height: "0",
+ }
+ }
- w.handlerLoop(ctx)
+ w.readRegistryEvents(ctx, reader, loadWorkflowsHead.Height)
}()
return nil
@@ -273,135 +258,82 @@ func (w *workflowRegistry) Name() string {
return name
}
-// handlerLoop handles the events that are emitted by the contract.
-func (w *workflowRegistry) handlerLoop(ctx context.Context) {
+// readRegistryEvents polls the contract for events and send them to the events channel.
+func (w *workflowRegistry) readRegistryEvents(ctx context.Context, reader ContractReader, lastReadBlockNumber string) {
+ ticker := w.getTicker()
+
+ var keyQueries = make([]types.ContractKeyFilter, 0, len(w.eventTypes))
+ for _, et := range w.eventTypes {
+ var logData values.Value
+ keyQueries = append(keyQueries, types.ContractKeyFilter{
+ KeyFilter: query.KeyFilter{
+ Key: string(et),
+ Expressions: []query.Expression{
+ query.Confidence(primitives.Finalized),
+ query.Block(lastReadBlockNumber, primitives.Gt),
+ },
+ },
+ Contract: types.BoundContract{
+ Name: WorkflowRegistryContractName,
+ Address: w.workflowRegistryAddress,
+ },
+ SequenceDataType: &logData,
+ })
+ }
+
+ cursor := ""
for {
select {
case <-ctx.Done():
return
- case resp, open := <-w.eventsCh:
- if !open {
- return
+ case <-ticker:
+ limitAndSort := query.LimitAndSort{
+ SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)},
+ Limit: query.Limit{Count: w.eventPollerCfg.QueryCount},
}
-
- if resp.Err != nil || resp.Event == nil {
- w.lggr.Errorw("failed to handle event", "err", resp.Err)
- continue
+ if cursor != "" {
+ limitAndSort.Limit = query.CursorLimit(cursor, query.CursorFollowing, w.eventPollerCfg.QueryCount)
}
- event := resp.Event
- w.lggr.Debugf("handling event: %+v", event)
- if err := w.handler.Handle(ctx, *event); err != nil {
- w.lggr.Errorw("failed to handle event", "event", event, "err", err)
+ logsIter, err := reader.QueryKeys(ctx, keyQueries, limitAndSort)
+ if err != nil {
+ w.lggr.Errorw("failed to query keys", "err", err)
continue
}
- }
- }
-}
-// syncEventsLoop polls the contract for events and passes them to a channel for handling.
-func (w *workflowRegistry) syncEventsLoop(ctx context.Context, lastReadBlockNumber string) {
- var (
- // sendLog is a helper that sends a WorkflowRegistryEventResponse to the eventsCh in a
- // blocking way that will send the response or be canceled.
- sendLog = func(resp WorkflowRegistryEventResponse) {
- select {
- case w.eventsCh <- resp:
- case <-ctx.Done():
+ var logs []sequenceWithEventType
+ for eventType, log := range logsIter {
+ logs = append(logs, sequenceWithEventType{
+ Sequence: log,
+ EventType: WorkflowRegistryEventType(eventType),
+ })
}
- }
-
- ticker = w.getTicker()
-
- signals = make(map[WorkflowRegistryEventType]chan struct{}, 0)
- )
-
- // critical failure if there is no reader, the loop will exit and the parent context will be
- // canceled.
- reader, err := w.getContractReader(ctx)
- if err != nil {
- w.lggr.Criticalf("contract reader unavailable : %s", err)
- return
- }
-
- // fan out and query for each event type
- for i := 0; i < len(w.eventTypes); i++ {
- signal := make(chan struct{}, 1)
- signals[w.eventTypes[i]] = signal
- w.wg.Add(1)
- go func() {
- defer w.wg.Done()
+ w.lggr.Debugw("QueryKeys called", "logs", len(logs), "eventTypes", w.eventTypes, "lastReadBlockNumber", lastReadBlockNumber, "logCursor", cursor)
- queryEvent(
- ctx,
- signal,
- w.lggr,
- reader,
- lastReadBlockNumber,
- queryEventConfig{
- ContractName: WorkflowRegistryContractName,
- ContractAddress: w.workflowRegistryAddress,
- WorkflowEventPollerConfig: w.eventPollerCfg,
- },
- w.eventTypes[i],
- w.batchCh,
- )
- }()
- }
-
- // Periodically send a signal to all the queryEvent goroutines to query the contract
- for {
- select {
- case <-ctx.Done():
- return
- case <-ticker:
- w.lggr.Debugw("Syncing with WorkflowRegistry")
- // for each event type, send a signal for it to execute a query and produce a new
- // batch of event logs
- for i := 0; i < len(w.eventTypes); i++ {
- signal := signals[w.eventTypes[i]]
- select {
- case signal <- struct{}{}:
- case <-ctx.Done():
- return
- }
+ // ChainReader QueryKey API provides logs including the cursor value and not
+ // after the cursor value. If the response only consists of the log corresponding
+ // to the cursor and no log after it, then we understand that there are no new
+ // logs
+ if len(logs) == 1 && logs[0].Sequence.Cursor == cursor {
+ w.lggr.Infow("No new logs since", "cursor", cursor)
+ continue
}
- // block on fan-in until all fetched event logs are sent to the handlers
- w.orderAndSend(
- ctx,
- len(w.eventTypes),
- w.batchCh,
- sendLog,
- )
- }
- }
-}
+ var events []WorkflowRegistryEventResponse
+ for _, log := range logs {
+ if log.Sequence.Cursor == cursor {
+ continue
+ }
-// orderAndSend reads n batches from the batch channel, heapifies all the batches then dequeues
-// the min heap via the sendLog function.
-func (w *workflowRegistry) orderAndSend(
- ctx context.Context,
- batchCount int,
- batchCh <-chan []WorkflowRegistryEventResponse,
- sendLog func(WorkflowRegistryEventResponse),
-) {
- for {
- select {
- case <-ctx.Done():
- return
- case batch := <-batchCh:
- for _, response := range batch {
- w.heap.Push(response)
+ events = append(events, toWorkflowRegistryEventResponse(log.Sequence, log.EventType, w.lggr))
+ cursor = log.Sequence.Cursor
}
- batchCount--
- // If we have received responses for all the events, then we can drain the heap.
- if batchCount == 0 {
- for w.heap.Len() > 0 {
- sendLog(w.heap.Pop())
+ for _, event := range events {
+ err := w.handler.Handle(ctx, event.Event)
+ if err != nil {
+ w.lggr.Errorw("failed to handle event", "err", err, "type", event.Event.EventType)
}
- return
}
}
}
@@ -417,122 +349,19 @@ func (w *workflowRegistry) getTicker() <-chan time.Time {
return w.ticker
}
-// getContractReader initializes a contract reader if needed, otherwise returns the existing
-// reader.
-func (w *workflowRegistry) getContractReader(ctx context.Context) (ContractReader, error) {
- c := types.BoundContract{
- Name: WorkflowRegistryContractName,
- Address: w.workflowRegistryAddress,
- }
-
- if w.reader == nil {
- reader, err := getWorkflowRegistryEventReader(ctx, w.newContractReaderFn, c)
- if err != nil {
- return nil, err
- }
-
- w.reader = reader
- }
-
- return w.reader, nil
-}
-
-type queryEventConfig struct {
- ContractName string
- ContractAddress string
- WorkflowEventPollerConfig
+type sequenceWithEventType struct {
+ Sequence types.Sequence
+ EventType WorkflowRegistryEventType
}
-// queryEvent queries the contract for events of the given type on each tick from the ticker.
-// Sends a batch of event logs to the batch channel. The batch represents all the
-// event logs read since the last query. Loops until the context is canceled.
-func queryEvent(
+func (w *workflowRegistry) newWorkflowRegistryContractReader(
ctx context.Context,
- ticker <-chan struct{},
- lggr logger.Logger,
- reader ContractReader,
- lastReadBlockNumber string,
- cfg queryEventConfig,
- et WorkflowRegistryEventType,
- batchCh chan<- []WorkflowRegistryEventResponse,
-) {
- // create query
- var (
- logData values.Value
- cursor = ""
- limitAndSort = query.LimitAndSort{
- SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)},
- Limit: query.Limit{Count: cfg.QueryCount},
- }
- bc = types.BoundContract{
- Name: cfg.ContractName,
- Address: cfg.ContractAddress,
- }
- )
-
- // Loop until canceled
- for {
- select {
- case <-ctx.Done():
- return
- case <-ticker:
- responseBatch := []WorkflowRegistryEventResponse{}
-
- if cursor != "" {
- limitAndSort.Limit = query.CursorLimit(cursor, query.CursorFollowing, cfg.QueryCount)
- }
-
- logs, err := reader.QueryKey(
- ctx,
- bc,
- query.KeyFilter{
- Key: string(et),
- Expressions: []query.Expression{
- query.Confidence(primitives.Finalized),
- query.Block(lastReadBlockNumber, primitives.Gte),
- },
- },
- limitAndSort,
- &logData,
- )
- lcursor := cursor
- if lcursor == "" {
- lcursor = "empty"
- }
- lggr.Debugw("QueryKeys called", "logs", len(logs), "eventType", et, "lastReadBlockNumber", lastReadBlockNumber, "logCursor", lcursor)
-
- if err != nil {
- lggr.Errorw("QueryKey failure", "err", err)
- continue
- }
-
- // ChainReader QueryKey API provides logs including the cursor value and not
- // after the cursor value. If the response only consists of the log corresponding
- // to the cursor and no log after it, then we understand that there are no new
- // logs
- if len(logs) == 1 && logs[0].Cursor == cursor {
- lggr.Infow("No new logs since", "cursor", cursor)
- continue
- }
-
- for _, log := range logs {
- if log.Cursor == cursor {
- continue
- }
-
- responseBatch = append(responseBatch, toWorkflowRegistryEventResponse(log, et, lggr))
- cursor = log.Cursor
- }
- batchCh <- responseBatch
- }
+) (ContractReader, error) {
+ bc := types.BoundContract{
+ Name: WorkflowRegistryContractName,
+ Address: w.workflowRegistryAddress,
}
-}
-func getWorkflowRegistryEventReader(
- ctx context.Context,
- newReaderFn newContractReaderFn,
- bc types.BoundContract,
-) (ContractReader, error) {
contractReaderCfg := evmtypes.ChainReaderConfig{
Contracts: map[string]evmtypes.ChainContractReader{
WorkflowRegistryContractName: {
@@ -548,6 +377,9 @@ func getWorkflowRegistryEventReader(
},
ContractABI: workflow_registry_wrapper.WorkflowRegistryABI,
Configs: map[string]*evmtypes.ChainReaderDefinition{
+ GetWorkflowMetadataListByDONMethodName: {
+ ChainSpecificName: GetWorkflowMetadataListByDONMethodName,
+ },
string(ForceUpdateSecretsEvent): {
ChainSpecificName: string(ForceUpdateSecretsEvent),
ReadType: evmtypes.Event,
@@ -582,7 +414,7 @@ func getWorkflowRegistryEventReader(
return nil, err
}
- reader, err := newReaderFn(ctx, marshalledCfg)
+ reader, err := w.newContractReaderFn(ctx, marshalledCfg)
if err != nil {
return nil, err
}
@@ -612,59 +444,9 @@ func (r workflowAsEvent) GetData() any {
return r.Data
}
-type workflowRegistryContractLoader struct {
- lggr logger.Logger
- workflowRegistryAddress string
- newContractReaderFn newContractReaderFn
- handler evtHandler
-}
-
-func NewWorkflowRegistryContractLoader(
- lggr logger.Logger,
- workflowRegistryAddress string,
- newContractReaderFn newContractReaderFn,
- handler evtHandler,
-) *workflowRegistryContractLoader {
- return &workflowRegistryContractLoader{
- lggr: lggr.Named("WorkflowRegistryContractLoader"),
- workflowRegistryAddress: workflowRegistryAddress,
- newContractReaderFn: newContractReaderFn,
- handler: handler,
- }
-}
-
-func (l *workflowRegistryContractLoader) LoadWorkflows(ctx context.Context, don capabilities.DON) (*types.Head, error) {
- // Build the ContractReader config
- contractReaderCfg := evmtypes.ChainReaderConfig{
- Contracts: map[string]evmtypes.ChainContractReader{
- WorkflowRegistryContractName: {
- ContractABI: workflow_registry_wrapper.WorkflowRegistryABI,
- Configs: map[string]*evmtypes.ChainReaderDefinition{
- GetWorkflowMetadataListByDONMethodName: {
- ChainSpecificName: GetWorkflowMetadataListByDONMethodName,
- },
- },
- },
- },
- }
-
- contractReaderCfgBytes, err := json.Marshal(contractReaderCfg)
- if err != nil {
- return nil, fmt.Errorf("failed to marshal contract reader config: %w", err)
- }
-
- contractReader, err := l.newContractReaderFn(ctx, contractReaderCfgBytes)
- if err != nil {
- return nil, fmt.Errorf("failed to create contract reader: %w", err)
- }
-
- err = contractReader.Bind(ctx, []types.BoundContract{{Name: WorkflowRegistryContractName, Address: l.workflowRegistryAddress}})
- if err != nil {
- return nil, fmt.Errorf("failed to bind contract reader: %w", err)
- }
-
+func (w *workflowRegistry) loadWorkflows(ctx context.Context, don capabilities.DON, contractReader ContractReader) (*types.Head, error) {
contractBinding := types.BoundContract{
- Address: l.workflowRegistryAddress,
+ Address: w.workflowRegistryAddress,
Name: WorkflowRegistryContractName,
}
@@ -681,10 +463,10 @@ func (l *workflowRegistryContractLoader) LoadWorkflows(ctx context.Context, don
var workflows GetWorkflowMetadataListByDONReturnVal
headAtLastRead, err = contractReader.GetLatestValueWithHeadData(ctx, readIdentifier, primitives.Finalized, params, &workflows)
if err != nil {
- return nil, fmt.Errorf("failed to get workflow metadata for don %w", err)
+ return nil, fmt.Errorf("failed to get lastest value with head data %w", err)
}
- l.lggr.Debugw("Rehydrating existing workflows", "len", len(workflows.WorkflowMetadataList))
+ w.lggr.Debugw("Rehydrating existing workflows", "len", len(workflows.WorkflowMetadataList))
for _, workflow := range workflows.WorkflowMetadataList {
toRegisteredEvent := WorkflowRegistryWorkflowRegisteredV1{
WorkflowID: workflow.WorkflowID,
@@ -696,11 +478,11 @@ func (l *workflowRegistryContractLoader) LoadWorkflows(ctx context.Context, don
ConfigURL: workflow.ConfigURL,
SecretsURL: workflow.SecretsURL,
}
- if err = l.handler.Handle(ctx, workflowAsEvent{
+ if err = w.handler.Handle(ctx, workflowAsEvent{
Data: toRegisteredEvent,
EventType: WorkflowRegisteredEvent,
}); err != nil {
- l.lggr.Errorf("failed to handle workflow registration: %s", err)
+ w.lggr.Errorf("failed to handle workflow registration: %s", err)
}
}
diff --git a/core/services/workflows/syncer/workflow_registry_test.go b/core/services/workflows/syncer/workflow_registry_test.go
deleted file mode 100644
index 621d3d123d5..00000000000
--- a/core/services/workflows/syncer/workflow_registry_test.go
+++ /dev/null
@@ -1,234 +0,0 @@
-package syncer
-
-import (
- "context"
- "encoding/hex"
- "testing"
- "time"
-
- "github.com/stretchr/testify/mock"
-
- "github.com/jonboulle/clockwork"
-
- "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
- "github.com/smartcontractkit/chainlink-common/pkg/custmsg"
- "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
- types "github.com/smartcontractkit/chainlink-common/pkg/types"
- query "github.com/smartcontractkit/chainlink-common/pkg/types/query"
- "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
- "github.com/smartcontractkit/chainlink-common/pkg/values"
- "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/keys/workflowkey"
- "github.com/smartcontractkit/chainlink/v2/core/utils/crypto"
- "github.com/smartcontractkit/chainlink/v2/core/utils/matches"
-
- "github.com/stretchr/testify/require"
-)
-
-type testDonNotifier struct {
- don capabilities.DON
- err error
-}
-
-func (t *testDonNotifier) WaitForDon(ctx context.Context) (capabilities.DON, error) {
- return t.don, t.err
-}
-
-func Test_Workflow_Registry_Syncer(t *testing.T) {
- var (
- giveContents = "contents"
- wantContents = "updated contents"
- contractAddress = "0xdeadbeef"
- giveCfg = WorkflowEventPollerConfig{
- QueryCount: 20,
- }
- giveURL = "http://example.com"
- giveHash, err = crypto.Keccak256([]byte(giveURL))
-
- giveLog = types.Sequence{
- Data: map[string]any{
- "SecretsURLHash": giveHash,
- "Owner": "0xowneraddr",
- },
- Cursor: "cursor",
- }
- )
-
- require.NoError(t, err)
-
- var (
- lggr = logger.TestLogger(t)
- db = pgtest.NewSqlxDB(t)
- orm = &orm{ds: db, lggr: lggr}
- ctx, cancel = context.WithCancel(testutils.Context(t))
- reader = NewMockContractReader(t)
- emitter = custmsg.NewLabeler()
- gateway = func(_ context.Context, _ string) ([]byte, error) {
- return []byte(wantContents), nil
- }
- ticker = make(chan time.Time)
-
- handler = NewEventHandler(lggr, orm, gateway, nil, nil,
- emitter, clockwork.NewFakeClock(), workflowkey.Key{})
- loader = NewWorkflowRegistryContractLoader(lggr, contractAddress, func(ctx context.Context, bytes []byte) (ContractReader, error) {
- return reader, nil
- }, handler)
-
- worker = NewWorkflowRegistry(lggr, func(ctx context.Context, bytes []byte) (ContractReader, error) {
- return reader, nil
- }, contractAddress,
- WorkflowEventPollerConfig{
- QueryCount: 20,
- }, handler, loader,
- &testDonNotifier{
- don: capabilities.DON{
- ID: 1,
- },
- err: nil,
- },
- WithTicker(ticker))
- )
-
- // Cleanup the worker
- defer cancel()
-
- // Seed the DB with an original entry
- _, err = orm.Create(ctx, giveURL, hex.EncodeToString(giveHash), giveContents)
- require.NoError(t, err)
-
- // Mock out the contract reader query
- reader.EXPECT().QueryKey(
- matches.AnyContext,
- types.BoundContract{
- Name: WorkflowRegistryContractName,
- Address: contractAddress,
- },
- query.KeyFilter{
- Key: string(ForceUpdateSecretsEvent),
- Expressions: []query.Expression{
- query.Confidence(primitives.Finalized),
- query.Block("0", primitives.Gte),
- },
- },
- query.LimitAndSort{
- SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)},
- Limit: query.Limit{Count: giveCfg.QueryCount},
- },
- new(values.Value),
- ).Return([]types.Sequence{giveLog}, nil)
- reader.EXPECT().QueryKey(
- matches.AnyContext,
- types.BoundContract{
- Name: WorkflowRegistryContractName,
- Address: contractAddress,
- },
- query.KeyFilter{
- Key: string(WorkflowPausedEvent),
- Expressions: []query.Expression{
- query.Confidence(primitives.Finalized),
- query.Block("0", primitives.Gte),
- },
- },
- query.LimitAndSort{
- SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)},
- Limit: query.Limit{Count: giveCfg.QueryCount},
- },
- new(values.Value),
- ).Return([]types.Sequence{}, nil)
- reader.EXPECT().QueryKey(
- matches.AnyContext,
- types.BoundContract{
- Name: WorkflowRegistryContractName,
- Address: contractAddress,
- },
- query.KeyFilter{
- Key: string(WorkflowDeletedEvent),
- Expressions: []query.Expression{
- query.Confidence(primitives.Finalized),
- query.Block("0", primitives.Gte),
- },
- },
- query.LimitAndSort{
- SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)},
- Limit: query.Limit{Count: giveCfg.QueryCount},
- },
- new(values.Value),
- ).Return([]types.Sequence{}, nil)
- reader.EXPECT().QueryKey(
- matches.AnyContext,
- types.BoundContract{
- Name: WorkflowRegistryContractName,
- Address: contractAddress,
- },
- query.KeyFilter{
- Key: string(WorkflowActivatedEvent),
- Expressions: []query.Expression{
- query.Confidence(primitives.Finalized),
- query.Block("0", primitives.Gte),
- },
- },
- query.LimitAndSort{
- SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)},
- Limit: query.Limit{Count: giveCfg.QueryCount},
- },
- new(values.Value),
- ).Return([]types.Sequence{}, nil)
- reader.EXPECT().QueryKey(
- matches.AnyContext,
- types.BoundContract{
- Name: WorkflowRegistryContractName,
- Address: contractAddress,
- },
- query.KeyFilter{
- Key: string(WorkflowUpdatedEvent),
- Expressions: []query.Expression{
- query.Confidence(primitives.Finalized),
- query.Block("0", primitives.Gte),
- },
- },
- query.LimitAndSort{
- SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)},
- Limit: query.Limit{Count: giveCfg.QueryCount},
- },
- new(values.Value),
- ).Return([]types.Sequence{}, nil)
- reader.EXPECT().QueryKey(
- matches.AnyContext,
- types.BoundContract{
- Name: WorkflowRegistryContractName,
- Address: contractAddress,
- },
- query.KeyFilter{
- Key: string(WorkflowRegisteredEvent),
- Expressions: []query.Expression{
- query.Confidence(primitives.Finalized),
- query.Block("0", primitives.Gte),
- },
- },
- query.LimitAndSort{
- SortBy: []query.SortBy{query.NewSortByTimestamp(query.Asc)},
- Limit: query.Limit{Count: giveCfg.QueryCount},
- },
- new(values.Value),
- ).Return([]types.Sequence{}, nil)
- reader.EXPECT().GetLatestValueWithHeadData(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&types.Head{
- Height: "0",
- }, nil)
- reader.EXPECT().Start(mock.Anything).Return(nil)
- reader.EXPECT().Bind(mock.Anything, mock.Anything).Return(nil)
-
- // Go run the worker
- servicetest.Run(t, worker)
-
- // Send a tick to start a query
- ticker <- time.Now()
-
- // Require the secrets contents to eventually be updated
- require.Eventually(t, func() bool {
- secrets, err := orm.GetContents(ctx, giveURL)
- require.NoError(t, err)
- return secrets == wantContents
- }, 5*time.Second, time.Second)
-}
diff --git a/core/store/dialects/dialects.go b/core/store/dialects/dialects.go
deleted file mode 100644
index d250fa1b99b..00000000000
--- a/core/store/dialects/dialects.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package dialects
-
-import (
- // need to make sure pgx driver is registered before opening connection
- _ "github.com/jackc/pgx/v4/stdlib"
-)
-
-// DialectName is a compiler enforced type used that maps to database dialect names
-type DialectName string
-
-const (
- // Postgres represents the postgres dialect.
- Postgres DialectName = "pgx"
- // TransactionWrappedPostgres is useful for tests.
- // When the connection is opened, it starts a transaction and all
- // operations performed on the DB will be within that transaction.
- TransactionWrappedPostgres DialectName = "txdb"
-)
diff --git a/core/store/migrate/migrations/0036_external_job_id.go b/core/store/migrate/migrations/0036_external_job_id.go
index 47442124a33..a32ff470d67 100644
--- a/core/store/migrate/migrations/0036_external_job_id.go
+++ b/core/store/migrate/migrations/0036_external_job_id.go
@@ -56,7 +56,6 @@ func Up36(ctx context.Context, tx *sql.Tx) error {
stmt += ` AS vals(external_job_id, id) WHERE vals.id = j.id`
if _, err := tx.ExecContext(ctx, stmt); err != nil {
return err
-
}
}
diff --git a/core/store/migrate/migrations/0259_add_workflow_secrets.sql b/core/store/migrate/migrations/0259_add_workflow_secrets.sql
index fb76d945571..420f7ed6e49 100644
--- a/core/store/migrate/migrations/0259_add_workflow_secrets.sql
+++ b/core/store/migrate/migrations/0259_add_workflow_secrets.sql
@@ -38,4 +38,5 @@ DROP INDEX IF EXISTS idx_secrets_url_hash;
-- Drop the workflow_artifacts table
DROP TABLE IF EXISTS workflow_secrets;
--- +goose StatementEnd
\ No newline at end of file
+-- +goose StatementEnd
+
diff --git a/core/store/migrate/migrations/0261_remove_unique_constraint_secrets.sql b/core/store/migrate/migrations/0261_remove_unique_constraint_secrets.sql
new file mode 100644
index 00000000000..15f59d8ae28
--- /dev/null
+++ b/core/store/migrate/migrations/0261_remove_unique_constraint_secrets.sql
@@ -0,0 +1,10 @@
+-- +goose Up
+-- +goose StatementBegin
+-- unique constraint on workflow_owner and workflow_name
+ALTER TABLE workflow_specs DROP CONSTRAINT workflow_specs_secrets_id_key;
+-- +goose StatementEnd
+
+-- +goose Down
+-- +goose StatementBegin
+ALTER TABLE workflow_specs ADD CONSTRAINT workflow_specs_secrets_id_key unique (secrets_id);
+-- +goose StatementEnd
diff --git a/core/store/migrate/migrations/0262_add_solana_schema.sql b/core/store/migrate/migrations/0262_add_solana_schema.sql
new file mode 100644
index 00000000000..035d3ff3d61
--- /dev/null
+++ b/core/store/migrate/migrations/0262_add_solana_schema.sql
@@ -0,0 +1,72 @@
+-- +goose Up
+-- +goose StatementBegin
+-- This removes evm from the search path, to avoid risk of an unqualified query intended to act on a Solana table accidentally
+-- acting on the corresponding evm table. This makes schema qualification mandatory for all chain-specific queries.
+SET search_path TO public;
+CREATE SCHEMA solana;
+
+CREATE TABLE solana.log_poller_filters (
+ id BIGSERIAL PRIMARY KEY,
+ chain_id TEXT NOT NULL, -- use human-readable name instead of genesis block hash to reduce index size by 50%
+ name TEXT NOT NULL,
+ address BYTEA NOT NULL,
+ event_name TEXT NOT NULL,
+ event_sig BYTEA NOT NULL,
+ starting_block BIGINT NOT NULL,
+ event_idl TEXT,
+ subkey_paths json, -- A list of subkeys to be indexed, represented by their json paths in the event struct. Forced to use json's 2d array as text[][] requires all paths to have equal length.
+ retention BIGINT NOT NULL DEFAULT 0, -- we don’t have to implement this initially, but good to include it in the schema
+ max_logs_kept BIGINT NOT NULL DEFAULT 0, -- same as retention, no need to implement yet
+ is_deleted BOOLEAN NOT NULL DEFAULT FALSE
+);
+
+CREATE UNIQUE INDEX IF NOT EXISTS solana_log_poller_filter_name ON solana.log_poller_filters (chain_id, name) WHERE NOT is_deleted;
+
+CREATE TABLE solana.logs (
+ id BIGSERIAL PRIMARY KEY,
+ filter_id BIGINT NOT NULL REFERENCES solana.log_poller_filters (id) ON DELETE CASCADE,
+ chain_id TEXT not null, -- use human-readable name instead of genesis block hash to reduce index size by 50%
+ log_index bigint not null,
+ block_hash bytea not null,
+ block_number bigint not null CHECK (block_number > 0),
+ block_timestamp timestamp with time zone not null,
+ address bytea not null,
+ event_sig bytea not null,
+ subkey_values bytea[] not null,
+ tx_hash bytea not null,
+ data bytea not null,
+ created_at timestamp with time zone not null,
+ expires_at timestamp with time zone null, -- null to indicate no timebase expiry
+ sequence_num bigint not null
+);
+
+CREATE INDEX IF NOT EXISTS solana_logs_idx_by_timestamp ON solana.logs (chain_id, address, event_sig, block_timestamp, block_number);
+
+CREATE INDEX IF NOT EXISTS solana_logs_idx ON solana.logs (chain_id, block_number, address, event_sig);
+
+CREATE INDEX IF NOT EXISTS solana_logs_idx_subkey_one ON solana.logs ((subkey_values[1]));
+CREATE INDEX IF NOT EXISTS solana_logs_idx_subkey_two ON solana.logs ((subkey_values[2]));
+CREATE INDEX IF NOT EXISTS solana_logs_idx_subkey_three ON solana.logs ((subkey_values[3]));
+CREATE INDEX IF NOT EXISTS solana_logs_idx_subkey_four ON solana.logs ((subkey_values[4]));
+
+CREATE INDEX IF NOT EXISTS solana_logs_idx_tx_hash ON solana.logs (tx_hash);
+
+-- Useful for the current form of those queries: WHERE chain_id = $1 AND address = $2 AND event_sig = $3 ... ORDER BY block_number, log_index
+-- log_index is not included in this index because it increases the index size by ~ 10% for a likely negligible performance benefit
+CREATE INDEX IF NOT EXISTS solana_logs_idx_chain_address_event_block ON solana.logs (chain_id, address, event_sig, block_number);
+
+CREATE UNIQUE INDEX IF NOT EXISTS solana_logs_idx_chain_filter_block_logindex ON solana.logs USING btree (chain_id, filter_id, block_number, log_index);
+
+-- +goose StatementEnd
+
+
+-- +goose Down
+-- +goose StatementBegin
+
+DROP TABLE IF EXISTS solana.logs;
+DROP TABLE IF EXISTS solana.log_poller_filters;
+
+DROP SCHEMA solana;
+
+SET search_path TO public,evm;
+-- +goose StatementEnd
diff --git a/core/utils/testutils/heavyweight/orm.go b/core/utils/testutils/heavyweight/orm.go
index 536515e02e4..775eabab0c8 100644
--- a/core/utils/testutils/heavyweight/orm.go
+++ b/core/utils/testutils/heavyweight/orm.go
@@ -14,12 +14,13 @@ import (
"github.com/jmoiron/sqlx"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
"github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
"github.com/smartcontractkit/chainlink/v2/core/services/pg"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
"github.com/smartcontractkit/chainlink/v2/core/store/models"
"github.com/smartcontractkit/chainlink/v2/internal/testdb"
)
@@ -53,10 +54,10 @@ const (
)
func (c Kind) PrepareDB(t testing.TB, overrideFn func(c *chainlink.Config, s *chainlink.Secrets)) (chainlink.GeneralConfig, *sqlx.DB) {
- testutils.SkipShort(t, "FullTestDB")
+ tests.SkipShort(t, "FullTestDB")
gcfg := configtest.NewGeneralConfigSimulated(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Database.Dialect = dialects.Postgres
+ c.Database.Dialect = pgcommon.Postgres
if overrideFn != nil {
overrideFn(c, s)
}
@@ -65,7 +66,7 @@ func (c Kind) PrepareDB(t testing.TB, overrideFn func(c *chainlink.Config, s *ch
require.NoError(t, os.MkdirAll(gcfg.RootDir(), 0700))
migrationTestDBURL, err := testdb.CreateOrReplace(gcfg.Database().URL(), generateName(), c != KindEmpty)
require.NoError(t, err)
- db, err := pg.NewConnection(tests.Context(t), migrationTestDBURL, dialects.Postgres, gcfg.Database())
+ db, err := pg.NewConnection(tests.Context(t), migrationTestDBURL, pgcommon.Postgres, gcfg.Database())
require.NoError(t, err)
t.Cleanup(func() {
require.NoError(t, db.Close()) // must close before dropping
@@ -74,7 +75,7 @@ func (c Kind) PrepareDB(t testing.TB, overrideFn func(c *chainlink.Config, s *ch
})
gcfg = configtest.NewGeneralConfigSimulated(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Database.Dialect = dialects.Postgres
+ c.Database.Dialect = pgcommon.Postgres
s.Database.URL = models.MustSecretURL(migrationTestDBURL)
if overrideFn != nil {
overrideFn(c, s)
diff --git a/core/web/chains_controller.go b/core/web/chains_controller.go
index 6bc5ee4daa3..a99cbf4ca4b 100644
--- a/core/web/chains_controller.go
+++ b/core/web/chains_controller.go
@@ -5,13 +5,14 @@ import (
"net/http"
"github.com/gin-gonic/gin"
- "github.com/manyminds/api2go/jsonapi"
"github.com/smartcontractkit/chainlink-common/pkg/types"
+ commonTypes "github.com/smartcontractkit/chainlink/v2/common/types"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/logger/audit"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+ "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
)
type ChainsController interface {
@@ -21,16 +22,6 @@ type ChainsController interface {
Show(*gin.Context)
}
-type chainsController[R jsonapi.EntityNamer] struct {
- network string
- resourceName string
- chainStats chainlink.ChainStatuser
- errNotEnabled error
- newResource func(types.ChainStatus) R
- lggr logger.Logger
- auditLogger audit.AuditLogger
-}
-
type errChainDisabled struct {
name string
tomlKey string
@@ -40,50 +31,51 @@ func (e errChainDisabled) Error() string {
return fmt.Sprintf("%s is disabled: Set %s=true to enable", e.name, e.tomlKey)
}
-func newChainsController[R jsonapi.EntityNamer](network string, chainStats chainlink.ChainsNodesStatuser, errNotEnabled error,
- newResource func(types.ChainStatus) R, lggr logger.Logger, auditLogger audit.AuditLogger) *chainsController[R] {
- return &chainsController[R]{
- network: network,
- resourceName: network + "_chain",
- chainStats: chainStats,
- errNotEnabled: errNotEnabled,
- newResource: newResource,
- lggr: lggr,
- auditLogger: auditLogger,
+type chainsController struct {
+ chainStats chainlink.RelayerChainInteroperators
+ newResource func(commonTypes.ChainStatusWithID) presenters.ChainResource
+ lggr logger.Logger
+ auditLogger audit.AuditLogger
+}
+
+func NewChainsController(chainStats chainlink.RelayerChainInteroperators, lggr logger.Logger, auditLogger audit.AuditLogger) *chainsController {
+ return &chainsController{
+ chainStats: chainStats,
+ newResource: presenters.NewChainResource,
+ lggr: lggr,
+ auditLogger: auditLogger,
}
}
-func (cc *chainsController[R]) Index(c *gin.Context, size, page, offset int) {
- if cc.chainStats == nil {
- jsonAPIError(c, http.StatusBadRequest, cc.errNotEnabled)
- return
+func (cc *chainsController) Index(c *gin.Context, size, page, offset int) {
+ chainStats := cc.chainStats
+ if network := c.Param("network"); network != "" {
+ chainStats = chainStats.List(chainlink.FilterRelayersByType(network))
}
- chains, count, err := cc.chainStats.ChainStatuses(c.Request.Context(), offset, size)
+
+ chains, count, err := chainStats.ChainStatuses(c.Request.Context(), offset, size)
if err != nil {
jsonAPIError(c, http.StatusBadRequest, err)
return
}
- var resources []R
+ resources := []presenters.ChainResource{}
for _, chain := range chains {
resources = append(resources, cc.newResource(chain))
}
- paginatedResponse(c, cc.resourceName, size, page, resources, count, err)
+ paginatedResponse(c, "chain", size, page, resources, count, err)
}
-func (cc *chainsController[R]) Show(c *gin.Context) {
- if cc.chainStats == nil {
- jsonAPIError(c, http.StatusBadRequest, cc.errNotEnabled)
- return
- }
- relayID := types.RelayID{Network: cc.network, ChainID: c.Param("ID")}
+func (cc *chainsController) Show(c *gin.Context) {
+ relayID := types.RelayID{Network: c.Param("network"), ChainID: c.Param("ID")}
chain, err := cc.chainStats.ChainStatus(c.Request.Context(), relayID)
+ status := commonTypes.ChainStatusWithID{ChainStatus: chain, RelayID: relayID}
if err != nil {
jsonAPIError(c, http.StatusBadRequest, err)
return
}
- jsonAPIResponse(c, cc.newResource(chain), cc.resourceName)
+ jsonAPIResponse(c, cc.newResource(status), "chain")
}
diff --git a/core/web/chains_controller_test.go b/core/web/chains_controller_test.go
new file mode 100644
index 00000000000..d4e9b785f23
--- /dev/null
+++ b/core/web/chains_controller_test.go
@@ -0,0 +1,586 @@
+package web_test
+
+import (
+ "fmt"
+ "math/big"
+ "net/http"
+ "sort"
+ "testing"
+ "time"
+
+ "github.com/manyminds/api2go/jsonapi"
+ "github.com/shopspring/decimal"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+ "golang.org/x/exp/rand"
+
+ commoncfg "github.com/smartcontractkit/chainlink-common/pkg/config"
+ commonTypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+ coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config"
+ "github.com/smartcontractkit/chainlink-solana/pkg/solana/config"
+
+ evmcfg "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
+ ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/cosmostest"
+ "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+ "github.com/smartcontractkit/chainlink/v2/core/web"
+ "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
+)
+
+func Test_EVMChainsController_Show(t *testing.T) {
+ t.Parallel()
+
+ validID := ubig.New(testutils.NewRandomEVMChainID())
+
+ testCases := []struct {
+ name string
+ inputID string
+ wantStatusCode int
+ want *evmcfg.EVMConfig
+ }{
+ {
+ inputID: validID.String(),
+ name: "success",
+ want: &evmcfg.EVMConfig{
+ ChainID: validID,
+ Enabled: ptr(true),
+ Chain: evmcfg.Defaults(nil, &evmcfg.Chain{
+ GasEstimator: evmcfg.GasEstimator{
+ EIP1559DynamicFees: ptr(true),
+ BlockHistory: evmcfg.BlockHistoryEstimator{
+ BlockHistorySize: ptr[uint16](50),
+ },
+ },
+ RPCBlockQueryDelay: ptr[uint16](23),
+ MinIncomingConfirmations: ptr[uint32](12),
+ LinkContractAddress: ptr(types.EIP55AddressFromAddress(testutils.NewAddress())),
+ }),
+ },
+ wantStatusCode: http.StatusOK,
+ },
+ {
+ inputID: "invalidid",
+ name: "invalid id",
+ want: nil,
+ wantStatusCode: http.StatusBadRequest,
+ },
+ {
+ inputID: "234",
+ name: "not found",
+ want: nil,
+ wantStatusCode: http.StatusBadRequest,
+ },
+ }
+
+ for _, testCase := range testCases {
+ tc := testCase
+
+ t.Run(tc.name, func(t *testing.T) {
+ t.Parallel()
+
+ controller := setupEVMChainsControllerTest(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ if tc.want != nil {
+ c.EVM = evmcfg.EVMConfigs{tc.want}
+ }
+ }))
+
+ wantedResult := tc.want
+ resp, cleanup := controller.client.Get(
+ "/v2/chains/evm/" + tc.inputID,
+ )
+ t.Cleanup(cleanup)
+ require.Equal(t, tc.wantStatusCode, resp.StatusCode)
+
+ if wantedResult != nil {
+ resource1 := presenters.ChainResource{}
+ err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)
+ require.NoError(t, err)
+
+ assert.Equal(t, resource1.ID, wantedResult.ChainID.String())
+ toml, err := wantedResult.TOMLString()
+ require.NoError(t, err)
+ assert.Equal(t, toml, resource1.Config)
+ }
+ })
+ }
+}
+
+func Test_EVMChainsController_Index(t *testing.T) {
+ t.Parallel()
+
+ // sort test chain ids to make expected comparison easy
+ chainIDs := []*big.Int{testutils.NewRandomEVMChainID(), testutils.NewRandomEVMChainID(), testutils.NewRandomEVMChainID()}
+ sort.Slice(chainIDs, func(i, j int) bool {
+ return chainIDs[i].String() < chainIDs[j].String()
+ })
+
+ configuredChains := evmcfg.EVMConfigs{
+ {ChainID: ubig.New(chainIDs[0]), Chain: evmcfg.Defaults(nil)},
+ {
+ ChainID: ubig.New(chainIDs[1]),
+ Chain: evmcfg.Defaults(nil, &evmcfg.Chain{
+ RPCBlockQueryDelay: ptr[uint16](13),
+ GasEstimator: evmcfg.GasEstimator{
+ EIP1559DynamicFees: ptr(true),
+ BlockHistory: evmcfg.BlockHistoryEstimator{
+ BlockHistorySize: ptr[uint16](1),
+ },
+ },
+ MinIncomingConfirmations: ptr[uint32](120),
+ }),
+ },
+ {
+ ChainID: ubig.New(chainIDs[2]),
+ Chain: evmcfg.Defaults(nil, &evmcfg.Chain{
+ RPCBlockQueryDelay: ptr[uint16](5),
+ GasEstimator: evmcfg.GasEstimator{
+ EIP1559DynamicFees: ptr(false),
+ BlockHistory: evmcfg.BlockHistoryEstimator{
+ BlockHistorySize: ptr[uint16](2),
+ },
+ },
+ MinIncomingConfirmations: ptr[uint32](30),
+ }),
+ },
+ }
+
+ assert.Len(t, configuredChains, 3)
+ controller := setupEVMChainsControllerTest(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.EVM = append(c.EVM, configuredChains...)
+ }))
+
+ badResp, cleanup := controller.client.Get("/v2/chains/evm?size=asd")
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusUnprocessableEntity, badResp.StatusCode)
+
+ resp, cleanup := controller.client.Get("/v2/chains/evm?size=3")
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusOK, resp.StatusCode)
+
+ body := cltest.ParseResponseBody(t, resp)
+
+ metaCount, err := cltest.ParseJSONAPIResponseMetaCount(body)
+ require.NoError(t, err)
+ require.Equal(t, 1+len(configuredChains), metaCount)
+
+ var links jsonapi.Links
+
+ var gotChains []presenters.ChainResource
+ err = web.ParsePaginatedResponse(body, &gotChains, &links)
+ require.NoError(t, err)
+ assert.NotEmpty(t, links["next"].Href)
+ assert.Empty(t, links["prev"].Href)
+
+ assert.Len(t, links, 1)
+ // the difference in index value here seems to be due to the fact
+ // that cltest always has a default EVM chain, which is the off-by-one
+ // in the indices
+ assert.Equal(t, gotChains[2].ID, configuredChains[1].ChainID.String())
+ toml, err := configuredChains[1].TOMLString()
+ require.NoError(t, err)
+ assert.Equal(t, toml, gotChains[2].Config)
+
+ resp, cleanup = controller.client.Get(links["next"].Href)
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusOK, resp.StatusCode)
+
+ gotChains = []presenters.ChainResource{}
+ err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &gotChains, &links)
+ require.NoError(t, err)
+ assert.Empty(t, links["next"].Href)
+ assert.NotEmpty(t, links["prev"].Href)
+
+ assert.Len(t, links, 1)
+ assert.Equal(t, gotChains[0].ID, configuredChains[2].ChainID.String())
+ toml, err = configuredChains[2].TOMLString()
+ require.NoError(t, err)
+ assert.Equal(t, toml, gotChains[0].Config)
+}
+
+type TestEVMChainsController struct {
+ app *cltest.TestApplication
+ client cltest.HTTPClientCleaner
+}
+
+func setupEVMChainsControllerTest(t *testing.T, cfg chainlink.GeneralConfig) *TestEVMChainsController {
+ // Using this instead of `NewApplicationEVMDisabled` since we need the chain set to be loaded in the app
+ // for the sake of the API endpoints to work properly
+ app := cltest.NewApplicationWithConfig(t, cfg)
+ ctx := testutils.Context(t)
+ require.NoError(t, app.Start(ctx))
+
+ client := app.NewHTTPClient(nil)
+
+ return &TestEVMChainsController{
+ app: app,
+ client: client,
+ }
+}
+
+func ptr[T any](t T) *T { return &t }
+
+func Test_CosmosChainsController_Show(t *testing.T) {
+ t.Parallel()
+
+ const validID = "Chainlink-12"
+
+ testCases := []struct {
+ name string
+ inputID string
+ wantStatusCode int
+ want func(t *testing.T, app *cltest.TestApplication) *commonTypes.ChainStatus
+ }{
+ {
+ inputID: validID,
+ name: "success",
+ want: func(t *testing.T, app *cltest.TestApplication) *commonTypes.ChainStatus {
+ return &commonTypes.ChainStatus{
+ ID: validID,
+ Enabled: true,
+ Config: `ChainID = 'Chainlink-12'
+Enabled = true
+Bech32Prefix = 'wasm'
+BlockRate = '6s'
+BlocksUntilTxTimeout = 30
+ConfirmPollPeriod = '1s'
+FallbackGasPrice = '9.999'
+GasToken = 'ucosm'
+GasLimitMultiplier = '1.55555'
+MaxMsgsPerBatch = 100
+OCR2CachePollPeriod = '4s'
+OCR2CacheTTL = '1m0s'
+TxMsgTimeout = '10m0s'
+Nodes = []
+`,
+ }
+ },
+ wantStatusCode: http.StatusOK,
+ },
+ {
+ inputID: "234",
+ name: "not found",
+ want: func(t *testing.T, app *cltest.TestApplication) *commonTypes.ChainStatus {
+ return nil
+ },
+ wantStatusCode: http.StatusBadRequest,
+ },
+ }
+
+ for _, testCase := range testCases {
+ tc := testCase
+
+ t.Run(tc.name, func(t *testing.T) {
+ t.Parallel()
+
+ controller := setupCosmosChainsControllerTestV2(t, &coscfg.TOMLConfig{
+ ChainID: ptr(validID),
+ Enabled: ptr(true),
+ Chain: coscfg.Chain{
+ FallbackGasPrice: ptr(decimal.RequireFromString("9.999")),
+ GasLimitMultiplier: ptr(decimal.RequireFromString("1.55555")),
+ }})
+
+ wantedResult := tc.want(t, controller.app)
+ resp, cleanup := controller.client.Get(
+ "/v2/chains/cosmos/" + tc.inputID,
+ )
+ t.Cleanup(cleanup)
+ require.Equal(t, tc.wantStatusCode, resp.StatusCode)
+
+ if wantedResult != nil {
+ resource1 := presenters.ChainResource{}
+ err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)
+ require.NoError(t, err)
+
+ assert.Equal(t, wantedResult.ID, resource1.ID)
+ assert.Equal(t, wantedResult.Config, resource1.Config)
+ }
+ })
+ }
+}
+
+func Test_CosmosChainsController_Index(t *testing.T) {
+ t.Parallel()
+
+ chainA := &coscfg.TOMLConfig{
+ ChainID: ptr("a" + cosmostest.RandomChainID()),
+ Enabled: ptr(true),
+ Chain: coscfg.Chain{
+ FallbackGasPrice: ptr(decimal.RequireFromString("9.999")),
+ },
+ }
+
+ chainB := &coscfg.TOMLConfig{
+ ChainID: ptr("b" + cosmostest.RandomChainID()),
+ Enabled: ptr(true),
+ Chain: coscfg.Chain{
+ GasLimitMultiplier: ptr(decimal.RequireFromString("1.55555")),
+ },
+ }
+ controller := setupCosmosChainsControllerTestV2(t, chainA, chainB)
+
+ badResp, cleanup := controller.client.Get("/v2/chains/cosmos?size=asd")
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusUnprocessableEntity, badResp.StatusCode)
+
+ resp, cleanup := controller.client.Get("/v2/chains/cosmos?size=1")
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusOK, resp.StatusCode)
+
+ body := cltest.ParseResponseBody(t, resp)
+
+ metaCount, err := cltest.ParseJSONAPIResponseMetaCount(body)
+ require.NoError(t, err)
+ require.Equal(t, 2, metaCount)
+
+ var links jsonapi.Links
+
+ var chains []presenters.ChainResource
+ err = web.ParsePaginatedResponse(body, &chains, &links)
+ require.NoError(t, err)
+ assert.NotEmpty(t, links["next"].Href)
+ assert.Empty(t, links["prev"].Href)
+
+ assert.Len(t, links, 1)
+ assert.Equal(t, *chainA.ChainID, chains[0].ID)
+ tomlA, err := chainA.TOMLString()
+ require.NoError(t, err)
+ assert.Equal(t, tomlA, chains[0].Config)
+
+ resp, cleanup = controller.client.Get(links["next"].Href)
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusOK, resp.StatusCode)
+
+ chains = []presenters.ChainResource{}
+ err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &chains, &links)
+ require.NoError(t, err)
+ assert.Empty(t, links["next"].Href)
+ assert.NotEmpty(t, links["prev"].Href)
+
+ assert.Len(t, links, 1)
+ assert.Equal(t, *chainB.ChainID, chains[0].ID)
+ tomlB, err := chainB.TOMLString()
+ require.NoError(t, err)
+ assert.Equal(t, tomlB, chains[0].Config)
+}
+
+type TestCosmosChainsController struct {
+ app *cltest.TestApplication
+ client cltest.HTTPClientCleaner
+}
+
+func setupCosmosChainsControllerTestV2(t *testing.T, cfgs ...*coscfg.TOMLConfig) *TestCosmosChainsController {
+ for i := range cfgs {
+ cfgs[i].SetDefaults()
+ }
+ cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.Cosmos = cfgs
+ c.EVM = nil
+ })
+ app := cltest.NewApplicationWithConfig(t, cfg)
+ ctx := testutils.Context(t)
+ require.NoError(t, app.Start(ctx))
+
+ client := app.NewHTTPClient(nil)
+
+ return &TestCosmosChainsController{
+ app: app,
+ client: client,
+ }
+}
+func Test_SolanaChainsController_Show(t *testing.T) {
+ t.Parallel()
+
+ const validID = "Chainlink-12"
+
+ testCases := []struct {
+ name string
+ inputID string
+ wantStatusCode int
+ want func(t *testing.T, app *cltest.TestApplication) *commonTypes.ChainStatus
+ }{
+ {
+ inputID: validID,
+ name: "success",
+ want: func(t *testing.T, app *cltest.TestApplication) *commonTypes.ChainStatus {
+ return &commonTypes.ChainStatus{
+ ID: validID,
+ Enabled: true,
+ Config: `ChainID = 'Chainlink-12'
+BalancePollPeriod = '5s'
+ConfirmPollPeriod = '500ms'
+OCR2CachePollPeriod = '1s'
+OCR2CacheTTL = '1m0s'
+TxTimeout = '1h0m0s'
+TxRetryTimeout = '10s'
+TxConfirmTimeout = '30s'
+TxExpirationRebroadcast = false
+TxRetentionTimeout = '0s'
+SkipPreflight = false
+Commitment = 'confirmed'
+MaxRetries = 0
+FeeEstimatorMode = 'fixed'
+ComputeUnitPriceMax = 1000
+ComputeUnitPriceMin = 0
+ComputeUnitPriceDefault = 0
+FeeBumpPeriod = '3s'
+BlockHistoryPollPeriod = '5s'
+BlockHistorySize = 1
+ComputeUnitLimitDefault = 200000
+EstimateComputeUnitLimit = false
+Nodes = []
+
+[MultiNode]
+Enabled = false
+PollFailureThreshold = 5
+PollInterval = '15s'
+SelectionMode = 'PriorityLevel'
+SyncThreshold = 10
+NodeIsSyncingEnabled = false
+LeaseDuration = '1m0s'
+FinalizedBlockPollInterval = '5s'
+EnforceRepeatableRead = true
+DeathDeclarationDelay = '20s'
+NodeNoNewHeadsThreshold = '20s'
+NoNewFinalizedHeadsThreshold = '20s'
+FinalityDepth = 0
+FinalityTagEnabled = true
+FinalizedBlockOffset = 50
+`,
+ }
+ },
+ wantStatusCode: http.StatusOK,
+ },
+ {
+ inputID: "234",
+ name: "not found",
+ want: func(t *testing.T, app *cltest.TestApplication) *commonTypes.ChainStatus {
+ return nil
+ },
+ wantStatusCode: http.StatusBadRequest,
+ },
+ }
+
+ for _, testCase := range testCases {
+ tc := testCase
+
+ t.Run(tc.name, func(t *testing.T) {
+ t.Parallel()
+
+ controller := setupSolanaChainsControllerTestV2(t, &config.TOMLConfig{
+ ChainID: ptr(validID),
+ Chain: config.Chain{
+ SkipPreflight: ptr(false),
+ TxTimeout: commoncfg.MustNewDuration(time.Hour),
+ },
+ })
+
+ wantedResult := tc.want(t, controller.app)
+ resp, cleanup := controller.client.Get(
+ "/v2/chains/solana/" + tc.inputID,
+ )
+ t.Cleanup(cleanup)
+ require.Equal(t, tc.wantStatusCode, resp.StatusCode)
+
+ if wantedResult != nil {
+ resource1 := presenters.ChainResource{}
+ err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)
+ require.NoError(t, err)
+
+ assert.Equal(t, wantedResult.ID, resource1.ID)
+ assert.Equal(t, wantedResult.Enabled, resource1.Enabled)
+ assert.Equal(t, wantedResult.Config, resource1.Config)
+ }
+ })
+ }
+}
+
+func Test_SolanaChainsController_Index(t *testing.T) {
+ t.Parallel()
+
+ chainA := &config.TOMLConfig{
+ ChainID: ptr(fmt.Sprintf("ChainlinktestA-%d", rand.Int31n(999999))),
+ Chain: config.Chain{
+ TxTimeout: commoncfg.MustNewDuration(time.Hour),
+ },
+ }
+ chainB := &config.TOMLConfig{
+ ChainID: ptr(fmt.Sprintf("ChainlinktestB-%d", rand.Int31n(999999))),
+ Chain: config.Chain{
+ SkipPreflight: ptr(false),
+ },
+ }
+ controller := setupSolanaChainsControllerTestV2(t, chainA, chainB)
+
+ badResp, cleanup := controller.client.Get("/v2/chains/solana?size=asd")
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusUnprocessableEntity, badResp.StatusCode)
+
+ resp, cleanup := controller.client.Get("/v2/chains/solana?size=1")
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusOK, resp.StatusCode)
+
+ body := cltest.ParseResponseBody(t, resp)
+
+ metaCount, err := cltest.ParseJSONAPIResponseMetaCount(body)
+ require.NoError(t, err)
+ require.Equal(t, 2, metaCount)
+
+ var links jsonapi.Links
+
+ chains := []presenters.ChainResource{}
+ err = web.ParsePaginatedResponse(body, &chains, &links)
+ require.NoError(t, err)
+ assert.NotEmpty(t, links["next"].Href)
+ assert.Empty(t, links["prev"].Href)
+
+ assert.Len(t, links, 1)
+ assert.Equal(t, *chainA.ChainID, chains[0].ID)
+ tomlA, err := chainA.TOMLString()
+ require.NoError(t, err)
+ assert.Equal(t, tomlA, chains[0].Config)
+
+ resp, cleanup = controller.client.Get(links["next"].Href)
+ t.Cleanup(cleanup)
+ require.Equal(t, http.StatusOK, resp.StatusCode)
+
+ chains = []presenters.ChainResource{}
+ err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &chains, &links)
+ require.NoError(t, err)
+ assert.Empty(t, links["next"].Href)
+ assert.NotEmpty(t, links["prev"].Href)
+
+ assert.Len(t, links, 1)
+ assert.Equal(t, *chainB.ChainID, chains[0].ID)
+ tomlB, err := chainB.TOMLString()
+ require.NoError(t, err)
+ assert.Equal(t, tomlB, chains[0].Config)
+}
+
+type TestSolanaChainsController struct {
+ app *cltest.TestApplication
+ client cltest.HTTPClientCleaner
+}
+
+func setupSolanaChainsControllerTestV2(t *testing.T, cfgs ...*config.TOMLConfig) *TestSolanaChainsController {
+ for i := range cfgs {
+ cfgs[i].SetDefaults()
+ }
+ cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ c.Solana = cfgs
+ c.EVM = nil
+ })
+ app := cltest.NewApplicationWithConfig(t, cfg)
+ require.NoError(t, app.Start(testutils.Context(t)))
+
+ client := app.NewHTTPClient(nil)
+
+ return &TestSolanaChainsController{
+ app: app,
+ client: client,
+ }
+}
diff --git a/core/web/cosmos_chains_controller.go b/core/web/cosmos_chains_controller.go
deleted file mode 100644
index 27c3976ce39..00000000000
--- a/core/web/cosmos_chains_controller.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package web
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/services/relay"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-func NewCosmosChainsController(app chainlink.Application) ChainsController {
- return newChainsController[presenters.CosmosChainResource](
- relay.NetworkCosmos,
- app.GetRelayers().List(chainlink.FilterRelayersByType(relay.NetworkCosmos)),
- ErrCosmosNotEnabled,
- presenters.NewCosmosChainResource,
- app.GetLogger(),
- app.GetAuditLogger())
-}
diff --git a/core/web/cosmos_chains_controller_test.go b/core/web/cosmos_chains_controller_test.go
deleted file mode 100644
index 2d5eb42515a..00000000000
--- a/core/web/cosmos_chains_controller_test.go
+++ /dev/null
@@ -1,193 +0,0 @@
-package web_test
-
-import (
- "fmt"
- "net/http"
- "testing"
-
- "github.com/manyminds/api2go/jsonapi"
- "github.com/shopspring/decimal"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- "github.com/smartcontractkit/chainlink-common/pkg/types"
- coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config"
-
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/cosmostest"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/web"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-func Test_CosmosChainsController_Show(t *testing.T) {
- t.Parallel()
-
- const validId = "Chainlink-12"
-
- testCases := []struct {
- name string
- inputId string
- wantStatusCode int
- want func(t *testing.T, app *cltest.TestApplication) *types.ChainStatus
- }{
- {
- inputId: validId,
- name: "success",
- want: func(t *testing.T, app *cltest.TestApplication) *types.ChainStatus {
- return &types.ChainStatus{
- ID: validId,
- Enabled: true,
- Config: `ChainID = 'Chainlink-12'
-Enabled = true
-Bech32Prefix = 'wasm'
-BlockRate = '6s'
-BlocksUntilTxTimeout = 30
-ConfirmPollPeriod = '1s'
-FallbackGasPrice = '9.999'
-GasToken = 'ucosm'
-GasLimitMultiplier = '1.55555'
-MaxMsgsPerBatch = 100
-OCR2CachePollPeriod = '4s'
-OCR2CacheTTL = '1m0s'
-TxMsgTimeout = '10m0s'
-Nodes = []
-`,
- }
- },
- wantStatusCode: http.StatusOK,
- },
- {
- inputId: "234",
- name: "not found",
- want: func(t *testing.T, app *cltest.TestApplication) *types.ChainStatus {
- return nil
- },
- wantStatusCode: http.StatusBadRequest,
- },
- }
-
- for _, testCase := range testCases {
- tc := testCase
-
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- controller := setupCosmosChainsControllerTestV2(t, &coscfg.TOMLConfig{
- ChainID: ptr(validId),
- Enabled: ptr(true),
- Chain: coscfg.Chain{
- FallbackGasPrice: ptr(decimal.RequireFromString("9.999")),
- GasLimitMultiplier: ptr(decimal.RequireFromString("1.55555")),
- }})
-
- wantedResult := tc.want(t, controller.app)
- resp, cleanup := controller.client.Get(
- fmt.Sprintf("/v2/chains/cosmos/%s", tc.inputId),
- )
- t.Cleanup(cleanup)
- require.Equal(t, tc.wantStatusCode, resp.StatusCode)
-
- if wantedResult != nil {
- resource1 := presenters.CosmosChainResource{}
- err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)
- require.NoError(t, err)
-
- assert.Equal(t, wantedResult.ID, resource1.ID)
- assert.Equal(t, wantedResult.Config, resource1.Config)
- }
- })
- }
-}
-
-func Test_CosmosChainsController_Index(t *testing.T) {
- t.Parallel()
-
- chainA := &coscfg.TOMLConfig{
- ChainID: ptr("a" + cosmostest.RandomChainID()),
- Enabled: ptr(true),
- Chain: coscfg.Chain{
- FallbackGasPrice: ptr(decimal.RequireFromString("9.999")),
- },
- }
-
- chainB := &coscfg.TOMLConfig{
- ChainID: ptr("b" + cosmostest.RandomChainID()),
- Enabled: ptr(true),
- Chain: coscfg.Chain{
- GasLimitMultiplier: ptr(decimal.RequireFromString("1.55555")),
- },
- }
- controller := setupCosmosChainsControllerTestV2(t, chainA, chainB)
-
- badResp, cleanup := controller.client.Get("/v2/chains/cosmos?size=asd")
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusUnprocessableEntity, badResp.StatusCode)
-
- resp, cleanup := controller.client.Get("/v2/chains/cosmos?size=1")
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusOK, resp.StatusCode)
-
- body := cltest.ParseResponseBody(t, resp)
-
- metaCount, err := cltest.ParseJSONAPIResponseMetaCount(body)
- require.NoError(t, err)
- require.Equal(t, 2, metaCount)
-
- var links jsonapi.Links
-
- var chains []presenters.CosmosChainResource
- err = web.ParsePaginatedResponse(body, &chains, &links)
- assert.NoError(t, err)
- assert.NotEmpty(t, links["next"].Href)
- assert.Empty(t, links["prev"].Href)
-
- assert.Len(t, links, 1)
- assert.Equal(t, *chainA.ChainID, chains[0].ID)
- tomlA, err := chainA.TOMLString()
- require.NoError(t, err)
- assert.Equal(t, tomlA, chains[0].Config)
-
- resp, cleanup = controller.client.Get(links["next"].Href)
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusOK, resp.StatusCode)
-
- chains = []presenters.CosmosChainResource{}
- err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &chains, &links)
- assert.NoError(t, err)
- assert.Empty(t, links["next"].Href)
- assert.NotEmpty(t, links["prev"].Href)
-
- assert.Len(t, links, 1)
- assert.Equal(t, *chainB.ChainID, chains[0].ID)
- tomlB, err := chainB.TOMLString()
- require.NoError(t, err)
- assert.Equal(t, tomlB, chains[0].Config)
-}
-
-type TestCosmosChainsController struct {
- app *cltest.TestApplication
- client cltest.HTTPClientCleaner
-}
-
-func setupCosmosChainsControllerTestV2(t *testing.T, cfgs ...*coscfg.TOMLConfig) *TestCosmosChainsController {
- for i := range cfgs {
- cfgs[i].SetDefaults()
- }
- cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Cosmos = cfgs
- c.EVM = nil
- })
- app := cltest.NewApplicationWithConfig(t, cfg)
- ctx := testutils.Context(t)
- require.NoError(t, app.Start(ctx))
-
- client := app.NewHTTPClient(nil)
-
- return &TestCosmosChainsController{
- app: app,
- client: client,
- }
-}
diff --git a/core/web/cosmos_nodes_controller.go b/core/web/cosmos_nodes_controller.go
deleted file mode 100644
index f3a226721ca..00000000000
--- a/core/web/cosmos_nodes_controller.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package web
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/services/relay"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// ErrCosmosNotEnabled is returned when COSMOS_ENABLED is not true.
-var ErrCosmosNotEnabled = errChainDisabled{name: "Cosmos", tomlKey: "Cosmos.Enabled"}
-
-func NewCosmosNodesController(app chainlink.Application) NodesController {
- scopedNodeStatuser := NewNetworkScopedNodeStatuser(app.GetRelayers(), relay.NetworkCosmos)
-
- return newNodesController[presenters.CosmosNodeResource](
- scopedNodeStatuser, ErrCosmosNotEnabled, presenters.NewCosmosNodeResource, app.GetAuditLogger(),
- )
-}
diff --git a/core/web/cosmos_transfer_controller.go b/core/web/cosmos_transfer_controller.go
index ab3d8c20f30..f80dda005eb 100644
--- a/core/web/cosmos_transfer_controller.go
+++ b/core/web/cosmos_transfer_controller.go
@@ -27,11 +27,13 @@ type CosmosTransfersController struct {
App chainlink.Application
}
+var ErrCosmosNotEnabled = errChainDisabled{name: "Cosmos", tomlKey: "Cosmos.Enabled"}
+
// Create sends native coins from the Chainlink's account to a specified address.
func (tc *CosmosTransfersController) Create(c *gin.Context) {
relayers := tc.App.GetRelayers().List(chainlink.FilterRelayersByType(relay.NetworkCosmos))
if relayers == nil {
- jsonAPIError(c, http.StatusBadRequest, ErrSolanaNotEnabled)
+ jsonAPIError(c, http.StatusBadRequest, ErrCosmosNotEnabled)
return
}
diff --git a/core/web/evm_chains_controller.go b/core/web/evm_chains_controller.go
deleted file mode 100644
index 9c887fa409c..00000000000
--- a/core/web/evm_chains_controller.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package web
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/services/relay"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-var ErrEVMNotEnabled = errChainDisabled{name: "EVM", tomlKey: "EVM.Enabled"}
-
-func NewEVMChainsController(app chainlink.Application) ChainsController {
- return newChainsController[presenters.EVMChainResource](
- relay.NetworkEVM,
- app.GetRelayers().List(chainlink.FilterRelayersByType(relay.NetworkEVM)),
- ErrEVMNotEnabled,
- presenters.NewEVMChainResource,
- app.GetLogger(),
- app.GetAuditLogger())
-}
diff --git a/core/web/evm_chains_controller_test.go b/core/web/evm_chains_controller_test.go
deleted file mode 100644
index ab8bf35e6cb..00000000000
--- a/core/web/evm_chains_controller_test.go
+++ /dev/null
@@ -1,215 +0,0 @@
-package web_test
-
-import (
- "fmt"
- "math/big"
- "net/http"
- "sort"
- "testing"
-
- "github.com/manyminds/api2go/jsonapi"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- evmcfg "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
- ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/web"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-func Test_EVMChainsController_Show(t *testing.T) {
- t.Parallel()
-
- validId := ubig.New(testutils.NewRandomEVMChainID())
-
- testCases := []struct {
- name string
- inputId string
- wantStatusCode int
- want *evmcfg.EVMConfig
- }{
- {
- inputId: validId.String(),
- name: "success",
- want: &evmcfg.EVMConfig{
- ChainID: validId,
- Enabled: ptr(true),
- Chain: evmcfg.Defaults(nil, &evmcfg.Chain{
- GasEstimator: evmcfg.GasEstimator{
- EIP1559DynamicFees: ptr(true),
- BlockHistory: evmcfg.BlockHistoryEstimator{
- BlockHistorySize: ptr[uint16](50),
- },
- },
- RPCBlockQueryDelay: ptr[uint16](23),
- MinIncomingConfirmations: ptr[uint32](12),
- LinkContractAddress: ptr(types.EIP55AddressFromAddress(testutils.NewAddress())),
- }),
- },
- wantStatusCode: http.StatusOK,
- },
- {
- inputId: "invalidid",
- name: "invalid id",
- want: nil,
- wantStatusCode: http.StatusBadRequest,
- },
- {
- inputId: "234",
- name: "not found",
- want: nil,
- wantStatusCode: http.StatusBadRequest,
- },
- }
-
- for _, testCase := range testCases {
- tc := testCase
-
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- controller := setupEVMChainsControllerTest(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- if tc.want != nil {
- c.EVM = evmcfg.EVMConfigs{tc.want}
- }
- }))
-
- wantedResult := tc.want
- resp, cleanup := controller.client.Get(
- fmt.Sprintf("/v2/chains/evm/%s", tc.inputId),
- )
- t.Cleanup(cleanup)
- require.Equal(t, tc.wantStatusCode, resp.StatusCode)
-
- if wantedResult != nil {
- resource1 := presenters.EVMChainResource{}
- err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)
- require.NoError(t, err)
-
- assert.Equal(t, resource1.ID, wantedResult.ChainID.String())
- toml, err := wantedResult.TOMLString()
- require.NoError(t, err)
- assert.Equal(t, toml, resource1.Config)
- }
- })
- }
-}
-
-func Test_EVMChainsController_Index(t *testing.T) {
- t.Parallel()
-
- // sort test chain ids to make expected comparison easy
- chainIDs := []*big.Int{testutils.NewRandomEVMChainID(), testutils.NewRandomEVMChainID(), testutils.NewRandomEVMChainID()}
- sort.Slice(chainIDs, func(i, j int) bool {
- return chainIDs[i].String() < chainIDs[j].String()
- })
-
- configuredChains := evmcfg.EVMConfigs{
- {ChainID: ubig.New(chainIDs[0]), Chain: evmcfg.Defaults(nil)},
- {
- ChainID: ubig.New(chainIDs[1]),
- Chain: evmcfg.Defaults(nil, &evmcfg.Chain{
- RPCBlockQueryDelay: ptr[uint16](13),
- GasEstimator: evmcfg.GasEstimator{
- EIP1559DynamicFees: ptr(true),
- BlockHistory: evmcfg.BlockHistoryEstimator{
- BlockHistorySize: ptr[uint16](1),
- },
- },
- MinIncomingConfirmations: ptr[uint32](120),
- }),
- },
- {
- ChainID: ubig.New(chainIDs[2]),
- Chain: evmcfg.Defaults(nil, &evmcfg.Chain{
- RPCBlockQueryDelay: ptr[uint16](5),
- GasEstimator: evmcfg.GasEstimator{
- EIP1559DynamicFees: ptr(false),
- BlockHistory: evmcfg.BlockHistoryEstimator{
- BlockHistorySize: ptr[uint16](2),
- },
- },
- MinIncomingConfirmations: ptr[uint32](30),
- }),
- },
- }
-
- assert.Len(t, configuredChains, 3)
- controller := setupEVMChainsControllerTest(t, configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.EVM = append(c.EVM, configuredChains...)
- }))
-
- badResp, cleanup := controller.client.Get("/v2/chains/evm?size=asd")
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusUnprocessableEntity, badResp.StatusCode)
-
- resp, cleanup := controller.client.Get("/v2/chains/evm?size=3")
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusOK, resp.StatusCode)
-
- body := cltest.ParseResponseBody(t, resp)
-
- metaCount, err := cltest.ParseJSONAPIResponseMetaCount(body)
- require.NoError(t, err)
- require.Equal(t, 1+len(configuredChains), metaCount)
-
- var links jsonapi.Links
-
- var gotChains []presenters.EVMChainResource
- err = web.ParsePaginatedResponse(body, &gotChains, &links)
- assert.NoError(t, err)
- assert.NotEmpty(t, links["next"].Href)
- assert.Empty(t, links["prev"].Href)
-
- assert.Len(t, links, 1)
- // the difference in index value here seems to be due to the fact
- // that cltest always has a default EVM chain, which is the off-by-one
- // in the indices
- assert.Equal(t, gotChains[2].ID, configuredChains[1].ChainID.String())
- toml, err := configuredChains[1].TOMLString()
- require.NoError(t, err)
- assert.Equal(t, toml, gotChains[2].Config)
-
- resp, cleanup = controller.client.Get(links["next"].Href)
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusOK, resp.StatusCode)
-
- gotChains = []presenters.EVMChainResource{}
- err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &gotChains, &links)
- assert.NoError(t, err)
- assert.Empty(t, links["next"].Href)
- assert.NotEmpty(t, links["prev"].Href)
-
- assert.Len(t, links, 1)
- assert.Equal(t, gotChains[0].ID, configuredChains[2].ChainID.String())
- toml, err = configuredChains[2].TOMLString()
- require.NoError(t, err)
- assert.Equal(t, toml, gotChains[0].Config)
-}
-
-type TestEVMChainsController struct {
- app *cltest.TestApplication
- client cltest.HTTPClientCleaner
-}
-
-func setupEVMChainsControllerTest(t *testing.T, cfg chainlink.GeneralConfig) *TestEVMChainsController {
- // Using this instead of `NewApplicationEVMDisabled` since we need the chain set to be loaded in the app
- // for the sake of the API endpoints to work properly
- app := cltest.NewApplicationWithConfig(t, cfg)
- ctx := testutils.Context(t)
- require.NoError(t, app.Start(ctx))
-
- client := app.NewHTTPClient(nil)
-
- return &TestEVMChainsController{
- app: app,
- client: client,
- }
-}
-
-func ptr[T any](t T) *T { return &t }
diff --git a/core/web/evm_nodes_controller.go b/core/web/evm_nodes_controller.go
deleted file mode 100644
index 8872f51d7e3..00000000000
--- a/core/web/evm_nodes_controller.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package web
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/services/relay"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-func NewEVMNodesController(app chainlink.Application) NodesController {
- scopedNodeStatuser := NewNetworkScopedNodeStatuser(app.GetRelayers(), relay.NetworkEVM)
-
- return newNodesController[presenters.EVMNodeResource](
- scopedNodeStatuser, ErrEVMNotEnabled, presenters.NewEVMNodeResource, app.GetAuditLogger())
-}
diff --git a/core/web/nodes_controller.go b/core/web/nodes_controller.go
index 0e43316629a..ee40de9885c 100644
--- a/core/web/nodes_controller.go
+++ b/core/web/nodes_controller.go
@@ -2,7 +2,6 @@ package web
import (
"context"
- "net/http"
"github.com/gin-gonic/gin"
"github.com/manyminds/api2go/jsonapi"
@@ -11,6 +10,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/logger/audit"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+ "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
)
type NodesController interface {
@@ -36,42 +36,38 @@ func (n *NetworkScopedNodeStatuser) NodeStatuses(ctx context.Context, offset, li
}
type nodesController[R jsonapi.EntityNamer] struct {
- nodeSet *NetworkScopedNodeStatuser
- errNotEnabled error
- newResource func(status types.NodeStatus) R
- auditLogger audit.AuditLogger
+ relayers chainlink.RelayerChainInteroperators
+ newResource func(status types.NodeStatus) R
+ auditLogger audit.AuditLogger
}
-func newNodesController[R jsonapi.EntityNamer](
- nodeSet *NetworkScopedNodeStatuser,
- errNotEnabled error,
- newResource func(status types.NodeStatus) R,
- auditLogger audit.AuditLogger,
+func NewNodesController(
+ relayers chainlink.RelayerChainInteroperators, auditLogger audit.AuditLogger,
) NodesController {
- return &nodesController[R]{
- nodeSet: nodeSet,
- errNotEnabled: errNotEnabled,
- newResource: newResource,
- auditLogger: auditLogger,
+ return &nodesController[presenters.NodeResource]{
+ relayers: relayers,
+ newResource: presenters.NewNodeResource,
+ auditLogger: auditLogger,
}
}
func (n *nodesController[R]) Index(c *gin.Context, size, page, offset int) {
- if n.nodeSet == nil {
- jsonAPIError(c, http.StatusBadRequest, n.errNotEnabled)
- return
- }
-
id := c.Param("ID")
+ network := c.Param("network")
var nodes []types.NodeStatus
var count int
var err error
+ relayers := n.relayers
+ if network != "" {
+ relayers = relayers.List(chainlink.FilterRelayersByType(network))
+ }
+
ctx := c.Request.Context()
if id == "" {
// fetch all nodes
- nodes, count, err = n.nodeSet.NodeStatuses(ctx, offset, size)
+ nodes, count, err = relayers.NodeStatuses(ctx, offset, size)
} else {
// fetch nodes for chain ID
// backward compatibility
@@ -79,9 +75,9 @@ func (n *nodesController[R]) Index(c *gin.Context, size, page, offset int) {
err = rid.UnmarshalString(id)
if err != nil {
rid.ChainID = id
- rid.Network = n.nodeSet.network
+ rid.Network = network
}
- nodes, count, err = n.nodeSet.NodeStatuses(ctx, offset, size, rid)
+ nodes, count, err = relayers.NodeStatuses(ctx, offset, size, rid)
}
var resources []R
diff --git a/core/web/presenters/chain.go b/core/web/presenters/chain.go
index 99cf9a1d252..280f7a7f8d4 100644
--- a/core/web/presenters/chain.go
+++ b/core/web/presenters/chain.go
@@ -1,11 +1,32 @@
package presenters
+import (
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+ commonTypes "github.com/smartcontractkit/chainlink/v2/common/types"
+)
+
type ChainResource struct {
JAID
+ Network string `json:"network"`
Enabled bool `json:"enabled"`
Config string `json:"config"` // TOML
}
+// GetName implements the api2go EntityNamer interface
+func (r ChainResource) GetName() string {
+ return "chain"
+}
+
+// NewChainResource returns a new ChainResource for chain.
+func NewChainResource(chain commonTypes.ChainStatusWithID) ChainResource {
+ return ChainResource{
+ JAID: NewJAID(chain.RelayID.ChainID),
+ Network: chain.RelayID.Network,
+ Config: chain.Config,
+ Enabled: chain.Enabled,
+ }
+}
+
type NodeResource struct {
JAID
ChainID string `json:"chainID"`
@@ -13,3 +34,19 @@ type NodeResource struct {
Config string `json:"config"` // TOML
State string `json:"state"`
}
+
+// NewNodeResource returns a new NodeResource for node.
+func NewNodeResource(node types.NodeStatus) NodeResource {
+ return NodeResource{
+ JAID: NewPrefixedJAID(node.Name, node.ChainID),
+ ChainID: node.ChainID,
+ Name: node.Name,
+ State: node.State,
+ Config: node.Config,
+ }
+}
+
+// GetName implements the api2go EntityNamer interface
+func (r NodeResource) GetName() string {
+ return "node"
+}
diff --git a/core/web/presenters/cosmos_chain.go b/core/web/presenters/cosmos_chain.go
deleted file mode 100644
index c2bc4b52b61..00000000000
--- a/core/web/presenters/cosmos_chain.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package presenters
-
-import (
- "github.com/smartcontractkit/chainlink-common/pkg/types"
-)
-
-// CosmosChainResource is an Cosmos chain JSONAPI resource.
-type CosmosChainResource struct {
- ChainResource
-}
-
-// GetName implements the api2go EntityNamer interface
-func (r CosmosChainResource) GetName() string {
- return "cosmos_chain"
-}
-
-// NewCosmosChainResource returns a new CosmosChainResource for chain.
-func NewCosmosChainResource(chain types.ChainStatus) CosmosChainResource {
- return CosmosChainResource{ChainResource{
- JAID: NewJAID(chain.ID),
- Config: chain.Config,
- Enabled: chain.Enabled,
- }}
-}
-
-// CosmosNodeResource is a Cosmos node JSONAPI resource.
-type CosmosNodeResource struct {
- NodeResource
-}
-
-// GetName implements the api2go EntityNamer interface
-func (r CosmosNodeResource) GetName() string {
- return "cosmos_node"
-}
-
-// NewCosmosNodeResource returns a new CosmosNodeResource for node.
-func NewCosmosNodeResource(node types.NodeStatus) CosmosNodeResource {
- return CosmosNodeResource{NodeResource{
- JAID: NewPrefixedJAID(node.Name, node.ChainID),
- ChainID: node.ChainID,
- Name: node.Name,
- State: node.State,
- Config: node.Config,
- }}
-}
diff --git a/core/web/presenters/evm_chain.go b/core/web/presenters/evm_chain.go
deleted file mode 100644
index adf399d4b01..00000000000
--- a/core/web/presenters/evm_chain.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package presenters
-
-import "github.com/smartcontractkit/chainlink-common/pkg/types"
-
-// EVMChainResource is an EVM chain JSONAPI resource.
-type EVMChainResource struct {
- ChainResource
-}
-
-// GetName implements the api2go EntityNamer interface
-func (r EVMChainResource) GetName() string {
- return "evm_chain"
-}
-
-// NewEVMChainResource returns a new EVMChainResource for chain.
-func NewEVMChainResource(chain types.ChainStatus) EVMChainResource {
- return EVMChainResource{ChainResource{
- JAID: NewJAID(chain.ID),
- Config: chain.Config,
- Enabled: chain.Enabled,
- }}
-}
-
-// EVMNodeResource is an EVM node JSONAPI resource.
-type EVMNodeResource struct {
- NodeResource
-}
-
-// GetName implements the api2go EntityNamer interface
-func (r EVMNodeResource) GetName() string {
- return "evm_node"
-}
-
-// NewEVMNodeResource returns a new EVMNodeResource for node.
-func NewEVMNodeResource(node types.NodeStatus) EVMNodeResource {
- return EVMNodeResource{NodeResource{
- JAID: NewPrefixedJAID(node.Name, node.ChainID),
- ChainID: node.ChainID,
- Name: node.Name,
- State: node.State,
- Config: node.Config,
- }}
-}
diff --git a/core/web/presenters/job.go b/core/web/presenters/job.go
index bb518650516..8b01eeb5005 100644
--- a/core/web/presenters/job.go
+++ b/core/web/presenters/job.go
@@ -176,6 +176,7 @@ type OffChainReporting2Spec struct {
BlockchainTimeout models.Interval `json:"blockchainTimeout"`
ContractConfigTrackerPollInterval models.Interval `json:"contractConfigTrackerPollInterval"`
ContractConfigConfirmations uint16 `json:"contractConfigConfirmations"`
+ OnchainSigningStrategy map[string]interface{} `json:"onchainSigningStrategy"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
CollectTelemetry bool `json:"collectTelemetry"`
@@ -194,6 +195,7 @@ func NewOffChainReporting2Spec(spec *job.OCR2OracleSpec) *OffChainReporting2Spec
BlockchainTimeout: spec.BlockchainTimeout,
ContractConfigTrackerPollInterval: spec.ContractConfigTrackerPollInterval,
ContractConfigConfirmations: spec.ContractConfigConfirmations,
+ OnchainSigningStrategy: spec.OnchainSigningStrategy,
CreatedAt: spec.CreatedAt,
UpdatedAt: spec.UpdatedAt,
CollectTelemetry: spec.CaptureEATelemetry,
diff --git a/core/web/presenters/jsonapi.go b/core/web/presenters/jsonapi.go
index d14e24a7455..fe3aee8393f 100644
--- a/core/web/presenters/jsonapi.go
+++ b/core/web/presenters/jsonapi.go
@@ -16,8 +16,8 @@ func NewJAID(id string) JAID {
}
// NewPrefixedJAID prefixes JAID with chain id in %s/%s format.
-func NewPrefixedJAID(id string, chainID string) JAID {
- return JAID{ID: fmt.Sprintf("%s/%s", chainID, id)}
+func NewPrefixedJAID(id string, prefix string) JAID {
+ return JAID{ID: fmt.Sprintf("%s/%s", prefix, id)}
}
// NewJAIDInt32 converts an int32 into a JAID
diff --git a/core/web/presenters/node_test.go b/core/web/presenters/node_test.go
index 34210a52166..d2db83009d9 100644
--- a/core/web/presenters/node_test.go
+++ b/core/web/presenters/node_test.go
@@ -13,7 +13,6 @@ import (
func TestNodeResource(t *testing.T) {
var nodeResource NodeResource
- var r interface{}
state := "test"
cfg := "cfg"
testCases := []string{"solana", "cosmos", "starknet"}
@@ -21,62 +20,25 @@ func TestNodeResource(t *testing.T) {
chainID := fmt.Sprintf("%s chain ID", tc)
nodeName := fmt.Sprintf("%s_node", tc)
- switch tc {
- case "evm":
- evmNodeResource := NewEVMNodeResource(
- types.NodeStatus{
- ChainID: chainID,
- Name: nodeName,
- Config: cfg,
- State: state,
- })
- r = evmNodeResource
- nodeResource = evmNodeResource.NodeResource
- case "solana":
- solanaNodeResource := NewSolanaNodeResource(
- types.NodeStatus{
- ChainID: chainID,
- Name: nodeName,
- Config: cfg,
- State: state,
- })
- r = solanaNodeResource
- nodeResource = solanaNodeResource.NodeResource
- case "cosmos":
- cosmosNodeResource := NewCosmosNodeResource(
- types.NodeStatus{
- ChainID: chainID,
- Name: nodeName,
- Config: cfg,
- State: state,
- })
- r = cosmosNodeResource
- nodeResource = cosmosNodeResource.NodeResource
- case "starknet":
- starknetNodeResource := NewStarkNetNodeResource(
- types.NodeStatus{
- ChainID: chainID,
- Name: nodeName,
- Config: cfg,
- State: state,
- })
- r = starknetNodeResource
- nodeResource = starknetNodeResource.NodeResource
- default:
- t.Fail()
- }
+ nodeResource = NewNodeResource(types.NodeStatus{
+ ChainID: chainID,
+ Name: nodeName,
+ Config: cfg,
+ State: state,
+ })
+
assert.Equal(t, chainID, nodeResource.ChainID)
assert.Equal(t, nodeName, nodeResource.Name)
assert.Equal(t, cfg, nodeResource.Config)
assert.Equal(t, state, nodeResource.State)
- b, err := jsonapi.Marshal(r)
+ b, err := jsonapi.Marshal(nodeResource)
require.NoError(t, err)
expected := fmt.Sprintf(`
{
"data":{
- "type":"%s_node",
+ "type":"node",
"id":"%s/%s",
"attributes":{
"chainID":"%s",
@@ -86,7 +48,7 @@ func TestNodeResource(t *testing.T) {
}
}
}
- `, tc, chainID, nodeName, chainID, nodeName, cfg, state)
+ `, chainID, nodeName, chainID, nodeName, cfg, state)
assert.JSONEq(t, expected, string(b))
}
}
diff --git a/core/web/presenters/solana_chain.go b/core/web/presenters/solana_chain.go
deleted file mode 100644
index 798d98124a5..00000000000
--- a/core/web/presenters/solana_chain.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package presenters
-
-import (
- "github.com/smartcontractkit/chainlink-common/pkg/types"
-)
-
-// SolanaChainResource is an Solana chain JSONAPI resource.
-type SolanaChainResource struct {
- ChainResource
-}
-
-// GetName implements the api2go EntityNamer interface
-func (r SolanaChainResource) GetName() string {
- return "solana_chain"
-}
-
-// NewSolanaChainResource returns a new SolanaChainResource for chain.
-func NewSolanaChainResource(chain types.ChainStatus) SolanaChainResource {
- return SolanaChainResource{ChainResource{
- JAID: NewJAID(chain.ID),
- Config: chain.Config,
- Enabled: chain.Enabled,
- }}
-}
-
-// SolanaNodeResource is a Solana node JSONAPI resource.
-type SolanaNodeResource struct {
- NodeResource
-}
-
-// GetName implements the api2go EntityNamer interface
-func (r SolanaNodeResource) GetName() string {
- return "solana_node"
-}
-
-// NewSolanaNodeResource returns a new SolanaNodeResource for node.
-func NewSolanaNodeResource(node types.NodeStatus) SolanaNodeResource {
- return SolanaNodeResource{NodeResource{
- JAID: NewPrefixedJAID(node.Name, node.ChainID),
- ChainID: node.ChainID,
- Name: node.Name,
- State: node.State,
- Config: node.Config,
- }}
-}
diff --git a/core/web/presenters/starknet_chain.go b/core/web/presenters/starknet_chain.go
deleted file mode 100644
index addf798fe9f..00000000000
--- a/core/web/presenters/starknet_chain.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package presenters
-
-import (
- "github.com/smartcontractkit/chainlink-common/pkg/types"
-)
-
-// StarkNetChainResource is an StarkNet chain JSONAPI resource.
-type StarkNetChainResource struct {
- ChainResource
-}
-
-// GetName implements the api2go EntityNamer interface
-func (r StarkNetChainResource) GetName() string {
- return "starknet_chain"
-}
-
-// NewStarkNetChainResource returns a new StarkNetChainResource for chain.
-func NewStarkNetChainResource(chain types.ChainStatus) StarkNetChainResource {
- return StarkNetChainResource{ChainResource{
- JAID: NewJAID(chain.ID),
- Config: chain.Config,
- Enabled: chain.Enabled,
- }}
-}
-
-// StarkNetNodeResource is a StarkNet node JSONAPI resource.
-type StarkNetNodeResource struct {
- NodeResource
-}
-
-// GetName implements the api2go EntityNamer interface
-func (r StarkNetNodeResource) GetName() string {
- return "starknet_node"
-}
-
-// NewStarkNetNodeResource returns a new StarkNetNodeResource for node.
-func NewStarkNetNodeResource(node types.NodeStatus) StarkNetNodeResource {
- return StarkNetNodeResource{NodeResource{
- JAID: NewPrefixedJAID(node.Name, node.ChainID),
- ChainID: node.ChainID,
- Name: node.Name,
- State: node.State,
- Config: node.Config,
- }}
-}
diff --git a/core/web/resolver/spec.go b/core/web/resolver/spec.go
index ce23df49264..4a6989ae2dd 100644
--- a/core/web/resolver/spec.go
+++ b/core/web/resolver/spec.go
@@ -1,7 +1,7 @@
package resolver
import (
- "fmt"
+ "strconv"
"github.com/graph-gophers/graphql-go"
@@ -139,8 +139,13 @@ func (r *SpecResolver) ToStreamSpec() (*StreamSpecResolver, bool) {
if r.j.Type != job.Stream {
return nil, false
}
+ res := &StreamSpecResolver{}
+ if r.j.StreamID != nil {
+ sid := strconv.FormatUint(uint64(*r.j.StreamID), 10)
+ res.streamID = &sid
+ }
- return &StreamSpecResolver{streamID: fmt.Sprintf("%d", r.j.StreamID)}, true
+ return res, true
}
type CronSpecResolver struct {
@@ -987,6 +992,11 @@ func (r *BootstrapSpecResolver) ContractConfigConfirmations() *int32 {
return &confirmations
}
+// RelayConfig resolves the spec's onchain signing strategy config
+func (r *OCR2SpecResolver) OnchainSigningStrategy() gqlscalar.Map {
+ return gqlscalar.Map(r.spec.OnchainSigningStrategy)
+}
+
// CreatedAt resolves the spec's created at timestamp.
func (r *BootstrapSpecResolver) CreatedAt() graphql.Time {
return graphql.Time{Time: r.spec.CreatedAt}
@@ -1057,9 +1067,9 @@ func (r *StandardCapabilitiesSpecResolver) Config() *string {
}
type StreamSpecResolver struct {
- streamID string
+ streamID *string
}
-func (r *StreamSpecResolver) StreamID() string {
+func (r *StreamSpecResolver) StreamID() *string {
return r.streamID
}
diff --git a/core/web/resolver/spec_test.go b/core/web/resolver/spec_test.go
index 69d6a56509c..61a29d4f54a 100644
--- a/core/web/resolver/spec_test.go
+++ b/core/web/resolver/spec_test.go
@@ -2,6 +2,7 @@ package resolver
import (
"context"
+ "fmt"
"testing"
"time"
@@ -471,6 +472,12 @@ func TestResolver_OCR2Spec(t *testing.T) {
pluginConfig := map[string]interface{}{
"juelsPerFeeCoinSource": 100000000,
}
+ onchainSigningStrategy := map[string]interface{}{
+ "strategyName": "multi-chain",
+ "config": map[string]any{
+ "evm": "b3df4d8748b67731a1112e8b45a764941974f5590c93672eebbc4f3504dd10ed",
+ },
+ }
require.NoError(t, err)
testCases := []GQLTestCase{
@@ -486,6 +493,7 @@ func TestResolver_OCR2Spec(t *testing.T) {
ContractID: contractAddress.String(),
ContractConfigConfirmations: 1,
ContractConfigTrackerPollInterval: models.Interval(1 * time.Minute),
+ OnchainSigningStrategy: onchainSigningStrategy,
CreatedAt: f.Timestamp(),
OCRKeyBundleID: null.StringFrom(keyBundleID.String()),
MonitoringEndpoint: null.StringFrom("https://monitor.endpoint"),
@@ -509,6 +517,7 @@ func TestResolver_OCR2Spec(t *testing.T) {
contractID
contractConfigConfirmations
contractConfigTrackerPollInterval
+ onchainSigningStrategy
createdAt
ocrKeyBundleID
monitoringEndpoint
@@ -533,6 +542,12 @@ func TestResolver_OCR2Spec(t *testing.T) {
"contractID": "0x613a38AC1659769640aaE063C651F48E0250454C",
"contractConfigConfirmations": 1,
"contractConfigTrackerPollInterval": "1m0s",
+ "onchainSigningStrategy": {
+ "strategyName": "multi-chain",
+ "config": {
+ "evm": "b3df4d8748b67731a1112e8b45a764941974f5590c93672eebbc4f3504dd10ed"
+ }
+ },
"createdAt": "2021-01-01T00:00:00Z",
"ocrKeyBundleID": "f5bf259689b26f1374efb3c9a9868796953a0f814bb2d39b968d0e61b58620a5",
"monitoringEndpoint": "https://monitor.endpoint",
@@ -1166,3 +1181,85 @@ func TestResolver_StandardCapabilitiesSpec(t *testing.T) {
RunGQLTests(t, testCases)
}
+
+func TestResolver_StreamSpec(t *testing.T) {
+ var (
+ id1 = int32(1)
+ id2 = int32(2)
+ streamID = uint32(3)
+ )
+
+ testCases := []GQLTestCase{
+ {
+ name: "stream spec with stream ID",
+ authenticated: true,
+ before: func(ctx context.Context, f *gqlTestFramework) {
+ f.App.On("JobORM").Return(f.Mocks.jobORM)
+ f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id1).Return(job.Job{
+ Type: job.Stream,
+ StreamID: &streamID,
+ }, nil)
+ },
+ query: fmt.Sprintf(`
+ query GetJob {
+ job(id: "%d") {
+ ... on Job {
+ spec {
+ __typename
+ ... on StreamSpec {
+ streamID
+ }
+ }
+ }
+ }
+ }
+ `, id1),
+ result: fmt.Sprintf(`
+ {
+ "job": {
+ "spec": {
+ "__typename": "StreamSpec",
+ "streamID": "%d"
+ }
+ }
+ }
+ `, streamID),
+ },
+ {
+ name: "stream spec without stream ID",
+ authenticated: true,
+ before: func(ctx context.Context, f *gqlTestFramework) {
+ f.App.On("JobORM").Return(f.Mocks.jobORM)
+ f.Mocks.jobORM.On("FindJobWithoutSpecErrors", mock.Anything, id2).Return(job.Job{
+ Type: job.Stream,
+ }, nil)
+ },
+ query: fmt.Sprintf(`
+ query GetJob {
+ job(id: "%d") {
+ ... on Job {
+ spec {
+ __typename
+ ... on StreamSpec {
+ streamID
+ }
+ }
+ }
+ }
+ }
+ `, id2),
+ result: `
+ {
+ "job": {
+ "spec": {
+ "__typename": "StreamSpec",
+ "streamID": null
+ }
+ }
+ }
+ `,
+ },
+ }
+
+ RunGQLTests(t, testCases)
+}
diff --git a/core/web/resolver/testdata/config-full.toml b/core/web/resolver/testdata/config-full.toml
index ef26bfea75a..1418ae9497e 100644
--- a/core/web/resolver/testdata/config-full.toml
+++ b/core/web/resolver/testdata/config-full.toml
@@ -337,6 +337,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '15m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = true
MaxInFlight = 19
MaxQueued = 99
@@ -497,6 +498,7 @@ OCR2CacheTTL = '1h0m0s'
TxTimeout = '1h0m0s'
TxRetryTimeout = '1m0s'
TxConfirmTimeout = '1s'
+TxExpirationRebroadcast = false
TxRetentionTimeout = '0s'
SkipPreflight = true
Commitment = 'banana'
diff --git a/core/web/resolver/testdata/config-multi-chain-effective.toml b/core/web/resolver/testdata/config-multi-chain-effective.toml
index 7bdf50b9080..f5de84093a4 100644
--- a/core/web/resolver/testdata/config-multi-chain-effective.toml
+++ b/core/web/resolver/testdata/config-multi-chain-effective.toml
@@ -320,6 +320,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '9m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -430,6 +431,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -534,6 +536,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '6m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 5000
@@ -659,6 +662,7 @@ OCR2CacheTTL = '1m0s'
TxTimeout = '1m0s'
TxRetryTimeout = '10s'
TxConfirmTimeout = '30s'
+TxExpirationRebroadcast = false
TxRetentionTimeout = '0s'
SkipPreflight = true
Commitment = 'confirmed'
@@ -704,6 +708,7 @@ OCR2CacheTTL = '1m0s'
TxTimeout = '1m0s'
TxRetryTimeout = '10s'
TxConfirmTimeout = '30s'
+TxExpirationRebroadcast = false
TxRetentionTimeout = '0s'
SkipPreflight = true
Commitment = 'confirmed'
diff --git a/core/web/router.go b/core/web/router.go
index 6e96b47981b..c57bf3c8095 100644
--- a/core/web/router.go
+++ b/core/web/router.go
@@ -390,36 +390,23 @@ func v2Routes(app chainlink.Application, r *gin.RouterGroup) {
authv2.PATCH("/log", auth.RequiresAdminRole(lgc.Patch))
chains := authv2.Group("chains")
- for _, chain := range []struct {
- path string
- cc ChainsController
- }{
- {"evm", NewEVMChainsController(app)},
- {"solana", NewSolanaChainsController(app)},
- {"starknet", NewStarkNetChainsController(app)},
- {"cosmos", NewCosmosChainsController(app)},
- } {
- chains.GET(chain.path, paginatedRequest(chain.cc.Index))
- chains.GET(chain.path+"/:ID", chain.cc.Show)
- }
+ chainController := NewChainsController(
+ app.GetRelayers(),
+ app.GetLogger(),
+ app.GetAuditLogger(),
+ )
+ chains.GET("", paginatedRequest(chainController.Index))
+ chains.GET("/:network", paginatedRequest(chainController.Index))
+ chains.GET("/:network/:ID", chainController.Show)
nodes := authv2.Group("nodes")
- for _, chain := range []struct {
- path string
- nc NodesController
- }{
- {"evm", NewEVMNodesController(app)},
- {"solana", NewSolanaNodesController(app)},
- {"starknet", NewStarkNetNodesController(app)},
- {"cosmos", NewCosmosNodesController(app)},
- } {
- if chain.path == "evm" {
- // TODO still EVM only . Archive ticket: story/26276/multi-chain-type-ui-node-chain-configuration
- nodes.GET("", paginatedRequest(chain.nc.Index))
- }
- nodes.GET(chain.path, paginatedRequest(chain.nc.Index))
- chains.GET(chain.path+"/:ID/nodes", paginatedRequest(chain.nc.Index))
- }
+ nodesController := NewNodesController(
+ app.GetRelayers(),
+ app.GetAuditLogger(),
+ )
+ nodes.GET("", paginatedRequest(nodesController.Index))
+ nodes.GET("/:network", paginatedRequest(nodesController.Index))
+ chains.GET("/:network/:ID/nodes", paginatedRequest(nodesController.Index))
efc := EVMForwardersController{app}
authv2.GET("/nodes/evm/forwarders", paginatedRequest(efc.Index))
diff --git a/core/web/schema/type/spec.graphql b/core/web/schema/type/spec.graphql
index db81001543c..984aad02a5a 100644
--- a/core/web/schema/type/spec.graphql
+++ b/core/web/schema/type/spec.graphql
@@ -82,6 +82,7 @@ type OCR2Spec {
p2pv2Bootstrappers: [String!]
relay: String!
relayConfig: Map!
+ onchainSigningStrategy: Map!
transmitterID: String
pluginType: String!
pluginConfig: Map!
@@ -182,5 +183,5 @@ type StandardCapabilitiesSpec {
}
type StreamSpec {
- streamID: String!
+ streamID: String
}
diff --git a/core/web/solana_chains_controller.go b/core/web/solana_chains_controller.go
deleted file mode 100644
index 56d44d600ca..00000000000
--- a/core/web/solana_chains_controller.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package web
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/services/relay"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-func NewSolanaChainsController(app chainlink.Application) ChainsController {
- return newChainsController(
- relay.NetworkSolana,
- app.GetRelayers().List(chainlink.FilterRelayersByType(relay.NetworkSolana)),
- ErrSolanaNotEnabled,
- presenters.NewSolanaChainResource,
- app.GetLogger(),
- app.GetAuditLogger())
-}
diff --git a/core/web/solana_chains_controller_test.go b/core/web/solana_chains_controller_test.go
deleted file mode 100644
index fdc9bd16b9b..00000000000
--- a/core/web/solana_chains_controller_test.go
+++ /dev/null
@@ -1,216 +0,0 @@
-package web_test
-
-import (
- "fmt"
- "math/rand"
- "net/http"
- "testing"
- "time"
-
- "github.com/manyminds/api2go/jsonapi"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- commoncfg "github.com/smartcontractkit/chainlink-common/pkg/config"
- "github.com/smartcontractkit/chainlink-common/pkg/types"
- "github.com/smartcontractkit/chainlink-solana/pkg/solana/config"
-
- "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/web"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-func Test_SolanaChainsController_Show(t *testing.T) {
- t.Parallel()
-
- const validId = "Chainlink-12"
-
- testCases := []struct {
- name string
- inputId string
- wantStatusCode int
- want func(t *testing.T, app *cltest.TestApplication) *types.ChainStatus
- }{
- {
- inputId: validId,
- name: "success",
- want: func(t *testing.T, app *cltest.TestApplication) *types.ChainStatus {
- return &types.ChainStatus{
- ID: validId,
- Enabled: true,
- Config: `ChainID = 'Chainlink-12'
-BalancePollPeriod = '5s'
-ConfirmPollPeriod = '500ms'
-OCR2CachePollPeriod = '1s'
-OCR2CacheTTL = '1m0s'
-TxTimeout = '1h0m0s'
-TxRetryTimeout = '10s'
-TxConfirmTimeout = '30s'
-TxRetentionTimeout = '0s'
-SkipPreflight = false
-Commitment = 'confirmed'
-MaxRetries = 0
-FeeEstimatorMode = 'fixed'
-ComputeUnitPriceMax = 1000
-ComputeUnitPriceMin = 0
-ComputeUnitPriceDefault = 0
-FeeBumpPeriod = '3s'
-BlockHistoryPollPeriod = '5s'
-BlockHistorySize = 1
-ComputeUnitLimitDefault = 200000
-EstimateComputeUnitLimit = false
-Nodes = []
-
-[MultiNode]
-Enabled = false
-PollFailureThreshold = 5
-PollInterval = '15s'
-SelectionMode = 'PriorityLevel'
-SyncThreshold = 10
-NodeIsSyncingEnabled = false
-LeaseDuration = '1m0s'
-FinalizedBlockPollInterval = '5s'
-EnforceRepeatableRead = true
-DeathDeclarationDelay = '20s'
-NodeNoNewHeadsThreshold = '20s'
-NoNewFinalizedHeadsThreshold = '20s'
-FinalityDepth = 0
-FinalityTagEnabled = true
-FinalizedBlockOffset = 50
-`,
- }
- },
- wantStatusCode: http.StatusOK,
- },
- {
- inputId: "234",
- name: "not found",
- want: func(t *testing.T, app *cltest.TestApplication) *types.ChainStatus {
- return nil
- },
- wantStatusCode: http.StatusBadRequest,
- },
- }
-
- for _, testCase := range testCases {
- tc := testCase
-
- t.Run(tc.name, func(t *testing.T) {
- t.Parallel()
-
- controller := setupSolanaChainsControllerTestV2(t, &config.TOMLConfig{
- ChainID: ptr(validId),
- Chain: config.Chain{
- SkipPreflight: ptr(false),
- TxTimeout: commoncfg.MustNewDuration(time.Hour),
- },
- })
-
- wantedResult := tc.want(t, controller.app)
- resp, cleanup := controller.client.Get(
- fmt.Sprintf("/v2/chains/solana/%s", tc.inputId),
- )
- t.Cleanup(cleanup)
- require.Equal(t, tc.wantStatusCode, resp.StatusCode)
-
- if wantedResult != nil {
- resource1 := presenters.SolanaChainResource{}
- err := web.ParseJSONAPIResponse(cltest.ParseResponseBody(t, resp), &resource1)
- require.NoError(t, err)
-
- assert.Equal(t, wantedResult.ID, resource1.ID)
- assert.Equal(t, wantedResult.Enabled, resource1.Enabled)
- assert.Equal(t, wantedResult.Config, resource1.Config)
- }
- })
- }
-}
-
-func Test_SolanaChainsController_Index(t *testing.T) {
- t.Parallel()
-
- chainA := &config.TOMLConfig{
- ChainID: ptr(fmt.Sprintf("ChainlinktestA-%d", rand.Int31n(999999))),
- Chain: config.Chain{
- TxTimeout: commoncfg.MustNewDuration(time.Hour),
- },
- }
- chainB := &config.TOMLConfig{
- ChainID: ptr(fmt.Sprintf("ChainlinktestB-%d", rand.Int31n(999999))),
- Chain: config.Chain{
- SkipPreflight: ptr(false),
- },
- }
- controller := setupSolanaChainsControllerTestV2(t, chainA, chainB)
-
- badResp, cleanup := controller.client.Get("/v2/chains/solana?size=asd")
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusUnprocessableEntity, badResp.StatusCode)
-
- resp, cleanup := controller.client.Get("/v2/chains/solana?size=1")
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusOK, resp.StatusCode)
-
- body := cltest.ParseResponseBody(t, resp)
-
- metaCount, err := cltest.ParseJSONAPIResponseMetaCount(body)
- require.NoError(t, err)
- require.Equal(t, 2, metaCount)
-
- var links jsonapi.Links
-
- chains := []presenters.SolanaChainResource{}
- err = web.ParsePaginatedResponse(body, &chains, &links)
- assert.NoError(t, err)
- assert.NotEmpty(t, links["next"].Href)
- assert.Empty(t, links["prev"].Href)
-
- assert.Len(t, links, 1)
- assert.Equal(t, *chainA.ChainID, chains[0].ID)
- tomlA, err := chainA.TOMLString()
- require.NoError(t, err)
- assert.Equal(t, tomlA, chains[0].Config)
-
- resp, cleanup = controller.client.Get(links["next"].Href)
- t.Cleanup(cleanup)
- require.Equal(t, http.StatusOK, resp.StatusCode)
-
- chains = []presenters.SolanaChainResource{}
- err = web.ParsePaginatedResponse(cltest.ParseResponseBody(t, resp), &chains, &links)
- assert.NoError(t, err)
- assert.Empty(t, links["next"].Href)
- assert.NotEmpty(t, links["prev"].Href)
-
- assert.Len(t, links, 1)
- assert.Equal(t, *chainB.ChainID, chains[0].ID)
- tomlB, err := chainB.TOMLString()
- require.NoError(t, err)
- assert.Equal(t, tomlB, chains[0].Config)
-}
-
-type TestSolanaChainsController struct {
- app *cltest.TestApplication
- client cltest.HTTPClientCleaner
-}
-
-func setupSolanaChainsControllerTestV2(t *testing.T, cfgs ...*config.TOMLConfig) *TestSolanaChainsController {
- for i := range cfgs {
- cfgs[i].SetDefaults()
- }
- cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
- c.Solana = cfgs
- c.EVM = nil
- })
- app := cltest.NewApplicationWithConfig(t, cfg)
- require.NoError(t, app.Start(testutils.Context(t)))
-
- client := app.NewHTTPClient(nil)
-
- return &TestSolanaChainsController{
- app: app,
- client: client,
- }
-}
diff --git a/core/web/solana_nodes_controller.go b/core/web/solana_nodes_controller.go
deleted file mode 100644
index 71b8f70c5ec..00000000000
--- a/core/web/solana_nodes_controller.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package web
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/services/relay"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// ErrSolanaNotEnabled is returned when Solana.Enabled is not true.
-var ErrSolanaNotEnabled = errChainDisabled{name: "Solana", tomlKey: "Solana.Enabled"}
-
-func NewSolanaNodesController(app chainlink.Application) NodesController {
- scopedNodeStatuser := NewNetworkScopedNodeStatuser(app.GetRelayers(), relay.NetworkSolana)
-
- return newNodesController[presenters.SolanaNodeResource](
- scopedNodeStatuser, ErrSolanaNotEnabled, presenters.NewSolanaNodeResource, app.GetAuditLogger())
-}
diff --git a/core/web/solana_transfer_controller.go b/core/web/solana_transfer_controller.go
index 07c629a7dd1..5a5f51bc9dd 100644
--- a/core/web/solana_transfer_controller.go
+++ b/core/web/solana_transfer_controller.go
@@ -22,6 +22,8 @@ type SolanaTransfersController struct {
App chainlink.Application
}
+var ErrSolanaNotEnabled = errChainDisabled{name: "Solana", tomlKey: "Solana.Enabled"}
+
// Create sends SOL and other native coins from the Chainlink's account to a specified address.
func (tc *SolanaTransfersController) Create(c *gin.Context) {
relayers := tc.App.GetRelayers().List(chainlink.FilterRelayersByType(relay.NetworkSolana))
diff --git a/core/web/starknet_chains_controller.go b/core/web/starknet_chains_controller.go
deleted file mode 100644
index eb79ba3f962..00000000000
--- a/core/web/starknet_chains_controller.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package web
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/services/relay"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-func NewStarkNetChainsController(app chainlink.Application) ChainsController {
- return newChainsController(
- relay.NetworkStarkNet,
- app.GetRelayers().List(chainlink.FilterRelayersByType(relay.NetworkStarkNet)),
- ErrStarkNetNotEnabled,
- presenters.NewStarkNetChainResource,
- app.GetLogger(),
- app.GetAuditLogger())
-}
diff --git a/core/web/starknet_nodes_controller.go b/core/web/starknet_nodes_controller.go
deleted file mode 100644
index 664b89d03ca..00000000000
--- a/core/web/starknet_nodes_controller.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package web
-
-import (
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
- "github.com/smartcontractkit/chainlink/v2/core/services/relay"
- "github.com/smartcontractkit/chainlink/v2/core/web/presenters"
-)
-
-// ErrStarkNetNotEnabled is returned when Starknet.Enabled is not true.
-var ErrStarkNetNotEnabled = errChainDisabled{name: "StarkNet", tomlKey: "Starknet.Enabled"}
-
-func NewStarkNetNodesController(app chainlink.Application) NodesController {
- scopedNodeStatuser := NewNetworkScopedNodeStatuser(app.GetRelayers(), relay.NetworkStarkNet)
-
- return newNodesController[presenters.StarkNetNodeResource](
- scopedNodeStatuser, ErrStarkNetNotEnabled, presenters.NewStarkNetNodeResource, app.GetAuditLogger())
-}
diff --git a/deployment/.golangci.yml b/deployment/.golangci.yml
index 0268ba7beaa..ff1303e26ce 100644
--- a/deployment/.golangci.yml
+++ b/deployment/.golangci.yml
@@ -1,15 +1,33 @@
run:
timeout: 15m
+ allow-parallel-runners: true
linters:
enable:
+ - containedctx
+ - depguard
+ - errname
+ - errorlint
- exhaustive
- exportloopref
- - revive
+ - fatcontext
+ - ginkgolinter
+ - gocritic
- goimports
- gosec
+ - loggercheck
+ - mirror
- misspell
+ - noctx
+ - nolintlint
+ - perfsprint
+ - prealloc
+ - revive
- rowserrcheck
- - errorlint
+ - spancheck
+ - sqlclosecheck
+ - testifylint
+ - unconvert
+ - whitespace
linters-settings:
exhaustive:
default-signifies-exhaustive: true
@@ -23,6 +41,28 @@ linters-settings:
govet:
enable:
- shadow
+ settings:
+ printf:
+ # Additionally check chainlink custom loggers
+ funcs:
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Tracef
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Debugf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Infof
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Warnf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Errorf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Criticalf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Panicf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Fatalf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.SugaredLogger).AssumptionViolationf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Debugf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Infof
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Warnf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Errorf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Panicf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Fatalf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).AssumptionViolationf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Tracef
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Criticalf
revive:
confidence: 0.8
rules:
@@ -33,9 +73,10 @@ linters-settings:
- name: error-return
- name: error-strings
- name: error-naming
+ - name: exported
- name: if-return
- name: increment-decrement
- # - name: var-naming // doesn't work with some generated names
+ - name: var-naming
- name: var-declaration
- name: package-comments
- name: range
@@ -46,7 +87,7 @@ linters-settings:
- name: errorf
- name: empty-block
- name: superfluous-else
- #- name: unused-parameter
+ # - name: unused-parameter
- name: unreachable-code
- name: redefines-builtin-id
- name: waitgroup-by-value
@@ -61,13 +102,69 @@ linters-settings:
- name: identical-branches
- name: get-return
# - name: flag-parameter // probably one we should work on doing better at in the future
- # - name: early-return // probably one we should work on doing better at in the future
+ - name: early-return
- name: defer
- name: constant-logical-expr
- name: confusing-naming
- name: confusing-results
- name: bool-literal-in-expr
- name: atomic
+ depguard:
+ rules:
+ main:
+ list-mode: lax
+ deny:
+ - pkg: cosmossdk.io/errors
+ desc: Use the standard library instead
+ - pkg: github.com/gofrs/uuid
+ desc: Use github.com/google/uuid instead
+ - pkg: github.com/jackc/pgx3
+ desc: Use github.com/jackc/pgx4 instead
+ - pkg: github.com/jackc/pgx5
+ desc: Use github.com/jackc/pgx4 instead
+ - pkg: github.com/satori/go.uuid
+ desc: Use github.com/google/uuid instead
+ - pkg: github.com/test-go/testify/assert
+ desc: Use github.com/stretchr/testify/assert instead
+ - pkg: github.com/test-go/testify/mock
+ desc: Use github.com/stretchr/testify/mock instead
+ - pkg: github.com/test-go/testify/require
+ desc: Use github.com/stretchr/testify/require instead
+ - pkg: go.uber.org/multierr
+ desc: Use the standard library instead, for example https://pkg.go.dev/errors#Join
+ - pkg: gopkg.in/guregu/null.v1
+ desc: Use gopkg.in/guregu/null.v4 instead
+ - pkg: gopkg.in/guregu/null.v2
+ desc: Use gopkg.in/guregu/null.v4 instead
+ - pkg: gopkg.in/guregu/null.v3
+ desc: Use gopkg.in/guregu/null.v4 instead
+ - pkg: github.com/go-gorm/gorm
+ desc: Use github.com/jmoiron/sqlx directly instead
+ loggercheck:
+ # Check that *w logging functions have even number of args (i.e., well formed key-value pairs).
+ rules:
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Tracew
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Debugw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Infow
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Warnw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Errorw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Criticalw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Panicw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Fatalw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.SugaredLogger).AssumptionViolationw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Debugw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Infow
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Warnw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Errorw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Panicw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Fatalw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).AssumptionViolationw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Tracew
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Criticalw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).With
+ nolintlint:
+ require-specific: true
+ require-explanation: true
issues:
exclude-rules:
- path: memory/(.+)\.go
diff --git a/deployment/.mockery.yaml b/deployment/.mockery.yaml
new file mode 100644
index 00000000000..79e4d52104a
--- /dev/null
+++ b/deployment/.mockery.yaml
@@ -0,0 +1,13 @@
+dir: "{{ .InterfaceDir }}/mocks"
+mockname: "{{ .InterfaceName }}"
+outpkg: mocks
+filename: "{{ .InterfaceName | snakecase }}.go"
+packages:
+ github.com/smartcontractkit/chainlink/deployment:
+ interfaces:
+ OffchainClient:
+ config:
+ mockname: "Mock{{ .InterfaceName }}"
+ filename: offchain_client_mock.go
+ inpackage: true
+ dir: "{{ .InterfaceDir }}/mocks"
\ No newline at end of file
diff --git a/deployment/README.md b/deployment/README.md
index c6579ca6205..f3bd29b768b 100644
--- a/deployment/README.md
+++ b/deployment/README.md
@@ -6,14 +6,14 @@ deployment/configuration logic to be tested against ephemeral environments
and then exposed for use in persistent environments like testnet/mainnet.
## Table of Contents
-- [Address Book](##Address-Book)
-- [View](##View)
-- [Environment](##Environment)
-- [Job Distributor](##Job-Distributor)
-- [Changesets](##Changesets)
-- [Directory Structure](##Directory-Structure)
-- [Integration Testing](##Integration-Testing)
-- [FAQ](##FAQ)
+- [Address Book](#address-book)
+- [View](#view)
+- [Environment](#environment)
+- [Job Distributor](#job-distributor)
+- [Changesets](#changsets)
+- [Directory Structure](#directory-structure)
+- [Integration Testing](#integration-testing)
+- [FAQ](#faq)
## Address Book
An [address book](https://github.com/smartcontractkit/chainlink/blob/develop/deployment/address_book.go#L79) represents
@@ -100,14 +100,14 @@ TODO: Add various examples in deployment/example.
contracts (like MCMS, LinkToken etc) which can be shared
by products.
-/deployment//internal
+/deployment/product/internal
- Internal building blocks for changesets
-/deployment//view
+/deployment/product/view
- Hold readonly mappings Go bindings to json marshallable objects.
- Used to generate a view of the system.
-/deployment//changeset
+/deployment/product/changeset
- Think of this as the public API for deployment and configuration
of your product.
- All the changesets should have an associated test using a memory or devenv
diff --git a/deployment/address_book.go b/deployment/address_book.go
index 6f605013011..3ce0332a4c3 100644
--- a/deployment/address_book.go
+++ b/deployment/address_book.go
@@ -89,8 +89,10 @@ type AddressBook interface {
Remove(ab AddressBook) error
}
+type AddressesByChain map[uint64]map[string]TypeAndVersion
+
type AddressBookMap struct {
- addressesByChain map[uint64]map[string]TypeAndVersion
+ addressesByChain AddressesByChain
mtx sync.RWMutex
}
diff --git a/deployment/ccip/changeset/accept_ownership_test.go b/deployment/ccip/changeset/accept_ownership_test.go
index 5580b31a85a..f74556b6600 100644
--- a/deployment/ccip/changeset/accept_ownership_test.go
+++ b/deployment/ccip/changeset/accept_ownership_test.go
@@ -9,9 +9,11 @@ import (
"golang.org/x/exp/maps"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
)
func Test_NewAcceptOwnershipChangeset(t *testing.T) {
+ t.Parallel()
e := NewMemoryEnvironment(t)
state, err := LoadOnchainState(e.Env)
require.NoError(t, err)
@@ -20,12 +22,12 @@ func Test_NewAcceptOwnershipChangeset(t *testing.T) {
source := allChains[0]
dest := allChains[1]
- timelockContracts := map[uint64]*commonchangeset.TimelockExecutionContracts{
- source: &commonchangeset.TimelockExecutionContracts{
+ timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{
+ source: {
Timelock: state.Chains[source].Timelock,
CallProxy: state.Chains[source].CallProxy,
},
- dest: &commonchangeset.TimelockExecutionContracts{
+ dest: {
Timelock: state.Chains[dest].Timelock,
CallProxy: state.Chains[dest].CallProxy,
},
@@ -68,6 +70,8 @@ func genTestTransferOwnershipConfig(
state.Chains[chain].FeeQuoter.Address(),
state.Chains[chain].NonceManager.Address(),
state.Chains[chain].RMNRemote.Address(),
+ state.Chains[chain].TestRouter.Address(),
+ state.Chains[chain].Router.Address(),
}
}
diff --git a/deployment/ccip/changeset/cs_add_chain.go b/deployment/ccip/changeset/cs_add_chain.go
deleted file mode 100644
index b3d0df04c93..00000000000
--- a/deployment/ccip/changeset/cs_add_chain.go
+++ /dev/null
@@ -1,341 +0,0 @@
-package changeset
-
-import (
- "fmt"
- "math/big"
-
- "github.com/ethereum/go-ethereum/common"
-
- "github.com/smartcontractkit/chainlink-ccip/chainconfig"
- "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
-
- "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
- "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
- "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
-
- "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
- "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
- "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
-
- "github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp"
-)
-
-var _ deployment.ChangeSet[ChainInboundChangesetConfig] = NewChainInboundChangeset
-
-type ChainInboundChangesetConfig struct {
- HomeChainSelector uint64
- NewChainSelector uint64
- SourceChainSelectors []uint64
-}
-
-func (c ChainInboundChangesetConfig) Validate() error {
- if c.HomeChainSelector == 0 {
- return fmt.Errorf("HomeChainSelector must be set")
- }
- if c.NewChainSelector == 0 {
- return fmt.Errorf("NewChainSelector must be set")
- }
- if len(c.SourceChainSelectors) == 0 {
- return fmt.Errorf("SourceChainSelectors must be set")
- }
- return nil
-}
-
-// NewChainInboundChangeset generates a proposal
-// to connect the new chain to the existing chains.
-func NewChainInboundChangeset(
- e deployment.Environment,
- cfg ChainInboundChangesetConfig,
-) (deployment.ChangesetOutput, error) {
- if err := cfg.Validate(); err != nil {
- return deployment.ChangesetOutput{}, err
- }
-
- state, err := LoadOnchainState(e)
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
- // Generate proposal which enables new destination (from test router) on all source chains.
- var batches []timelock.BatchChainOperation
- for _, source := range cfg.SourceChainSelectors {
- enableOnRampDest, err := state.Chains[source].OnRamp.ApplyDestChainConfigUpdates(deployment.SimTransactOpts(), []onramp.OnRampDestChainConfigArgs{
- {
- DestChainSelector: cfg.NewChainSelector,
- Router: state.Chains[source].TestRouter.Address(),
- },
- })
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
- enableFeeQuoterDest, err := state.Chains[source].FeeQuoter.ApplyDestChainConfigUpdates(
- deployment.SimTransactOpts(),
- []fee_quoter.FeeQuoterDestChainConfigArgs{
- {
- DestChainSelector: cfg.NewChainSelector,
- DestChainConfig: DefaultFeeQuoterDestChainConfig(),
- },
- })
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
- batches = append(batches, timelock.BatchChainOperation{
- ChainIdentifier: mcms.ChainIdentifier(source),
- Batch: []mcms.Operation{
- {
- // Enable the source in on ramp
- To: state.Chains[source].OnRamp.Address(),
- Data: enableOnRampDest.Data(),
- Value: big.NewInt(0),
- },
- {
- To: state.Chains[source].FeeQuoter.Address(),
- Data: enableFeeQuoterDest.Data(),
- Value: big.NewInt(0),
- },
- },
- })
- }
-
- addChainOp, err := applyChainConfigUpdatesOp(e, state, cfg.HomeChainSelector, []uint64{cfg.NewChainSelector})
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
-
- batches = append(batches, timelock.BatchChainOperation{
- ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector),
- Batch: []mcms.Operation{
- addChainOp,
- },
- })
-
- var (
- timelocksPerChain = make(map[uint64]common.Address)
- proposerMCMSes = make(map[uint64]*gethwrappers.ManyChainMultiSig)
- )
- for _, chain := range append(cfg.SourceChainSelectors, cfg.HomeChainSelector) {
- timelocksPerChain[chain] = state.Chains[chain].Timelock.Address()
- proposerMCMSes[chain] = state.Chains[chain].ProposerMcm
- }
- prop, err := proposalutils.BuildProposalFromBatches(
- timelocksPerChain,
- proposerMCMSes,
- batches,
- "proposal to set new chains",
- 0,
- )
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
-
- return deployment.ChangesetOutput{
- Proposals: []timelock.MCMSWithTimelockProposal{*prop},
- }, nil
-}
-
-type AddDonAndSetCandidateChangesetConfig struct {
- HomeChainSelector uint64
- FeedChainSelector uint64
- NewChainSelector uint64
- PluginType types.PluginType
- NodeIDs []string
- CCIPOCRParams CCIPOCRParams
-}
-
-func (a AddDonAndSetCandidateChangesetConfig) Validate(e deployment.Environment, state CCIPOnChainState) (deployment.Nodes, error) {
- if a.HomeChainSelector == 0 {
- return nil, fmt.Errorf("HomeChainSelector must be set")
- }
- if a.FeedChainSelector == 0 {
- return nil, fmt.Errorf("FeedChainSelector must be set")
- }
- if a.NewChainSelector == 0 {
- return nil, fmt.Errorf("ocr config chain selector must be set")
- }
- if a.PluginType != types.PluginTypeCCIPCommit &&
- a.PluginType != types.PluginTypeCCIPExec {
- return nil, fmt.Errorf("PluginType must be set to either CCIPCommit or CCIPExec")
- }
- // TODO: validate token config
- if len(a.NodeIDs) == 0 {
- return nil, fmt.Errorf("nodeIDs must be set")
- }
- nodes, err := deployment.NodeInfo(a.NodeIDs, e.Offchain)
- if err != nil {
- return nil, fmt.Errorf("get node info: %w", err)
- }
-
- // check that chain config is set up for the new chain
- chainConfig, err := state.Chains[a.HomeChainSelector].CCIPHome.GetChainConfig(nil, a.NewChainSelector)
- if err != nil {
- return nil, fmt.Errorf("get all chain configs: %w", err)
- }
-
- // FChain should never be zero if a chain config is set in CCIPHome
- if chainConfig.FChain == 0 {
- return nil, fmt.Errorf("chain config not set up for new chain %d", a.NewChainSelector)
- }
-
- err = a.CCIPOCRParams.Validate()
- if err != nil {
- return nil, fmt.Errorf("invalid ccip ocr params: %w", err)
- }
-
- if e.OCRSecrets.IsEmpty() {
- return nil, fmt.Errorf("OCR secrets must be set")
- }
-
- return nodes, nil
-}
-
-// AddDonAndSetCandidateChangeset adds new DON for destination to home chain
-// and sets the commit plugin config as candidateConfig for the don.
-func AddDonAndSetCandidateChangeset(
- e deployment.Environment,
- cfg AddDonAndSetCandidateChangesetConfig,
-) (deployment.ChangesetOutput, error) {
- state, err := LoadOnchainState(e)
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
-
- nodes, err := cfg.Validate(e, state)
- if err != nil {
- return deployment.ChangesetOutput{}, fmt.Errorf("%w: %w", deployment.ErrInvalidConfig, err)
- }
-
- newDONArgs, err := internal.BuildOCR3ConfigForCCIPHome(
- e.OCRSecrets,
- state.Chains[cfg.NewChainSelector].OffRamp,
- e.Chains[cfg.NewChainSelector],
- nodes.NonBootstraps(),
- state.Chains[cfg.HomeChainSelector].RMNHome.Address(),
- cfg.CCIPOCRParams.OCRParameters,
- cfg.CCIPOCRParams.CommitOffChainConfig,
- cfg.CCIPOCRParams.ExecuteOffChainConfig,
- )
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
- latestDon, err := internal.LatestCCIPDON(state.Chains[cfg.HomeChainSelector].CapabilityRegistry)
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
- commitConfig, ok := newDONArgs[cfg.PluginType]
- if !ok {
- return deployment.ChangesetOutput{}, fmt.Errorf("missing commit plugin in ocr3Configs")
- }
- donID := latestDon.Id + 1
- addDonOp, err := newDonWithCandidateOp(
- donID, commitConfig,
- state.Chains[cfg.HomeChainSelector].CapabilityRegistry,
- nodes.NonBootstraps(),
- )
- if err != nil {
- return deployment.ChangesetOutput{}, err
- }
-
- var (
- timelocksPerChain = map[uint64]common.Address{
- cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(),
- }
- proposerMCMSes = map[uint64]*gethwrappers.ManyChainMultiSig{
- cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm,
- }
- )
- prop, err := proposalutils.BuildProposalFromBatches(
- timelocksPerChain,
- proposerMCMSes,
- []timelock.BatchChainOperation{{
- ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector),
- Batch: []mcms.Operation{addDonOp},
- }},
- "setCandidate for commit and AddDon on new Chain",
- 0, // minDelay
- )
- if err != nil {
- return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal from batch: %w", err)
- }
-
- return deployment.ChangesetOutput{
- Proposals: []timelock.MCMSWithTimelockProposal{*prop},
- }, nil
-}
-
-func applyChainConfigUpdatesOp(
- e deployment.Environment,
- state CCIPOnChainState,
- homeChainSel uint64,
- chains []uint64,
-) (mcms.Operation, error) {
- nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain)
- if err != nil {
- return mcms.Operation{}, err
- }
- encodedExtraChainConfig, err := chainconfig.EncodeChainConfig(chainconfig.ChainConfig{
- GasPriceDeviationPPB: ccipocr3.NewBigIntFromInt64(1000),
- DAGasPriceDeviationPPB: ccipocr3.NewBigIntFromInt64(0),
- OptimisticConfirmations: 1,
- })
- if err != nil {
- return mcms.Operation{}, err
- }
- var chainConfigUpdates []ccip_home.CCIPHomeChainConfigArgs
- for _, chainSel := range chains {
- chainConfig := setupConfigInfo(chainSel, nodes.NonBootstraps().PeerIDs(),
- nodes.DefaultF(), encodedExtraChainConfig)
- chainConfigUpdates = append(chainConfigUpdates, chainConfig)
- }
-
- addChain, err := state.Chains[homeChainSel].CCIPHome.ApplyChainConfigUpdates(
- deployment.SimTransactOpts(),
- nil,
- chainConfigUpdates,
- )
- if err != nil {
- return mcms.Operation{}, err
- }
- return mcms.Operation{
- To: state.Chains[homeChainSel].CCIPHome.Address(),
- Data: addChain.Data(),
- Value: big.NewInt(0),
- }, nil
-}
-
-// newDonWithCandidateOp sets the candidate commit config by calling setCandidate on CCIPHome contract through the AddDON call on CapReg contract
-// This should be done first before calling any other UpdateDON calls
-// This proposes to set up OCR3 config for the commit plugin for the DON
-func newDonWithCandidateOp(
- donID uint32,
- pluginConfig ccip_home.CCIPHomeOCR3Config,
- capReg *capabilities_registry.CapabilitiesRegistry,
- nodes deployment.Nodes,
-) (mcms.Operation, error) {
- encodedSetCandidateCall, err := internal.CCIPHomeABI.Pack(
- "setCandidate",
- donID,
- pluginConfig.PluginType,
- pluginConfig,
- [32]byte{},
- )
- if err != nil {
- return mcms.Operation{}, fmt.Errorf("pack set candidate call: %w", err)
- }
- addDonTx, err := capReg.AddDON(deployment.SimTransactOpts(), nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: internal.CCIPCapabilityID,
- Config: encodedSetCandidateCall,
- },
- }, false, false, nodes.DefaultF())
- if err != nil {
- return mcms.Operation{}, fmt.Errorf("could not generate add don tx w/ commit config: %w", err)
- }
- return mcms.Operation{
- To: capReg.Address(),
- Data: addDonTx.Data(),
- Value: big.NewInt(0),
- }, nil
-}
diff --git a/deployment/ccip/changeset/cs_add_chain_test.go b/deployment/ccip/changeset/cs_add_chain_test.go
deleted file mode 100644
index b21d7411ce7..00000000000
--- a/deployment/ccip/changeset/cs_add_chain_test.go
+++ /dev/null
@@ -1,337 +0,0 @@
-package changeset
-
-import (
- "math/big"
- "testing"
- "time"
-
- "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
- commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
- commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
- "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
-
- "github.com/ethereum/go-ethereum/common"
-
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-
- cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
- commonutils "github.com/smartcontractkit/chainlink-common/pkg/utils"
-
- "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
-
- "github.com/smartcontractkit/chainlink/deployment"
-
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
- "github.com/smartcontractkit/chainlink/v2/core/logger"
-)
-
-func TestAddChainInbound(t *testing.T) {
- // 4 chains where the 4th is added after initial deployment.
- e := NewMemoryEnvironment(t,
- WithChains(4),
- WithJobsOnly(),
- )
- state, err := LoadOnchainState(e.Env)
- require.NoError(t, err)
- // Take first non-home chain as the new chain.
- newChain := e.Env.AllChainSelectorsExcluding([]uint64{e.HomeChainSel})[0]
- // We deploy to the rest.
- initialDeploy := e.Env.AllChainSelectorsExcluding([]uint64{newChain})
- newAddresses := deployment.NewMemoryAddressBook()
- err = deployPrerequisiteChainContracts(e.Env, newAddresses, initialDeploy, nil)
- require.NoError(t, err)
- require.NoError(t, e.Env.ExistingAddresses.Merge(newAddresses))
-
- cfg := commontypes.MCMSWithTimelockConfig{
- Canceller: commonchangeset.SingleGroupMCMS(t),
- Bypasser: commonchangeset.SingleGroupMCMS(t),
- Proposer: commonchangeset.SingleGroupMCMS(t),
- TimelockMinDelay: big.NewInt(0),
- }
- e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{
- {
- Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken),
- Config: initialDeploy,
- },
- {
- Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock),
- Config: map[uint64]commontypes.MCMSWithTimelockConfig{
- initialDeploy[0]: cfg,
- initialDeploy[1]: cfg,
- initialDeploy[2]: cfg,
- },
- },
- })
- require.NoError(t, err)
- newAddresses = deployment.NewMemoryAddressBook()
- tokenConfig := NewTestTokenConfig(state.Chains[e.FeedChainSel].USDFeeds)
-
- chainConfig := make(map[uint64]CCIPOCRParams)
- for _, chain := range initialDeploy {
- chainConfig[chain] = DefaultOCRParams(e.FeedChainSel, nil, nil)
- }
- newChainCfg := NewChainsConfig{
- HomeChainSel: e.HomeChainSel,
- FeedChainSel: e.FeedChainSel,
- ChainConfigByChain: chainConfig,
- }
- e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{
- {
- Changeset: commonchangeset.WrapChangeSet(DeployChainContracts),
- Config: DeployChainContractsConfig{
- ChainSelectors: newChainCfg.Chains(),
- HomeChainSelector: newChainCfg.HomeChainSel,
- },
- },
- {
- Changeset: commonchangeset.WrapChangeSet(ConfigureNewChains),
- Config: newChainCfg,
- },
- })
- require.NoError(t, err)
-
- state, err = LoadOnchainState(e.Env)
- require.NoError(t, err)
-
- // Connect all the existing lanes.
- for _, source := range initialDeploy {
- for _, dest := range initialDeploy {
- if source != dest {
- require.NoError(t, AddLaneWithDefaultPricesAndFeeQuoterConfig(e.Env, state, source, dest, false))
- }
- }
- }
-
- rmnHomeAddress, err := deployment.SearchAddressBook(e.Env.ExistingAddresses, e.HomeChainSel, RMNHome)
- require.NoError(t, err)
- require.True(t, common.IsHexAddress(rmnHomeAddress))
- rmnHome, err := rmn_home.NewRMNHome(common.HexToAddress(rmnHomeAddress), e.Env.Chains[e.HomeChainSel].Client)
- require.NoError(t, err)
-
- // Deploy contracts to new chain
- e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{
- {
- Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken),
- Config: []uint64{newChain},
- },
- {
- Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock),
- Config: map[uint64]commontypes.MCMSWithTimelockConfig{
- newChain: cfg,
- },
- },
- })
- require.NoError(t, err)
- newAddresses = deployment.NewMemoryAddressBook()
-
- err = deployPrerequisiteChainContracts(e.Env, newAddresses, []uint64{newChain}, nil)
- require.NoError(t, err)
- require.NoError(t, e.Env.ExistingAddresses.Merge(newAddresses))
- newAddresses = deployment.NewMemoryAddressBook()
- err = deployChainContracts(e.Env,
- e.Env.Chains[newChain], newAddresses, rmnHome)
- require.NoError(t, err)
- require.NoError(t, e.Env.ExistingAddresses.Merge(newAddresses))
- state, err = LoadOnchainState(e.Env)
- require.NoError(t, err)
-
- // configure the testrouter appropriately on each chain
- for _, source := range initialDeploy {
- tx, err := state.Chains[source].TestRouter.ApplyRampUpdates(e.Env.Chains[source].DeployerKey, []router.RouterOnRamp{
- {
- DestChainSelector: newChain,
- OnRamp: state.Chains[source].OnRamp.Address(),
- },
- }, nil, nil)
- _, err = deployment.ConfirmIfNoError(e.Env.Chains[source], tx, err)
- require.NoError(t, err)
- }
-
- // transfer ownership to timelock
- _, err = commonchangeset.ApplyChangesets(t, e.Env, map[uint64]*commonchangeset.TimelockExecutionContracts{
- initialDeploy[0]: {
- Timelock: state.Chains[initialDeploy[0]].Timelock,
- CallProxy: state.Chains[initialDeploy[0]].CallProxy,
- },
- initialDeploy[1]: {
- Timelock: state.Chains[initialDeploy[1]].Timelock,
- CallProxy: state.Chains[initialDeploy[1]].CallProxy,
- },
- initialDeploy[2]: {
- Timelock: state.Chains[initialDeploy[2]].Timelock,
- CallProxy: state.Chains[initialDeploy[2]].CallProxy,
- },
- }, []commonchangeset.ChangesetApplication{
- {
- Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock),
- Config: genTestTransferOwnershipConfig(e, initialDeploy, state),
- },
- {
- Changeset: commonchangeset.WrapChangeSet(NewChainInboundChangeset),
- Config: ChainInboundChangesetConfig{
- HomeChainSelector: e.HomeChainSel,
- NewChainSelector: newChain,
- SourceChainSelectors: initialDeploy,
- },
- },
- })
- require.NoError(t, err)
-
- assertTimelockOwnership(t, e, initialDeploy, state)
-
- nodes, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain)
- require.NoError(t, err)
-
- // TODO This currently is not working - Able to send the request here but request gets stuck in execution
- // Send a new message and expect that this is delivered once the chain is completely set up as inbound
- //TestSendRequest(t, e.Env, state, initialDeploy[0], newChain, true)
- var nodeIDs []string
- for _, node := range nodes {
- nodeIDs = append(nodeIDs, node.NodeID)
- }
-
- _, err = commonchangeset.ApplyChangesets(t, e.Env, map[uint64]*commonchangeset.TimelockExecutionContracts{
- e.HomeChainSel: {
- Timelock: state.Chains[e.HomeChainSel].Timelock,
- CallProxy: state.Chains[e.HomeChainSel].CallProxy,
- },
- newChain: {
- Timelock: state.Chains[newChain].Timelock,
- CallProxy: state.Chains[newChain].CallProxy,
- },
- }, []commonchangeset.ChangesetApplication{
- {
- Changeset: commonchangeset.WrapChangeSet(AddDonAndSetCandidateChangeset),
- Config: AddDonAndSetCandidateChangesetConfig{
- HomeChainSelector: e.HomeChainSel,
- FeedChainSelector: e.FeedChainSel,
- NewChainSelector: newChain,
- PluginType: types.PluginTypeCCIPCommit,
- NodeIDs: nodeIDs,
- CCIPOCRParams: DefaultOCRParams(
- e.FeedChainSel,
- tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[newChain].LinkToken, state.Chains[newChain].Weth9),
- nil,
- ),
- },
- },
- {
- Changeset: commonchangeset.WrapChangeSet(SetCandidatePluginChangeset),
- Config: AddDonAndSetCandidateChangesetConfig{
- HomeChainSelector: e.HomeChainSel,
- FeedChainSelector: e.FeedChainSel,
- NewChainSelector: newChain,
- PluginType: types.PluginTypeCCIPExec,
- NodeIDs: nodeIDs,
- CCIPOCRParams: DefaultOCRParams(
- e.FeedChainSel,
- tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[newChain].LinkToken, state.Chains[newChain].Weth9),
- nil,
- ),
- },
- },
- {
- Changeset: commonchangeset.WrapChangeSet(PromoteAllCandidatesChangeset),
- Config: PromoteAllCandidatesChangesetConfig{
- HomeChainSelector: e.HomeChainSel,
- DONChainSelector: newChain,
- NodeIDs: nodeIDs,
- MCMS: &MCMSConfig{
- MinDelay: 0,
- },
- },
- },
- })
-
- // verify if the configs are updated
- require.NoError(t, ValidateCCIPHomeConfigSetUp(
- e.Env.Logger,
- state.Chains[e.HomeChainSel].CapabilityRegistry,
- state.Chains[e.HomeChainSel].CCIPHome,
- newChain,
- ))
- replayBlocks, err := LatestBlocksByChain(testcontext.Get(t), e.Env.Chains)
- require.NoError(t, err)
-
- // Now configure the new chain using deployer key (not transferred to timelock yet).
- var offRampEnables []offramp.OffRampSourceChainConfigArgs
- for _, source := range initialDeploy {
- offRampEnables = append(offRampEnables, offramp.OffRampSourceChainConfigArgs{
- Router: state.Chains[newChain].Router.Address(),
- SourceChainSelector: source,
- IsEnabled: true,
- OnRamp: common.LeftPadBytes(state.Chains[source].OnRamp.Address().Bytes(), 32),
- })
- }
- tx, err := state.Chains[newChain].OffRamp.ApplySourceChainConfigUpdates(e.Env.Chains[newChain].DeployerKey, offRampEnables)
- require.NoError(t, err)
- _, err = deployment.ConfirmIfNoError(e.Env.Chains[newChain], tx, err)
- require.NoError(t, err)
- // Set the OCR3 config on new 4th chain to enable the plugin.
- latestDON, err := internal.LatestCCIPDON(state.Chains[e.HomeChainSel].CapabilityRegistry)
- require.NoError(t, err)
- ocrConfigs, err := internal.BuildSetOCR3ConfigArgs(latestDON.Id, state.Chains[e.HomeChainSel].CCIPHome, newChain)
- require.NoError(t, err)
- tx, err = state.Chains[newChain].OffRamp.SetOCR3Configs(e.Env.Chains[newChain].DeployerKey, ocrConfigs)
- require.NoError(t, err)
- _, err = deployment.ConfirmIfNoError(e.Env.Chains[newChain], tx, err)
- require.NoError(t, err)
-
- // Assert the inbound lanes to the new chain are wired correctly.
- state, err = LoadOnchainState(e.Env)
- require.NoError(t, err)
- for _, chain := range initialDeploy {
- cfg, err2 := state.Chains[chain].OnRamp.GetDestChainConfig(nil, newChain)
- require.NoError(t, err2)
- assert.Equal(t, cfg.Router, state.Chains[chain].TestRouter.Address())
- fqCfg, err2 := state.Chains[chain].FeeQuoter.GetDestChainConfig(nil, newChain)
- require.NoError(t, err2)
- assert.True(t, fqCfg.IsEnabled)
- s, err2 := state.Chains[newChain].OffRamp.GetSourceChainConfig(nil, chain)
- require.NoError(t, err2)
- assert.Equal(t, common.LeftPadBytes(state.Chains[chain].OnRamp.Address().Bytes(), 32), s.OnRamp)
- }
- // Ensure job related logs are up to date.
- time.Sleep(30 * time.Second)
- ReplayLogs(t, e.Env.Offchain, replayBlocks)
-
- // TODO: Send via all inbound lanes and use parallel helper
- // Now that the proposal has been executed we expect to be able to send traffic to this new 4th chain.
- latesthdr, err := e.Env.Chains[newChain].Client.HeaderByNumber(testcontext.Get(t), nil)
- require.NoError(t, err)
- startBlock := latesthdr.Number.Uint64()
- msgSentEvent := TestSendRequest(t, e.Env, state, initialDeploy[0], newChain, true, router.ClientEVM2AnyMessage{
- Receiver: common.LeftPadBytes(state.Chains[newChain].Receiver.Address().Bytes(), 32),
- Data: []byte("hello world"),
- TokenAmounts: nil,
- FeeToken: common.HexToAddress("0x0"),
- ExtraArgs: nil,
- })
- require.NoError(t,
- commonutils.JustError(ConfirmCommitWithExpectedSeqNumRange(t, e.Env.Chains[initialDeploy[0]], e.Env.Chains[newChain], state.Chains[newChain].OffRamp, &startBlock, cciptypes.SeqNumRange{
- cciptypes.SeqNum(1),
- cciptypes.SeqNum(msgSentEvent.SequenceNumber),
- }, true)))
- require.NoError(t,
- commonutils.JustError(
- ConfirmExecWithSeqNrs(
- t,
- e.Env.Chains[initialDeploy[0]],
- e.Env.Chains[newChain],
- state.Chains[newChain].OffRamp,
- &startBlock,
- []uint64{msgSentEvent.SequenceNumber},
- ),
- ),
- )
-
- linkAddress := state.Chains[newChain].LinkToken.Address()
- feeQuoter := state.Chains[newChain].FeeQuoter
- timestampedPrice, err := feeQuoter.GetTokenPrice(nil, linkAddress)
- require.NoError(t, err)
- require.Equal(t, MockLinkPrice, timestampedPrice.Value)
-}
diff --git a/deployment/ccip/changeset/cs_add_lane.go b/deployment/ccip/changeset/cs_add_lane.go
deleted file mode 100644
index 0bd03b56559..00000000000
--- a/deployment/ccip/changeset/cs_add_lane.go
+++ /dev/null
@@ -1,227 +0,0 @@
-package changeset
-
-import (
- "encoding/hex"
- "fmt"
- "math/big"
-
- "github.com/ethereum/go-ethereum/common"
- "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
-
- "github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
-)
-
-var _ deployment.ChangeSet[AddLanesConfig] = AddLanes
-
-type InitialPrices struct {
- LinkPrice *big.Int // USD to the power of 18 (e18) per LINK
- WethPrice *big.Int // USD to the power of 18 (e18) per WETH
- GasPrice *big.Int // uint224 packed gas price in USD (112 for exec // 112 for da)
-}
-
-func (p InitialPrices) Validate() error {
- if p.LinkPrice == nil {
- return fmt.Errorf("missing link price")
- }
- if p.WethPrice == nil {
- return fmt.Errorf("missing weth price")
- }
- if p.GasPrice == nil {
- return fmt.Errorf("missing gas price")
- }
- return nil
-}
-
-type LaneConfig struct {
- SourceSelector uint64
- DestSelector uint64
- InitialPricesBySource InitialPrices
- FeeQuoterDestChain fee_quoter.FeeQuoterDestChainConfig
- TestRouter bool
-}
-
-type AddLanesConfig struct {
- LaneConfigs []LaneConfig
-}
-
-func (c AddLanesConfig) Validate() error {
- for _, pair := range c.LaneConfigs {
- if pair.SourceSelector == pair.DestSelector {
- return fmt.Errorf("cannot add lane to the same chain")
- }
- if err := pair.InitialPricesBySource.Validate(); err != nil {
- return fmt.Errorf("error in validating initial prices for chain %d : %w", pair.SourceSelector, err)
- }
- // TODO: add more FeeQuoterDestChainConfigArgs validation
- if pair.FeeQuoterDestChain == (fee_quoter.FeeQuoterDestChainConfig{}) {
- return fmt.Errorf("missing fee quoter dest chain config")
- }
- }
- return nil
-}
-
-// AddLanes adds lanes between chains.
-// AddLanes is run while the contracts are still owned by the deployer.
-// This is useful to test the initial deployment to enable lanes between chains.
-// If the testrouter is enabled, the lanes can be used to send messages between chains with testrouter.
-// On successful verification with testrouter, the lanes can be enabled with the main router with different addLane ChangeSet.
-func AddLanes(e deployment.Environment, cfg AddLanesConfig) (deployment.ChangesetOutput, error) {
- if err := cfg.Validate(); err != nil {
- return deployment.ChangesetOutput{}, fmt.Errorf("invalid AddLanesConfig: %w", err)
- }
- newAddresses := deployment.NewMemoryAddressBook()
- err := addLanes(e, cfg)
- if err != nil {
- e.Logger.Errorw("Failed to add lanes", "err", err)
- return deployment.ChangesetOutput{}, err
- }
- return deployment.ChangesetOutput{
- Proposals: []timelock.MCMSWithTimelockProposal{},
- AddressBook: newAddresses,
- JobSpecs: nil,
- }, nil
-}
-
-var DefaultInitialPrices = InitialPrices{
- LinkPrice: deployment.E18Mult(20),
- WethPrice: deployment.E18Mult(4000),
- GasPrice: ToPackedFee(big.NewInt(8e14), big.NewInt(0)),
-}
-
-func addLanes(e deployment.Environment, cfg AddLanesConfig) error {
- state, err := LoadOnchainState(e)
- if err != nil {
- return fmt.Errorf("failed to load onchain state: %w", err)
- }
- for _, laneCfg := range cfg.LaneConfigs {
- e.Logger.Infow("Enabling lane with test router", "from", laneCfg.SourceSelector, "to", laneCfg.DestSelector)
- if err := addLane(e, state, laneCfg, laneCfg.TestRouter); err != nil {
- return err
- }
- }
- return nil
-}
-
-func addLane(e deployment.Environment, state CCIPOnChainState, config LaneConfig, isTestRouter bool) error {
- // TODO: Batch
- var fromRouter *router.Router
- var toRouter *router.Router
- from := config.SourceSelector
- to := config.DestSelector
- feeQuoterDestChainConfig := config.FeeQuoterDestChain
- initialPrices := config.InitialPricesBySource
- if isTestRouter {
- fromRouter = state.Chains[from].TestRouter
- toRouter = state.Chains[to].TestRouter
- } else {
- fromRouter = state.Chains[from].Router
- toRouter = state.Chains[to].Router
- }
- tx, err := fromRouter.ApplyRampUpdates(e.Chains[from].DeployerKey, []router.RouterOnRamp{
- {
- DestChainSelector: to,
- OnRamp: state.Chains[from].OnRamp.Address(),
- },
- }, []router.RouterOffRamp{}, []router.RouterOffRamp{})
- if _, err := deployment.ConfirmIfNoError(e.Chains[from], tx, err); err != nil {
- return err
- }
- tx, err = state.Chains[from].OnRamp.ApplyDestChainConfigUpdates(e.Chains[from].DeployerKey,
- []onramp.OnRampDestChainConfigArgs{
- {
- DestChainSelector: to,
- Router: fromRouter.Address(),
- },
- })
- if _, err := deployment.ConfirmIfNoError(e.Chains[from], tx, err); err != nil {
- return err
- }
-
- _, err = state.Chains[from].FeeQuoter.UpdatePrices(
- e.Chains[from].DeployerKey, fee_quoter.InternalPriceUpdates{
- TokenPriceUpdates: []fee_quoter.InternalTokenPriceUpdate{
- {
- SourceToken: state.Chains[from].LinkToken.Address(),
- UsdPerToken: initialPrices.LinkPrice,
- },
- {
- SourceToken: state.Chains[from].Weth9.Address(),
- UsdPerToken: initialPrices.WethPrice,
- },
- },
- GasPriceUpdates: []fee_quoter.InternalGasPriceUpdate{
- {
- DestChainSelector: to,
- UsdPerUnitGas: initialPrices.GasPrice,
- },
- }})
- if _, err := deployment.ConfirmIfNoError(e.Chains[from], tx, err); err != nil {
- return err
- }
-
- // Enable dest in fee quoter
- tx, err = state.Chains[from].FeeQuoter.ApplyDestChainConfigUpdates(e.Chains[from].DeployerKey,
- []fee_quoter.FeeQuoterDestChainConfigArgs{
- {
- DestChainSelector: to,
- DestChainConfig: feeQuoterDestChainConfig,
- },
- })
- if _, err := deployment.ConfirmIfNoError(e.Chains[from], tx, err); err != nil {
- return err
- }
-
- tx, err = state.Chains[to].OffRamp.ApplySourceChainConfigUpdates(e.Chains[to].DeployerKey,
- []offramp.OffRampSourceChainConfigArgs{
- {
- Router: toRouter.Address(),
- SourceChainSelector: from,
- IsEnabled: true,
- OnRamp: common.LeftPadBytes(state.Chains[from].OnRamp.Address().Bytes(), 32),
- },
- })
- if _, err := deployment.ConfirmIfNoError(e.Chains[to], tx, err); err != nil {
- return err
- }
- tx, err = toRouter.ApplyRampUpdates(e.Chains[to].DeployerKey, []router.RouterOnRamp{}, []router.RouterOffRamp{}, []router.RouterOffRamp{
- {
- SourceChainSelector: from,
- OffRamp: state.Chains[to].OffRamp.Address(),
- },
- })
- _, err = deployment.ConfirmIfNoError(e.Chains[to], tx, err)
- return err
-}
-
-func DefaultFeeQuoterDestChainConfig() fee_quoter.FeeQuoterDestChainConfig {
- // https://github.com/smartcontractkit/ccip/blob/c4856b64bd766f1ddbaf5d13b42d3c4b12efde3a/contracts/src/v0.8/ccip/libraries/Internal.sol#L337-L337
- /*
- ```Solidity
- // bytes4(keccak256("CCIP ChainFamilySelector EVM"))
- bytes4 public constant CHAIN_FAMILY_SELECTOR_EVM = 0x2812d52c;
- ```
- */
- evmFamilySelector, _ := hex.DecodeString("2812d52c")
- return fee_quoter.FeeQuoterDestChainConfig{
- IsEnabled: true,
- MaxNumberOfTokensPerMsg: 10,
- MaxDataBytes: 256,
- MaxPerMsgGasLimit: 3_000_000,
- DestGasOverhead: ccipevm.DestGasOverhead,
- DefaultTokenFeeUSDCents: 1,
- DestGasPerPayloadByte: ccipevm.CalldataGasPerByte,
- DestDataAvailabilityOverheadGas: 100,
- DestGasPerDataAvailabilityByte: 100,
- DestDataAvailabilityMultiplierBps: 1,
- DefaultTokenDestGasOverhead: 125_000,
- DefaultTxGasLimit: 200_000,
- GasMultiplierWeiPerEth: 11e17, // Gas multiplier in wei per eth is scaled by 1e18, so 11e17 is 1.1 = 110%
- NetworkFeeUSDCents: 1,
- ChainFamilySelector: [4]byte(evmFamilySelector),
- }
-}
diff --git a/deployment/ccip/changeset/cs_add_lane_test.go b/deployment/ccip/changeset/cs_add_lane_test.go
index 7f1374a1725..e793c1866d9 100644
--- a/deployment/ccip/changeset/cs_add_lane_test.go
+++ b/deployment/ccip/changeset/cs_add_lane_test.go
@@ -1,21 +1,21 @@
package changeset
import (
+ "math/big"
"testing"
- "time"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
- commonutils "github.com/smartcontractkit/chainlink-common/pkg/utils"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
- "github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp"
+ commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
)
func TestAddLanesWithTestRouter(t *testing.T) {
+ t.Parallel()
e := NewMemoryEnvironment(t)
// Here we have CR + nodes set up, but no CCIP contracts deployed.
state, err := LoadOnchainState(e.Env)
@@ -24,14 +24,79 @@ func TestAddLanesWithTestRouter(t *testing.T) {
selectors := e.Env.AllChainSelectors()
chain1, chain2 := selectors[0], selectors[1]
- _, err = AddLanes(e.Env, AddLanesConfig{
- LaneConfigs: []LaneConfig{
- {
- SourceSelector: chain1,
- DestSelector: chain2,
- InitialPricesBySource: DefaultInitialPrices,
- FeeQuoterDestChain: DefaultFeeQuoterDestChainConfig(),
- TestRouter: true,
+ stateChain1 := state.Chains[chain1]
+ e.Env, err = commoncs.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commoncs.ChangesetApplication{
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateOnRampsDests),
+ Config: UpdateOnRampDestsConfig{
+ UpdatesByChain: map[uint64]map[uint64]OnRampDestinationUpdate{
+ chain1: {
+ chain2: {
+ IsEnabled: true,
+ TestRouter: true,
+ AllowListEnabled: false,
+ },
+ },
+ },
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateFeeQuoterPricesCS),
+ Config: UpdateFeeQuoterPricesConfig{
+ PricesByChain: map[uint64]FeeQuoterPriceUpdatePerSource{
+ chain1: {
+ TokenPrices: map[common.Address]*big.Int{
+ stateChain1.LinkToken.Address(): DefaultLinkPrice,
+ stateChain1.Weth9.Address(): DefaultWethPrice,
+ },
+ GasPrices: map[uint64]*big.Int{
+ chain2: DefaultGasPrice,
+ },
+ },
+ },
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateFeeQuoterDests),
+ Config: UpdateFeeQuoterDestsConfig{
+ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{
+ chain1: {
+ chain2: DefaultFeeQuoterDestChainConfig(),
+ },
+ },
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateOffRampSources),
+ Config: UpdateOffRampSourcesConfig{
+ UpdatesByChain: map[uint64]map[uint64]OffRampSourceUpdate{
+ chain2: {
+ chain1: {
+ IsEnabled: true,
+ TestRouter: true,
+ },
+ },
+ },
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateRouterRamps),
+ Config: UpdateRouterRampsConfig{
+ TestRouter: true,
+ UpdatesByChain: map[uint64]RouterUpdates{
+ // onRamp update on source chain
+ chain1: {
+ OnRampUpdates: map[uint64]bool{
+ chain2: true,
+ },
+ },
+ // offramp update on dest chain
+ chain2: {
+ OffRampUpdates: map[uint64]bool{
+ chain1: true,
+ },
+ },
+ },
},
},
})
@@ -57,142 +122,3 @@ func TestAddLanesWithTestRouter(t *testing.T) {
}] = []uint64{msgSentEvent.SequenceNumber}
ConfirmExecWithSeqNrsForAll(t, e.Env, state, expectedSeqNumExec, startBlocks)
}
-
-// TestAddLane covers the workflow of adding a lane between two chains and enabling it.
-// It also covers the case where the onRamp is disabled on the OffRamp contract initially and then enabled.
-func TestAddLane(t *testing.T) {
- t.Skip("This test is flaky and needs to be fixed: reverted," +
- "error reason: 0x07da6ee6 InsufficientFeeTokenAmount: Replace time.sleep() with polling")
-
- t.Parallel()
- // We add more chains to the chainlink nodes than the number of chains where CCIP is deployed.
- e := NewMemoryEnvironment(t)
- // Here we have CR + nodes set up, but no CCIP contracts deployed.
- state, err := LoadOnchainState(e.Env)
- require.NoError(t, err)
-
- selectors := e.Env.AllChainSelectors()
- chain1, chain2 := selectors[0], selectors[1]
-
- // We expect no lanes available on any chain.
- for _, sel := range []uint64{chain1, chain2} {
- chain := state.Chains[sel]
- offRamps, err := chain.Router.GetOffRamps(nil)
- require.NoError(t, err)
- require.Len(t, offRamps, 0)
- }
-
- replayBlocks, err := LatestBlocksByChain(testcontext.Get(t), e.Env.Chains)
- require.NoError(t, err)
-
- // Add one lane from chain1 to chain 2 and send traffic.
- require.NoError(t, AddLaneWithDefaultPricesAndFeeQuoterConfig(e.Env, state, chain1, chain2, false))
-
- ReplayLogs(t, e.Env.Offchain, replayBlocks)
- time.Sleep(30 * time.Second)
- // disable the onRamp initially on OffRamp
- disableRampTx, err := state.Chains[chain2].OffRamp.ApplySourceChainConfigUpdates(e.Env.Chains[chain2].DeployerKey, []offramp.OffRampSourceChainConfigArgs{
- {
- Router: state.Chains[chain2].Router.Address(),
- SourceChainSelector: chain1,
- IsEnabled: false,
- OnRamp: common.LeftPadBytes(state.Chains[chain1].OnRamp.Address().Bytes(), 32),
- },
- })
- _, err = deployment.ConfirmIfNoError(e.Env.Chains[chain2], disableRampTx, err)
- require.NoError(t, err)
-
- for _, sel := range []uint64{chain1, chain2} {
- chain := state.Chains[sel]
- offRamps, err := chain.Router.GetOffRamps(nil)
- require.NoError(t, err)
- if sel == chain2 {
- require.Len(t, offRamps, 1)
- srcCfg, err := chain.OffRamp.GetSourceChainConfig(nil, chain1)
- require.NoError(t, err)
- require.Equal(t, common.LeftPadBytes(state.Chains[chain1].OnRamp.Address().Bytes(), 32), srcCfg.OnRamp)
- require.False(t, srcCfg.IsEnabled)
- } else {
- require.Len(t, offRamps, 0)
- }
- }
-
- latesthdr, err := e.Env.Chains[chain2].Client.HeaderByNumber(testcontext.Get(t), nil)
- require.NoError(t, err)
- startBlock := latesthdr.Number.Uint64()
- // Send traffic on the first lane and it should not be processed by the plugin as onRamp is disabled
- // we will check this by confirming that the message is not executed by the end of the test
- msgSentEvent1 := TestSendRequest(t, e.Env, state, chain1, chain2, false, router.ClientEVM2AnyMessage{
- Receiver: common.LeftPadBytes(state.Chains[chain2].Receiver.Address().Bytes(), 32),
- Data: []byte("hello world"),
- TokenAmounts: nil,
- FeeToken: common.HexToAddress("0x0"),
- ExtraArgs: nil,
- })
- require.Equal(t, uint64(1), msgSentEvent1.SequenceNumber)
-
- // Add another lane
- require.NoError(t, AddLaneWithDefaultPricesAndFeeQuoterConfig(e.Env, state, chain2, chain1, false))
-
- // Send traffic on the second lane and it should succeed
- latesthdr, err = e.Env.Chains[chain1].Client.HeaderByNumber(testcontext.Get(t), nil)
- require.NoError(t, err)
- startBlock2 := latesthdr.Number.Uint64()
- msgSentEvent2 := TestSendRequest(t, e.Env, state, chain2, chain1, false, router.ClientEVM2AnyMessage{
- Receiver: common.LeftPadBytes(state.Chains[chain2].Receiver.Address().Bytes(), 32),
- Data: []byte("hello world"),
- TokenAmounts: nil,
- FeeToken: common.HexToAddress("0x0"),
- ExtraArgs: nil,
- })
- require.Equal(t, uint64(1), msgSentEvent2.SequenceNumber)
- require.NoError(t,
- commonutils.JustError(
- ConfirmExecWithSeqNrs(
- t,
- e.Env.Chains[chain2],
- e.Env.Chains[chain1],
- state.Chains[chain1].OffRamp,
- &startBlock2,
- []uint64{msgSentEvent2.SequenceNumber},
- ),
- ),
- )
-
- // now check for the previous message from chain 1 to chain 2 that it has not been executed till now as the onRamp was disabled
- ConfirmNoExecConsistentlyWithSeqNr(t, e.Env.Chains[chain1], e.Env.Chains[chain2], state.Chains[chain2].OffRamp, msgSentEvent1.SequenceNumber, 30*time.Second)
-
- // enable the onRamp on OffRamp
- enableRampTx, err := state.Chains[chain2].OffRamp.ApplySourceChainConfigUpdates(e.Env.Chains[chain2].DeployerKey, []offramp.OffRampSourceChainConfigArgs{
- {
- Router: state.Chains[chain2].Router.Address(),
- SourceChainSelector: chain1,
- IsEnabled: true,
- OnRamp: common.LeftPadBytes(state.Chains[chain1].OnRamp.Address().Bytes(), 32),
- },
- })
- _, err = deployment.ConfirmIfNoError(e.Env.Chains[chain2], enableRampTx, err)
- require.NoError(t, err)
-
- srcCfg, err := state.Chains[chain2].OffRamp.GetSourceChainConfig(nil, chain1)
- require.NoError(t, err)
- require.Equal(t, common.LeftPadBytes(state.Chains[chain1].OnRamp.Address().Bytes(), 32), srcCfg.OnRamp)
- require.True(t, srcCfg.IsEnabled)
-
- // we need the replay here otherwise plugin is not able to locate the message
- ReplayLogs(t, e.Env.Offchain, replayBlocks)
- time.Sleep(30 * time.Second)
- // Now that the onRamp is enabled, the request should be processed
- require.NoError(t,
- commonutils.JustError(
- ConfirmExecWithSeqNrs(
- t,
- e.Env.Chains[chain1],
- e.Env.Chains[chain2],
- state.Chains[chain2].OffRamp,
- &startBlock,
- []uint64{msgSentEvent1.SequenceNumber},
- ),
- ),
- )
-}
diff --git a/deployment/ccip/changeset/cs_ccip_home.go b/deployment/ccip/changeset/cs_ccip_home.go
index 202d4216b60..0c82afee261 100644
--- a/deployment/ccip/changeset/cs_ccip_home.go
+++ b/deployment/ccip/changeset/cs_ccip_home.go
@@ -1,9 +1,12 @@
package changeset
import (
- "context"
+ "bytes"
+ "encoding/hex"
"fmt"
"math/big"
+ "os"
+ "time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
@@ -11,36 +14,174 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
+ "github.com/smartcontractkit/chainlink-ccip/chainconfig"
+ "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
+ "github.com/smartcontractkit/chainlink-ccip/pluginconfig"
+ "github.com/smartcontractkit/chainlink-common/pkg/config"
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+ "github.com/smartcontractkit/chainlink-common/pkg/merklemulti"
+
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
+ commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset"
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
var (
- _ deployment.ChangeSet[PromoteAllCandidatesChangesetConfig] = PromoteAllCandidatesChangeset
- _ deployment.ChangeSet[AddDonAndSetCandidateChangesetConfig] = SetCandidatePluginChangeset
+ _ deployment.ChangeSet[AddDonAndSetCandidateChangesetConfig] = AddDonAndSetCandidateChangeset
+ _ deployment.ChangeSet[PromoteCandidatesChangesetConfig] = PromoteAllCandidatesChangeset
+ _ deployment.ChangeSet[SetCandidateChangesetConfig] = SetCandidateChangeset
+ _ deployment.ChangeSet[RevokeCandidateChangesetConfig] = RevokeCandidateChangeset
+ _ deployment.ChangeSet[UpdateChainConfigConfig] = UpdateChainConfig
)
-type PromoteAllCandidatesChangesetConfig struct {
+type CCIPOCRParams struct {
+ OCRParameters commontypes.OCRParameters
+ // Note contains pointers to Arb feeds for prices
+ CommitOffChainConfig pluginconfig.CommitOffchainConfig
+ // Note ontains USDC config
+ ExecuteOffChainConfig pluginconfig.ExecuteOffchainConfig
+}
+
+func (c CCIPOCRParams) Validate() error {
+ if err := c.OCRParameters.Validate(); err != nil {
+ return fmt.Errorf("invalid OCR parameters: %w", err)
+ }
+ if err := c.CommitOffChainConfig.Validate(); err != nil {
+ return fmt.Errorf("invalid commit off-chain config: %w", err)
+ }
+ if err := c.ExecuteOffChainConfig.Validate(); err != nil {
+ return fmt.Errorf("invalid execute off-chain config: %w", err)
+ }
+ return nil
+}
+
+// DefaultOCRParams returns the default OCR parameters for a chain,
+// except for a few values which must be parameterized (passed as arguments).
+func DefaultOCRParams(
+ feedChainSel uint64,
+ tokenInfo map[ccipocr3.UnknownEncodedAddress]pluginconfig.TokenInfo,
+ tokenDataObservers []pluginconfig.TokenDataObserverConfig,
+) CCIPOCRParams {
+ return CCIPOCRParams{
+ OCRParameters: commontypes.OCRParameters{
+ DeltaProgress: internal.DeltaProgress,
+ DeltaResend: internal.DeltaResend,
+ DeltaInitial: internal.DeltaInitial,
+ DeltaRound: internal.DeltaRound,
+ DeltaGrace: internal.DeltaGrace,
+ DeltaCertifiedCommitRequest: internal.DeltaCertifiedCommitRequest,
+ DeltaStage: internal.DeltaStage,
+ Rmax: internal.Rmax,
+ MaxDurationQuery: internal.MaxDurationQuery,
+ MaxDurationObservation: internal.MaxDurationObservation,
+ MaxDurationShouldAcceptAttestedReport: internal.MaxDurationShouldAcceptAttestedReport,
+ MaxDurationShouldTransmitAcceptedReport: internal.MaxDurationShouldTransmitAcceptedReport,
+ },
+ ExecuteOffChainConfig: pluginconfig.ExecuteOffchainConfig{
+ BatchGasLimit: internal.BatchGasLimit,
+ RelativeBoostPerWaitHour: internal.RelativeBoostPerWaitHour,
+ InflightCacheExpiry: *config.MustNewDuration(internal.InflightCacheExpiry),
+ RootSnoozeTime: *config.MustNewDuration(internal.RootSnoozeTime),
+ MessageVisibilityInterval: *config.MustNewDuration(internal.FirstBlockAge),
+ BatchingStrategyID: internal.BatchingStrategyID,
+ TokenDataObservers: tokenDataObservers,
+ },
+ CommitOffChainConfig: pluginconfig.CommitOffchainConfig{
+ RemoteGasPriceBatchWriteFrequency: *config.MustNewDuration(internal.RemoteGasPriceBatchWriteFrequency),
+ TokenPriceBatchWriteFrequency: *config.MustNewDuration(internal.TokenPriceBatchWriteFrequency),
+ TokenInfo: tokenInfo,
+ PriceFeedChainSelector: ccipocr3.ChainSelector(feedChainSel),
+ NewMsgScanBatchSize: merklemulti.MaxNumberTreeLeaves,
+ MaxReportTransmissionCheckAttempts: 5,
+ RMNEnabled: os.Getenv("ENABLE_RMN") == "true", // only enabled in manual test
+ RMNSignaturesTimeout: 30 * time.Minute,
+ MaxMerkleTreeSize: merklemulti.MaxNumberTreeLeaves,
+ SignObservationPrefix: "chainlink ccip 1.6 rmn observation",
+ },
+ }
+}
+
+type PromoteCandidatesChangesetConfig struct {
HomeChainSelector uint64
- // DONChainSelector is the chain selector of the DON that we want to promote the candidate config of.
+
+ // RemoteChainSelectors is the chain selector of the DONs that we want to promote the candidate config of.
// Note that each (chain, ccip capability version) pair has a unique DON ID.
- DONChainSelector uint64
- NodeIDs []string
- MCMS *MCMSConfig
+ RemoteChainSelectors []uint64
+
+ PluginType types.PluginType
+ // MCMS is optional MCMS configuration, if provided the changeset will generate an MCMS proposal.
+ // If nil, the changeset will execute the commands directly using the deployer key
+ // of the provided environment.
+ MCMS *MCMSConfig
}
-func (p PromoteAllCandidatesChangesetConfig) Validate(e deployment.Environment, state CCIPOnChainState) (deployment.Nodes, error) {
+func (p PromoteCandidatesChangesetConfig) Validate(e deployment.Environment) ([]uint32, error) {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return nil, err
+ }
if err := deployment.IsValidChainSelector(p.HomeChainSelector); err != nil {
return nil, fmt.Errorf("home chain selector invalid: %w", err)
}
- if err := deployment.IsValidChainSelector(p.DONChainSelector); err != nil {
- return nil, fmt.Errorf("don chain selector invalid: %w", err)
+ homeChainState, exists := state.Chains[p.HomeChainSelector]
+ if !exists {
+ return nil, fmt.Errorf("home chain %d does not exist", p.HomeChainSelector)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), p.MCMS != nil, e.Chains[p.HomeChainSelector].DeployerKey.From, homeChainState.Timelock.Address(), homeChainState.CapabilityRegistry); err != nil {
+ return nil, err
}
- if len(p.NodeIDs) == 0 {
+
+ if p.PluginType != types.PluginTypeCCIPCommit &&
+ p.PluginType != types.PluginTypeCCIPExec {
+ return nil, fmt.Errorf("PluginType must be set to either CCIPCommit or CCIPExec")
+ }
+
+ var donIDs []uint32
+ for _, chainSelector := range p.RemoteChainSelectors {
+ if err := deployment.IsValidChainSelector(chainSelector); err != nil {
+ return nil, fmt.Errorf("don chain selector invalid: %w", err)
+ }
+ chainState, exists := state.Chains[chainSelector]
+ if !exists {
+ return nil, fmt.Errorf("chain %d does not exist", chainSelector)
+ }
+ if chainState.OffRamp == nil {
+ // should not be possible, but a defensive check.
+ return nil, fmt.Errorf("OffRamp contract does not exist")
+ }
+
+ donID, err := internal.DonIDForChain(
+ state.Chains[p.HomeChainSelector].CapabilityRegistry,
+ state.Chains[p.HomeChainSelector].CCIPHome,
+ chainSelector,
+ )
+ if err != nil {
+ return nil, fmt.Errorf("fetch don id for chain: %w", err)
+ }
+ if donID == 0 {
+ return nil, fmt.Errorf("don doesn't exist in CR for chain %d", chainSelector)
+ }
+ // Check that candidate digest and active digest are not both zero - this is enforced onchain.
+ pluginConfigs, err := state.Chains[p.HomeChainSelector].CCIPHome.GetAllConfigs(&bind.CallOpts{
+ Context: e.GetContext(),
+ }, donID, uint8(p.PluginType))
+ if err != nil {
+ return nil, fmt.Errorf("fetching %s configs from cciphome: %w", p.PluginType.String(), err)
+ }
+
+ if pluginConfigs.ActiveConfig.ConfigDigest == [32]byte{} &&
+ pluginConfigs.CandidateConfig.ConfigDigest == [32]byte{} {
+ return nil, fmt.Errorf("%s active and candidate config digests are both zero", p.PluginType.String())
+ }
+ donIDs = append(donIDs, donID)
+ }
+ if len(e.NodeIDs) == 0 {
return nil, fmt.Errorf("NodeIDs must be set")
}
if state.Chains[p.HomeChainSelector].CCIPHome == nil {
@@ -50,88 +191,276 @@ func (p PromoteAllCandidatesChangesetConfig) Validate(e deployment.Environment,
return nil, fmt.Errorf("CapabilityRegistry contract does not exist")
}
- nodes, err := deployment.NodeInfo(p.NodeIDs, e.Offchain)
+ return donIDs, nil
+}
+
+// PromoteAllCandidatesChangeset generates a proposal to call promoteCandidate on the CCIPHome through CapReg.
+// Note that a DON must exist prior to being able to use this changeset effectively,
+// i.e AddDonAndSetCandidateChangeset must be called first.
+// This can also be used to promote a 0x0 candidate config to be the active, effectively shutting down the DON.
+// At that point you can call the RemoveDON changeset to remove the DON entirely from the capability registry.
+func PromoteAllCandidatesChangeset(
+ e deployment.Environment,
+ cfg PromoteCandidatesChangesetConfig,
+) (deployment.ChangesetOutput, error) {
+ donIDs, err := cfg.Validate(e)
if err != nil {
- return nil, fmt.Errorf("fetch node info: %w", err)
+ return deployment.ChangesetOutput{}, fmt.Errorf("%w: %w", deployment.ErrInvalidConfig, err)
+ }
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
}
- donID, err := internal.DonIDForChain(
- state.Chains[p.HomeChainSelector].CapabilityRegistry,
- state.Chains[p.HomeChainSelector].CCIPHome,
- p.DONChainSelector,
- )
+ nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain)
if err != nil {
- return nil, fmt.Errorf("fetch don id for chain: %w", err)
+ return deployment.ChangesetOutput{}, fmt.Errorf("fetch node info: %w", err)
}
- if donID == 0 {
- return nil, fmt.Errorf("don doesn't exist in CR for chain %d", p.DONChainSelector)
+
+ txOpts := e.Chains[cfg.HomeChainSelector].DeployerKey
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
}
- // Check that candidate digest and active digest are not both zero - this is enforced onchain.
- commitConfigs, err := state.Chains[p.HomeChainSelector].CCIPHome.GetAllConfigs(&bind.CallOpts{
- Context: context.Background(),
- }, donID, uint8(cctypes.PluginTypeCCIPCommit))
- if err != nil {
- return nil, fmt.Errorf("fetching commit configs from cciphome: %w", err)
+ homeChain := e.Chains[cfg.HomeChainSelector]
+
+ var ops []mcms.Operation
+ for _, donID := range donIDs {
+ promoteCandidateOps, err := promoteAllCandidatesForChainOps(
+ txOpts,
+ homeChain,
+ state.Chains[cfg.HomeChainSelector].CapabilityRegistry,
+ state.Chains[cfg.HomeChainSelector].CCIPHome,
+ nodes.NonBootstraps(),
+ donID,
+ cfg.PluginType,
+ cfg.MCMS != nil,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("generating promote candidate ops: %w", err)
+ }
+ ops = append(ops, promoteCandidateOps)
}
- execConfigs, err := state.Chains[p.HomeChainSelector].CCIPHome.GetAllConfigs(&bind.CallOpts{
- Context: context.Background(),
- }, donID, uint8(cctypes.PluginTypeCCIPExec))
+ // Disabled MCMS means that we already executed the txes, so just return early w/out the proposals.
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ prop, err := proposalutils.BuildProposalFromBatches(
+ map[uint64]common.Address{
+ cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(),
+ },
+ map[uint64]*gethwrappers.ManyChainMultiSig{
+ cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm,
+ },
+ []timelock.BatchChainOperation{{
+ ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector),
+ Batch: ops,
+ }},
+ "promoteCandidate for commit and execution",
+ cfg.MCMS.MinDelay,
+ )
if err != nil {
- return nil, fmt.Errorf("fetching exec configs from cciphome: %w", err)
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{
+ Proposals: []timelock.MCMSWithTimelockProposal{
+ *prop,
+ },
+ }, nil
+}
+
+// SetCandidateConfigBase is a common base config struct for AddDonAndSetCandidateChangesetConfig and SetCandidateChangesetConfig.
+// This is extracted to deduplicate most of the validation logic.
+// Remaining validation logic is done in the specific config structs that inherit from this.
+type SetCandidateConfigBase struct {
+ HomeChainSelector uint64
+ FeedChainSelector uint64
+
+ // OCRConfigPerRemoteChainSelector is the chain selector of the chain where the DON will be added.
+ OCRConfigPerRemoteChainSelector map[uint64]CCIPOCRParams
+
+ // Only set one plugin at a time. TODO
+ // come back and allow both.
+ PluginType types.PluginType
+
+ // MCMS is optional MCMS configuration, if provided the changeset will generate an MCMS proposal.
+ // If nil, the changeset will execute the commands directly using the deployer key
+ // of the provided environment.
+ MCMS *MCMSConfig
+}
+
+func (s SetCandidateConfigBase) Validate(e deployment.Environment, state CCIPOnChainState) error {
+ if err := deployment.IsValidChainSelector(s.HomeChainSelector); err != nil {
+ return fmt.Errorf("home chain selector invalid: %w", err)
+ }
+ if err := deployment.IsValidChainSelector(s.FeedChainSelector); err != nil {
+ return fmt.Errorf("feed chain selector invalid: %w", err)
+ }
+ homeChainState, exists := state.Chains[s.HomeChainSelector]
+ if !exists {
+ return fmt.Errorf("home chain %d does not exist", s.HomeChainSelector)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), s.MCMS != nil, e.Chains[s.HomeChainSelector].DeployerKey.From, homeChainState.Timelock.Address(), homeChainState.CapabilityRegistry); err != nil {
+ return err
+ }
+
+ for chainSelector, params := range s.OCRConfigPerRemoteChainSelector {
+ if err := deployment.IsValidChainSelector(chainSelector); err != nil {
+ return fmt.Errorf("don chain selector invalid: %w", err)
+ }
+ if state.Chains[chainSelector].OffRamp == nil {
+ // should not be possible, but a defensive check.
+ return fmt.Errorf("OffRamp contract does not exist on don chain selector %d", chainSelector)
+ }
+ if s.PluginType != types.PluginTypeCCIPCommit &&
+ s.PluginType != types.PluginTypeCCIPExec {
+ return fmt.Errorf("PluginType must be set to either CCIPCommit or CCIPExec")
+ }
+
+ // no donID check since this config is used for both adding a new DON and updating an existing one.
+ // see AddDonAndSetCandidateChangesetConfig.Validate and SetCandidateChangesetConfig.Validate
+ // for these checks.
+ // check that chain config is set up for the new chain
+ chainConfig, err := state.Chains[s.HomeChainSelector].CCIPHome.GetChainConfig(nil, chainSelector)
+ if err != nil {
+ return fmt.Errorf("get all chain configs: %w", err)
+ }
+ // FChain should never be zero if a chain config is set in CCIPHome
+ if chainConfig.FChain == 0 {
+ return fmt.Errorf("chain config not set up for new chain %d", chainSelector)
+ }
+ err = params.Validate()
+ if err != nil {
+ return fmt.Errorf("invalid ccip ocr params: %w", err)
+ }
+
+ // TODO: validate token config in the commit config, if commit is the plugin.
+ // TODO: validate gas config in the chain config in cciphome for this RemoteChainSelectors.
+ }
+ if len(e.NodeIDs) == 0 {
+ return fmt.Errorf("nodeIDs must be set")
+ }
+ if state.Chains[s.HomeChainSelector].CCIPHome == nil {
+ return fmt.Errorf("CCIPHome contract does not exist")
+ }
+ if state.Chains[s.HomeChainSelector].CapabilityRegistry == nil {
+ return fmt.Errorf("CapabilityRegistry contract does not exist")
}
- if commitConfigs.ActiveConfig.ConfigDigest == [32]byte{} &&
- commitConfigs.CandidateConfig.ConfigDigest == [32]byte{} {
- return nil, fmt.Errorf("commit active and candidate config digests are both zero")
+ if e.OCRSecrets.IsEmpty() {
+ return fmt.Errorf("OCR secrets must be set")
}
- if execConfigs.ActiveConfig.ConfigDigest == [32]byte{} &&
- execConfigs.CandidateConfig.ConfigDigest == [32]byte{} {
- return nil, fmt.Errorf("exec active and candidate config digests are both zero")
+ return nil
+}
+
+// AddDonAndSetCandidateChangesetConfig is a separate config struct
+// because the validation is slightly different from SetCandidateChangesetConfig.
+// In particular, we check to make sure we don't already have a DON for the chain.
+type AddDonAndSetCandidateChangesetConfig struct {
+ SetCandidateConfigBase
+}
+
+func (a AddDonAndSetCandidateChangesetConfig) Validate(e deployment.Environment, state CCIPOnChainState) error {
+ err := a.SetCandidateConfigBase.Validate(e, state)
+ if err != nil {
+ return err
}
- return nodes, nil
+ for chainSelector := range a.OCRConfigPerRemoteChainSelector {
+ // check if a DON already exists for this chain
+ donID, err := internal.DonIDForChain(
+ state.Chains[a.HomeChainSelector].CapabilityRegistry,
+ state.Chains[a.HomeChainSelector].CCIPHome,
+ chainSelector,
+ )
+ if err != nil {
+ return fmt.Errorf("fetch don id for chain: %w", err)
+ }
+ if donID != 0 {
+ return fmt.Errorf("don already exists in CR for chain %d, it has id %d", chainSelector, donID)
+ }
+ }
+
+ return nil
}
-// PromoteAllCandidatesChangeset generates a proposal to call promoteCandidate on the CCIPHome through CapReg.
-// This needs to be called after SetCandidateProposal is executed.
-func PromoteAllCandidatesChangeset(
+// AddDonAndSetCandidateChangeset adds new DON for destination to home chain
+// and sets the plugin config as candidateConfig for the don.
+//
+// This is the first step to creating a CCIP DON and must be executed before any
+// other changesets (SetCandidateChangeset, PromoteAllCandidatesChangeset)
+// can be executed.
+//
+// Note that these operations must be done together because the createDON call
+// in the capability registry calls the capability config contract, so we must
+// provide suitable calldata for CCIPHome.
+func AddDonAndSetCandidateChangeset(
e deployment.Environment,
- cfg PromoteAllCandidatesChangesetConfig,
+ cfg AddDonAndSetCandidateChangesetConfig,
) (deployment.ChangesetOutput, error) {
state, err := LoadOnchainState(e)
if err != nil {
return deployment.ChangesetOutput{}, err
}
- nodes, err := cfg.Validate(e, state)
+ err = cfg.Validate(e, state)
if err != nil {
return deployment.ChangesetOutput{}, fmt.Errorf("%w: %w", deployment.ErrInvalidConfig, err)
}
+ nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("get node info: %w", err)
+ }
+
txOpts := e.Chains[cfg.HomeChainSelector].DeployerKey
if cfg.MCMS != nil {
txOpts = deployment.SimTransactOpts()
}
+ var donOps []mcms.Operation
+ for chainSelector, params := range cfg.OCRConfigPerRemoteChainSelector {
+ newDONArgs, err := internal.BuildOCR3ConfigForCCIPHome(
+ e.OCRSecrets,
+ state.Chains[chainSelector].OffRamp,
+ e.Chains[chainSelector],
+ nodes.NonBootstraps(),
+ state.Chains[cfg.HomeChainSelector].RMNHome.Address(),
+ params.OCRParameters,
+ params.CommitOffChainConfig,
+ params.ExecuteOffChainConfig,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
- homeChain := e.Chains[cfg.HomeChainSelector]
+ latestDon, err := internal.LatestCCIPDON(state.Chains[cfg.HomeChainSelector].CapabilityRegistry)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
- promoteCandidateOps, err := promoteAllCandidatesForChainOps(
- homeChain,
- txOpts,
- state.Chains[cfg.HomeChainSelector].CapabilityRegistry,
- state.Chains[cfg.HomeChainSelector].CCIPHome,
- cfg.DONChainSelector,
- nodes.NonBootstraps(),
- cfg.MCMS != nil,
- )
- if err != nil {
- return deployment.ChangesetOutput{}, fmt.Errorf("generating promote candidate ops: %w", err)
- }
+ pluginOCR3Config, ok := newDONArgs[cfg.PluginType]
+ if !ok {
+ return deployment.ChangesetOutput{}, fmt.Errorf("missing commit plugin in ocr3Configs")
+ }
- // Disabled MCMS means that we already executed the txes, so just return early w/out the proposals.
+ expectedDonID := latestDon.Id + 1
+ addDonOp, err := newDonWithCandidateOp(
+ txOpts,
+ e.Chains[cfg.HomeChainSelector],
+ expectedDonID,
+ pluginOCR3Config,
+ state.Chains[cfg.HomeChainSelector].CapabilityRegistry,
+ nodes.NonBootstraps(),
+ cfg.MCMS != nil,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ donOps = append(donOps, addDonOp)
+ }
if cfg.MCMS == nil {
return deployment.ChangesetOutput{}, nil
}
@@ -145,83 +474,180 @@ func PromoteAllCandidatesChangeset(
},
[]timelock.BatchChainOperation{{
ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector),
- Batch: promoteCandidateOps,
+ Batch: donOps,
}},
- "promoteCandidate for commit and execution",
+ fmt.Sprintf("addDON on new Chain && setCandidate for plugin %s", cfg.PluginType.String()),
cfg.MCMS.MinDelay,
)
if err != nil {
- return deployment.ChangesetOutput{}, err
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal from batch: %w", err)
}
+
return deployment.ChangesetOutput{
- Proposals: []timelock.MCMSWithTimelockProposal{
- *prop,
+ Proposals: []timelock.MCMSWithTimelockProposal{*prop},
+ }, nil
+}
+
+// newDonWithCandidateOp sets the candidate commit config by calling setCandidate on CCIPHome contract through the AddDON call on CapReg contract
+// This should be done first before calling any other UpdateDON calls
+// This proposes to set up OCR3 config for the commit plugin for the DON
+func newDonWithCandidateOp(
+ txOpts *bind.TransactOpts,
+ homeChain deployment.Chain,
+ donID uint32,
+ pluginConfig ccip_home.CCIPHomeOCR3Config,
+ capReg *capabilities_registry.CapabilitiesRegistry,
+ nodes deployment.Nodes,
+ mcmsEnabled bool,
+) (mcms.Operation, error) {
+ encodedSetCandidateCall, err := internal.CCIPHomeABI.Pack(
+ "setCandidate",
+ donID,
+ pluginConfig.PluginType,
+ pluginConfig,
+ [32]byte{},
+ )
+ if err != nil {
+ return mcms.Operation{}, fmt.Errorf("pack set candidate call: %w", err)
+ }
+
+ addDonTx, err := capReg.AddDON(
+ txOpts,
+ nodes.PeerIDs(),
+ []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
+ {
+ CapabilityId: internal.CCIPCapabilityID,
+ Config: encodedSetCandidateCall,
+ },
},
+ false, // isPublic
+ false, // acceptsWorkflows
+ nodes.DefaultF(),
+ )
+ if err != nil {
+ return mcms.Operation{}, fmt.Errorf("could not generate add don tx w/ commit config: %w", err)
+ }
+ if !mcmsEnabled {
+ _, err = deployment.ConfirmIfNoError(homeChain, addDonTx, err)
+ if err != nil {
+ return mcms.Operation{}, fmt.Errorf("error confirming addDon call: %w", err)
+ }
+ }
+
+ return mcms.Operation{
+ To: capReg.Address(),
+ Data: addDonTx.Data(),
+ Value: big.NewInt(0),
}, nil
}
-// SetCandidatePluginChangeset calls setCandidate on the CCIPHome for setting up OCR3 exec Plugin config for the new chain.
-func SetCandidatePluginChangeset(
+type SetCandidateChangesetConfig struct {
+ SetCandidateConfigBase
+}
+
+func (s SetCandidateChangesetConfig) Validate(e deployment.Environment, state CCIPOnChainState) (map[uint64]uint32, error) {
+ err := s.SetCandidateConfigBase.Validate(e, state)
+ if err != nil {
+ return nil, err
+ }
+
+ chainToDonIDs := make(map[uint64]uint32)
+ for chainSelector := range s.OCRConfigPerRemoteChainSelector {
+ donID, err := internal.DonIDForChain(
+ state.Chains[s.HomeChainSelector].CapabilityRegistry,
+ state.Chains[s.HomeChainSelector].CCIPHome,
+ chainSelector,
+ )
+ if err != nil {
+ return nil, fmt.Errorf("fetch don id for chain: %w", err)
+ }
+ if donID == 0 {
+ return nil, fmt.Errorf("don doesn't exist in CR for chain %d", chainSelector)
+ }
+ chainToDonIDs[chainSelector] = donID
+ }
+
+ return chainToDonIDs, nil
+}
+
+// SetCandidateChangeset generates a proposal to call setCandidate on the CCIPHome through the capability registry.
+// A DON must exist in order to use this changeset effectively, i.e AddDonAndSetCandidateChangeset must be called first.
+func SetCandidateChangeset(
e deployment.Environment,
- cfg AddDonAndSetCandidateChangesetConfig,
+ cfg SetCandidateChangesetConfig,
) (deployment.ChangesetOutput, error) {
state, err := LoadOnchainState(e)
if err != nil {
return deployment.ChangesetOutput{}, err
}
- nodes, err := cfg.Validate(e, state)
+ chainToDonIDs, err := cfg.Validate(e, state)
if err != nil {
return deployment.ChangesetOutput{}, fmt.Errorf("%w: %w", deployment.ErrInvalidConfig, err)
}
- newDONArgs, err := internal.BuildOCR3ConfigForCCIPHome(
- e.OCRSecrets,
- state.Chains[cfg.NewChainSelector].OffRamp,
- e.Chains[cfg.NewChainSelector],
- nodes.NonBootstraps(),
- state.Chains[cfg.HomeChainSelector].RMNHome.Address(),
- cfg.CCIPOCRParams.OCRParameters,
- cfg.CCIPOCRParams.CommitOffChainConfig,
- cfg.CCIPOCRParams.ExecuteOffChainConfig,
- )
+ nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain)
if err != nil {
- return deployment.ChangesetOutput{}, err
+ return deployment.ChangesetOutput{}, fmt.Errorf("get node info: %w", err)
}
- config, ok := newDONArgs[cfg.PluginType]
- if !ok {
- return deployment.ChangesetOutput{}, fmt.Errorf("missing %s plugin in ocr3Configs", cfg.PluginType.String())
+ txOpts := e.Chains[cfg.HomeChainSelector].DeployerKey
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
}
+ var setCandidateOps []mcms.Operation
+ for chainSelector, params := range cfg.OCRConfigPerRemoteChainSelector {
+ newDONArgs, err := internal.BuildOCR3ConfigForCCIPHome(
+ e.OCRSecrets,
+ state.Chains[chainSelector].OffRamp,
+ e.Chains[chainSelector],
+ nodes.NonBootstraps(),
+ state.Chains[cfg.HomeChainSelector].RMNHome.Address(),
+ params.OCRParameters,
+ params.CommitOffChainConfig,
+ params.ExecuteOffChainConfig,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
- setCandidateMCMSOps, err := setCandidateOnExistingDon(
- config,
- state.Chains[cfg.HomeChainSelector].CapabilityRegistry,
- state.Chains[cfg.HomeChainSelector].CCIPHome,
- cfg.NewChainSelector,
- nodes.NonBootstraps(),
- )
- if err != nil {
- return deployment.ChangesetOutput{}, err
+ config, ok := newDONArgs[cfg.PluginType]
+ if !ok {
+ return deployment.ChangesetOutput{}, fmt.Errorf("missing %s plugin in ocr3Configs", cfg.PluginType.String())
+ }
+
+ setCandidateMCMSOps, err := setCandidateOnExistingDon(
+ txOpts,
+ e.Chains[cfg.HomeChainSelector],
+ state.Chains[cfg.HomeChainSelector].CapabilityRegistry,
+ nodes.NonBootstraps(),
+ chainToDonIDs[chainSelector],
+ config,
+ cfg.MCMS != nil,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ setCandidateOps = append(setCandidateOps, setCandidateMCMSOps...)
}
- var (
- timelocksPerChain = map[uint64]common.Address{
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ prop, err := proposalutils.BuildProposalFromBatches(
+ map[uint64]common.Address{
cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(),
- }
- proposerMCMSes = map[uint64]*gethwrappers.ManyChainMultiSig{
+ },
+ map[uint64]*gethwrappers.ManyChainMultiSig{
cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm,
- }
- )
- prop, err := proposalutils.BuildProposalFromBatches(
- timelocksPerChain,
- proposerMCMSes,
+ },
[]timelock.BatchChainOperation{{
ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector),
- Batch: setCandidateMCMSOps,
+ Batch: setCandidateOps,
}},
fmt.Sprintf("SetCandidate for %s plugin", cfg.PluginType.String()),
- 0, // minDelay
+ cfg.MCMS.MinDelay,
)
if err != nil {
return deployment.ChangesetOutput{}, err
@@ -236,22 +662,18 @@ func SetCandidatePluginChangeset(
// setCandidateOnExistingDon calls setCandidate on CCIPHome contract through the UpdateDON call on CapReg contract
// This proposes to set up OCR3 config for the provided plugin for the DON
func setCandidateOnExistingDon(
- pluginConfig ccip_home.CCIPHomeOCR3Config,
+ txOpts *bind.TransactOpts,
+ homeChain deployment.Chain,
capReg *capabilities_registry.CapabilitiesRegistry,
- ccipHome *ccip_home.CCIPHome,
- chainSelector uint64,
nodes deployment.Nodes,
+ donID uint32,
+ pluginConfig ccip_home.CCIPHomeOCR3Config,
+ mcmsEnabled bool,
) ([]mcms.Operation, error) {
- // fetch DON ID for the chain
- donID, err := internal.DonIDForChain(capReg, ccipHome, chainSelector)
- if err != nil {
- return nil, fmt.Errorf("fetch don id for chain: %w", err)
- }
if donID == 0 {
- return nil, fmt.Errorf("don doesn't exist in CR for chain %d", chainSelector)
+ return nil, fmt.Errorf("donID is zero")
}
- fmt.Printf("donID: %d", donID)
encodedSetCandidateCall, err := internal.CCIPHomeABI.Pack(
"setCandidate",
donID,
@@ -265,7 +687,7 @@ func setCandidateOnExistingDon(
// set candidate call
updateDonTx, err := capReg.UpdateDON(
- deployment.SimTransactOpts(),
+ txOpts,
donID,
nodes.PeerIDs(),
[]capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
@@ -278,7 +700,19 @@ func setCandidateOnExistingDon(
nodes.DefaultF(),
)
if err != nil {
- return nil, fmt.Errorf("update don w/ exec config: %w", err)
+ return nil, fmt.Errorf("update don w/ setCandidate call: %w", err)
+ }
+ if !mcmsEnabled {
+ _, err = deployment.ConfirmIfNoError(homeChain, updateDonTx, err)
+ if err != nil {
+ return nil, fmt.Errorf("error confirming updateDon call: %w", err)
+ }
+ }
+ if !mcmsEnabled {
+ _, err = deployment.ConfirmIfNoError(homeChain, updateDonTx, err)
+ if err != nil {
+ return nil, fmt.Errorf("error confirming updateDon call: %w", err)
+ }
}
return []mcms.Operation{{
@@ -290,13 +724,13 @@ func setCandidateOnExistingDon(
// promoteCandidateOp will create the MCMS Operation for `promoteCandidateAndRevokeActive` directed towards the capabilityRegistry
func promoteCandidateOp(
- homeChain deployment.Chain,
txOpts *bind.TransactOpts,
- donID uint32,
- pluginType uint8,
+ homeChain deployment.Chain,
capReg *capabilities_registry.CapabilitiesRegistry,
ccipHome *ccip_home.CCIPHome,
nodes deployment.Nodes,
+ donID uint32,
+ pluginType uint8,
mcmsEnabled bool,
) (mcms.Operation, error) {
allConfigs, err := ccipHome.GetAllConfigs(nil, donID, pluginType)
@@ -347,35 +781,432 @@ func promoteCandidateOp(
// promoteAllCandidatesForChainOps promotes the candidate commit and exec configs to active by calling promoteCandidateAndRevokeActive on CCIPHome through the UpdateDON call on CapReg contract
func promoteAllCandidatesForChainOps(
+ txOpts *bind.TransactOpts,
homeChain deployment.Chain,
+ capReg *capabilities_registry.CapabilitiesRegistry,
+ ccipHome *ccip_home.CCIPHome,
+ nodes deployment.Nodes,
+ donID uint32,
+ pluginType cctypes.PluginType,
+ mcmsEnabled bool,
+) (mcms.Operation, error) {
+ if donID == 0 {
+ return mcms.Operation{}, fmt.Errorf("donID is zero")
+ }
+
+ updatePluginOp, err := promoteCandidateOp(
+ txOpts,
+ homeChain,
+ capReg,
+ ccipHome,
+ nodes,
+ donID,
+ uint8(pluginType),
+ mcmsEnabled,
+ )
+ if err != nil {
+ return mcms.Operation{}, fmt.Errorf("promote candidate op for plugin %s: %w", pluginType.String(), err)
+ }
+ return updatePluginOp, nil
+}
+
+type RevokeCandidateChangesetConfig struct {
+ HomeChainSelector uint64
+
+ // RemoteChainSelector is the chain selector whose candidate config we want to revoke.
+ RemoteChainSelector uint64
+ PluginType types.PluginType
+
+ // MCMS is optional MCMS configuration, if provided the changeset will generate an MCMS proposal.
+ // If nil, the changeset will execute the commands directly using the deployer key
+ // of the provided environment.
+ MCMS *MCMSConfig
+}
+
+func (r RevokeCandidateChangesetConfig) Validate(e deployment.Environment, state CCIPOnChainState) (donID uint32, err error) {
+ if err := deployment.IsValidChainSelector(r.HomeChainSelector); err != nil {
+ return 0, fmt.Errorf("home chain selector invalid: %w", err)
+ }
+ if err := deployment.IsValidChainSelector(r.RemoteChainSelector); err != nil {
+ return 0, fmt.Errorf("don chain selector invalid: %w", err)
+ }
+ if len(e.NodeIDs) == 0 {
+ return 0, fmt.Errorf("NodeIDs must be set")
+ }
+ if state.Chains[r.HomeChainSelector].CCIPHome == nil {
+ return 0, fmt.Errorf("CCIPHome contract does not exist")
+ }
+ if state.Chains[r.HomeChainSelector].CapabilityRegistry == nil {
+ return 0, fmt.Errorf("CapabilityRegistry contract does not exist")
+ }
+ homeChainState, exists := state.Chains[r.HomeChainSelector]
+ if !exists {
+ return 0, fmt.Errorf("home chain %d does not exist", r.HomeChainSelector)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), r.MCMS != nil, e.Chains[r.HomeChainSelector].DeployerKey.From, homeChainState.Timelock.Address(), homeChainState.CapabilityRegistry); err != nil {
+ return 0, err
+ }
+
+ // check that the don exists for this chain
+ donID, err = internal.DonIDForChain(
+ state.Chains[r.HomeChainSelector].CapabilityRegistry,
+ state.Chains[r.HomeChainSelector].CCIPHome,
+ r.RemoteChainSelector,
+ )
+ if err != nil {
+ return 0, fmt.Errorf("fetch don id for chain: %w", err)
+ }
+ if donID == 0 {
+ return 0, fmt.Errorf("don doesn't exist in CR for chain %d", r.RemoteChainSelector)
+ }
+
+ // check that candidate digest is not zero - this is enforced onchain.
+ candidateDigest, err := state.Chains[r.HomeChainSelector].CCIPHome.GetCandidateDigest(nil, donID, uint8(r.PluginType))
+ if err != nil {
+ return 0, fmt.Errorf("fetching candidate digest from cciphome: %w", err)
+ }
+ if candidateDigest == [32]byte{} {
+ return 0, fmt.Errorf("candidate config digest is zero, can't revoke it")
+ }
+
+ return donID, nil
+}
+
+func RevokeCandidateChangeset(e deployment.Environment, cfg RevokeCandidateChangesetConfig) (deployment.ChangesetOutput, error) {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ donID, err := cfg.Validate(e, state)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("%w: %w", deployment.ErrInvalidConfig, err)
+ }
+
+ nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("fetch nodes info: %w", err)
+ }
+
+ txOpts := e.Chains[cfg.HomeChainSelector].DeployerKey
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+
+ homeChain := e.Chains[cfg.HomeChainSelector]
+ ops, err := revokeCandidateOps(
+ txOpts,
+ homeChain,
+ state.Chains[cfg.HomeChainSelector].CapabilityRegistry,
+ state.Chains[cfg.HomeChainSelector].CCIPHome,
+ nodes.NonBootstraps(),
+ donID,
+ uint8(cfg.PluginType),
+ cfg.MCMS != nil,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("revoke candidate ops: %w", err)
+ }
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ prop, err := proposalutils.BuildProposalFromBatches(
+ map[uint64]common.Address{
+ cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(),
+ },
+ map[uint64]*gethwrappers.ManyChainMultiSig{
+ cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm,
+ },
+ []timelock.BatchChainOperation{{
+ ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector),
+ Batch: ops,
+ }},
+ fmt.Sprintf("revokeCandidate for don %d", cfg.RemoteChainSelector),
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ return deployment.ChangesetOutput{
+ Proposals: []timelock.MCMSWithTimelockProposal{
+ *prop,
+ },
+ }, nil
+}
+
+func revokeCandidateOps(
txOpts *bind.TransactOpts,
+ homeChain deployment.Chain,
capReg *capabilities_registry.CapabilitiesRegistry,
ccipHome *ccip_home.CCIPHome,
- chainSelector uint64,
nodes deployment.Nodes,
+ donID uint32,
+ pluginType uint8,
mcmsEnabled bool,
) ([]mcms.Operation, error) {
- // fetch DON ID for the chain
- donID, err := internal.DonIDForChain(capReg, ccipHome, chainSelector)
+ if donID == 0 {
+ return nil, fmt.Errorf("donID is zero")
+ }
+
+ candidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, pluginType)
if err != nil {
- return nil, fmt.Errorf("fetch don id for chain: %w", err)
+ return nil, fmt.Errorf("fetching candidate digest from cciphome: %w", err)
}
- if donID == 0 {
- return nil, fmt.Errorf("don doesn't exist in CR for chain %d", chainSelector)
+
+ encodedRevokeCandidateCall, err := internal.CCIPHomeABI.Pack(
+ "revokeCandidate",
+ donID,
+ pluginType,
+ candidateDigest,
+ )
+ if err != nil {
+ return nil, fmt.Errorf("pack set candidate call: %w", err)
+ }
+
+ updateDonTx, err := capReg.UpdateDON(
+ txOpts,
+ donID,
+ nodes.PeerIDs(),
+ []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
+ {
+ CapabilityId: internal.CCIPCapabilityID,
+ Config: encodedRevokeCandidateCall,
+ },
+ },
+ false, // isPublic
+ nodes.DefaultF(),
+ )
+ if err != nil {
+ return nil, fmt.Errorf("update don w/ revokeCandidate call: %w", deployment.MaybeDataErr(err))
+ }
+ if !mcmsEnabled {
+ _, err = deployment.ConfirmIfNoError(homeChain, updateDonTx, err)
+ if err != nil {
+ return nil, fmt.Errorf("error confirming updateDon call: %w", err)
+ }
+ }
+
+ return []mcms.Operation{{
+ To: capReg.Address(),
+ Data: updateDonTx.Data(),
+ Value: big.NewInt(0),
+ }}, nil
+}
+
+type ChainConfig struct {
+ Readers [][32]byte
+ FChain uint8
+ EncodableChainConfig chainconfig.ChainConfig
+}
+
+type UpdateChainConfigConfig struct {
+ HomeChainSelector uint64
+ RemoteChainRemoves []uint64
+ RemoteChainAdds map[uint64]ChainConfig
+ MCMS *MCMSConfig
+}
+
+func (c UpdateChainConfigConfig) Validate(e deployment.Environment) error {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return err
+ }
+ if err := deployment.IsValidChainSelector(c.HomeChainSelector); err != nil {
+ return fmt.Errorf("home chain selector invalid: %w", err)
+ }
+ if len(c.RemoteChainRemoves) == 0 && len(c.RemoteChainAdds) == 0 {
+ return fmt.Errorf("no chain adds or removes")
+ }
+ homeChainState, exists := state.Chains[c.HomeChainSelector]
+ if !exists {
+ return fmt.Errorf("home chain %d does not exist", c.HomeChainSelector)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), c.MCMS != nil, e.Chains[c.HomeChainSelector].DeployerKey.From, homeChainState.Timelock.Address(), homeChainState.CCIPHome); err != nil {
+ return err
+ }
+ for _, remove := range c.RemoteChainRemoves {
+ if err := deployment.IsValidChainSelector(remove); err != nil {
+ return fmt.Errorf("chain remove selector invalid: %w", err)
+ }
+ if _, ok := state.SupportedChains()[remove]; !ok {
+ return fmt.Errorf("chain to remove %d is not supported", remove)
+ }
+ }
+ for add, ccfg := range c.RemoteChainAdds {
+ if err := deployment.IsValidChainSelector(add); err != nil {
+ return fmt.Errorf("chain remove selector invalid: %w", err)
+ }
+ if _, ok := state.SupportedChains()[add]; !ok {
+ return fmt.Errorf("chain to add %d is not supported", add)
+ }
+ if ccfg.FChain == 0 {
+ return fmt.Errorf("FChain must be set")
+ }
+ if len(ccfg.Readers) == 0 {
+ return fmt.Errorf("Readers must be set")
+ }
+ }
+ return nil
+}
+
+func UpdateChainConfig(e deployment.Environment, cfg UpdateChainConfigConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("%w: %w", deployment.ErrInvalidConfig, err)
}
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ txOpts := e.Chains[cfg.HomeChainSelector].DeployerKey
+ txOpts.Context = e.GetContext()
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ var adds []ccip_home.CCIPHomeChainConfigArgs
+ for chain, ccfg := range cfg.RemoteChainAdds {
+ encodedChainConfig, err := chainconfig.EncodeChainConfig(chainconfig.ChainConfig{
+ GasPriceDeviationPPB: ccfg.EncodableChainConfig.GasPriceDeviationPPB,
+ DAGasPriceDeviationPPB: ccfg.EncodableChainConfig.DAGasPriceDeviationPPB,
+ OptimisticConfirmations: ccfg.EncodableChainConfig.OptimisticConfirmations,
+ })
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("encoding chain config: %w", err)
+ }
+ chainConfig := ccip_home.CCIPHomeChainConfig{
+ Readers: ccfg.Readers,
+ FChain: ccfg.FChain,
+ Config: encodedChainConfig,
+ }
+ existingCfg, err := state.Chains[cfg.HomeChainSelector].CCIPHome.GetChainConfig(nil, chain)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("get chain config for selector %d: %w", chain, err)
+ }
+ if isChainConfigEqual(existingCfg, chainConfig) {
+ e.Logger.Infow("Chain config already exists, not applying again",
+ "addedChain", chain,
+ "chainConfig", chainConfig,
+ )
+ continue
+ }
+ adds = append(adds, ccip_home.CCIPHomeChainConfigArgs{
+ ChainSelector: chain,
+ ChainConfig: chainConfig,
+ })
+ }
+
+ tx, err := state.Chains[cfg.HomeChainSelector].CCIPHome.ApplyChainConfigUpdates(txOpts, cfg.RemoteChainRemoves, adds)
+ if cfg.MCMS == nil {
+ _, err = deployment.ConfirmIfNoError(e.Chains[cfg.HomeChainSelector], tx, err)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("Updated chain config on chain %d removes %v, adds %v", cfg.HomeChainSelector, cfg.RemoteChainRemoves, cfg.RemoteChainAdds)
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ p, err := proposalutils.BuildProposalFromBatches(
+ map[uint64]common.Address{
+ cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(),
+ },
+ map[uint64]*gethwrappers.ManyChainMultiSig{
+ cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm,
+ },
+ []timelock.BatchChainOperation{{
+ ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector),
+ Batch: []mcms.Operation{
+ {
+ To: state.Chains[cfg.HomeChainSelector].CCIPHome.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ },
+ }},
+ "Update chain config",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("Proposed chain config update on chain %d removes %v, adds %v", cfg.HomeChainSelector, cfg.RemoteChainRemoves, cfg.RemoteChainAdds)
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
- var mcmsOps []mcms.Operation
- updateCommitOp, err := promoteCandidateOp(homeChain, txOpts, donID, uint8(cctypes.PluginTypeCCIPCommit), capReg, ccipHome, nodes, mcmsEnabled)
+func isChainConfigEqual(a, b ccip_home.CCIPHomeChainConfig) bool {
+ mapReader := make(map[[32]byte]struct{})
+ for i := range a.Readers {
+ mapReader[a.Readers[i]] = struct{}{}
+ }
+ for i := range b.Readers {
+ if _, ok := mapReader[b.Readers[i]]; !ok {
+ return false
+ }
+ }
+ return bytes.Equal(a.Config, b.Config) &&
+ a.FChain == b.FChain
+}
+
+// ValidateCCIPHomeConfigSetUp checks that the commit and exec active and candidate configs are set up correctly
+// TODO: Utilize this
+func ValidateCCIPHomeConfigSetUp(
+ lggr logger.Logger,
+ capReg *capabilities_registry.CapabilitiesRegistry,
+ ccipHome *ccip_home.CCIPHome,
+ chainSel uint64,
+) error {
+ // fetch DONID
+ donID, err := internal.DonIDForChain(capReg, ccipHome, chainSel)
if err != nil {
- return nil, fmt.Errorf("promote candidate op: %w", err)
+ return fmt.Errorf("fetch don id for chain: %w", err)
+ }
+ if donID == 0 {
+ return fmt.Errorf("don id for chain (%d) does not exist", chainSel)
}
- mcmsOps = append(mcmsOps, updateCommitOp)
- updateExecOp, err := promoteCandidateOp(homeChain, txOpts, donID, uint8(cctypes.PluginTypeCCIPExec), capReg, ccipHome, nodes, mcmsEnabled)
+ // final sanity checks on configs.
+ commitConfigs, err := ccipHome.GetAllConfigs(&bind.CallOpts{
+ //Pending: true,
+ }, donID, uint8(cctypes.PluginTypeCCIPCommit))
+ if err != nil {
+ return fmt.Errorf("get all commit configs: %w", err)
+ }
+ commitActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit))
+ if err != nil {
+ return fmt.Errorf("get active commit digest: %w", err)
+ }
+ lggr.Debugw("Fetched active commit digest", "commitActiveDigest", hex.EncodeToString(commitActiveDigest[:]))
+ commitCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit))
if err != nil {
- return nil, fmt.Errorf("promote candidate op: %w", err)
+ return fmt.Errorf("get commit candidate digest: %w", err)
+ }
+ lggr.Debugw("Fetched candidate commit digest", "commitCandidateDigest", hex.EncodeToString(commitCandidateDigest[:]))
+ if commitConfigs.ActiveConfig.ConfigDigest == [32]byte{} {
+ return fmt.Errorf(
+ "active config digest is empty for commit, expected nonempty, donID: %d, cfg: %+v, config digest from GetActiveDigest call: %x, config digest from GetCandidateDigest call: %x",
+ donID, commitConfigs.ActiveConfig, commitActiveDigest, commitCandidateDigest)
+ }
+ if commitConfigs.CandidateConfig.ConfigDigest != [32]byte{} {
+ return fmt.Errorf(
+ "candidate config digest is nonempty for commit, expected empty, donID: %d, cfg: %+v, config digest from GetCandidateDigest call: %x, config digest from GetActiveDigest call: %x",
+ donID, commitConfigs.CandidateConfig, commitCandidateDigest, commitActiveDigest)
}
- mcmsOps = append(mcmsOps, updateExecOp)
- return mcmsOps, nil
+ execConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(cctypes.PluginTypeCCIPExec))
+ if err != nil {
+ return fmt.Errorf("get all exec configs: %w", err)
+ }
+ lggr.Debugw("Fetched exec configs",
+ "ActiveConfig.ConfigDigest", hex.EncodeToString(execConfigs.ActiveConfig.ConfigDigest[:]),
+ "CandidateConfig.ConfigDigest", hex.EncodeToString(execConfigs.CandidateConfig.ConfigDigest[:]),
+ )
+ if execConfigs.ActiveConfig.ConfigDigest == [32]byte{} {
+ return fmt.Errorf("active config digest is empty for exec, expected nonempty, cfg: %v", execConfigs.ActiveConfig)
+ }
+ if execConfigs.CandidateConfig.ConfigDigest != [32]byte{} {
+ return fmt.Errorf("candidate config digest is nonempty for exec, expected empty, cfg: %v", execConfigs.CandidateConfig)
+ }
+ return nil
}
diff --git a/deployment/ccip/changeset/cs_ccip_home_test.go b/deployment/ccip/changeset/cs_ccip_home_test.go
index 92784551957..dae32557f8b 100644
--- a/deployment/ccip/changeset/cs_ccip_home_test.go
+++ b/deployment/ccip/changeset/cs_ccip_home_test.go
@@ -1,23 +1,20 @@
package changeset
import (
+ "math/big"
"testing"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
- "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
- "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
+ "github.com/stretchr/testify/assert"
"golang.org/x/exp/maps"
+ "github.com/smartcontractkit/chainlink-ccip/chainconfig"
+ cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
"github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
-
- "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/stretchr/testify/require"
@@ -25,243 +22,220 @@ import (
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
)
-func TestActiveCandidate(t *testing.T) {
- t.Skipf("to be enabled after latest cl-ccip is compatible")
+func Test_PromoteCandidate(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ mcmsEnabled bool
+ }{
+ {
+ name: "MCMS enabled",
+ mcmsEnabled: true,
+ },
+ {
+ name: "MCMS disabled",
+ mcmsEnabled: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ ctx := testcontext.Get(t)
+ tenv := NewMemoryEnvironment(t,
+ WithChains(2),
+ WithNodes(4))
+ state, err := LoadOnchainState(tenv.Env)
+ require.NoError(t, err)
- tenv := NewMemoryEnvironment(t,
- WithChains(3),
- WithNodes(5))
- e := tenv.Env
- state, err := LoadOnchainState(tenv.Env)
- require.NoError(t, err)
- allChains := maps.Keys(e.Chains)
-
- // Add all lanes
- require.NoError(t, AddLanesForAll(e, state))
- // Need to keep track of the block number for each chain so that event subscription can be done from that block.
- startBlocks := make(map[uint64]*uint64)
- // Send a message from each chain to every other chain.
- expectedSeqNum := make(map[SourceDestPair]uint64)
- expectedSeqNumExec := make(map[SourceDestPair][]uint64)
- for src := range e.Chains {
- for dest, destChain := range e.Chains {
- if src == dest {
- continue
+ // Deploy to all chains.
+ allChains := maps.Keys(tenv.Env.Chains)
+ source := allChains[0]
+ dest := allChains[1]
+
+ if tc.mcmsEnabled {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ transferToTimelock(t, tenv, state, source, dest)
}
- latesthdr, err := destChain.Client.HeaderByNumber(testcontext.Get(t), nil)
- require.NoError(t, err)
- block := latesthdr.Number.Uint64()
- startBlocks[dest] = &block
- msgSentEvent := TestSendRequest(t, e, state, src, dest, false, router.ClientEVM2AnyMessage{
- Receiver: common.LeftPadBytes(state.Chains[dest].Receiver.Address().Bytes(), 32),
- Data: []byte("hello world"),
- TokenAmounts: nil,
- FeeToken: common.HexToAddress("0x0"),
- ExtraArgs: nil,
- })
- expectedSeqNum[SourceDestPair{
- SourceChainSelector: src,
- DestChainSelector: dest,
- }] = msgSentEvent.SequenceNumber
- expectedSeqNumExec[SourceDestPair{
- SourceChainSelector: src,
- DestChainSelector: dest,
- }] = []uint64{msgSentEvent.SequenceNumber}
- }
- }
- // Wait for all commit reports to land.
- ConfirmCommitForAllWithExpectedSeqNums(t, e, state, expectedSeqNum, startBlocks)
+ var (
+ capReg = state.Chains[tenv.HomeChainSel].CapabilityRegistry
+ ccipHome = state.Chains[tenv.HomeChainSel].CCIPHome
+ )
+ donID, err := internal.DonIDForChain(capReg, ccipHome, dest)
+ require.NoError(t, err)
+ require.NotEqual(t, uint32(0), donID)
+ t.Logf("donID: %d", donID)
+ candidateDigestCommitBefore, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPCommit))
+ require.NoError(t, err)
+ require.Equal(t, [32]byte{}, candidateDigestCommitBefore)
+ ActiveDigestExecBefore, err := ccipHome.GetActiveDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPExec))
+ require.NoError(t, err)
+ require.NotEqual(t, [32]byte{}, ActiveDigestExecBefore)
- //After commit is reported on all chains, token prices should be updated in FeeQuoter.
- for dest := range e.Chains {
- linkAddress := state.Chains[dest].LinkToken.Address()
- feeQuoter := state.Chains[dest].FeeQuoter
- timestampedPrice, err := feeQuoter.GetTokenPrice(nil, linkAddress)
- require.NoError(t, err)
- require.Equal(t, MockLinkPrice, timestampedPrice.Value)
- }
+ var mcmsConfig *MCMSConfig
+ if tc.mcmsEnabled {
+ mcmsConfig = &MCMSConfig{
+ MinDelay: 0,
+ }
+ }
+ // promotes zero digest on commit and ensure exec is not affected
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
+ tenv.HomeChainSel: {
+ Timelock: state.Chains[tenv.HomeChainSel].Timelock,
+ CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
+ },
+ }, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(PromoteAllCandidatesChangeset),
+ Config: PromoteCandidatesChangesetConfig{
+ HomeChainSelector: tenv.HomeChainSel,
+ RemoteChainSelectors: []uint64{dest},
+ MCMS: mcmsConfig,
+ PluginType: types.PluginTypeCCIPCommit,
+ },
+ },
+ })
+ require.NoError(t, err)
- //Wait for all exec reports to land
- ConfirmExecWithSeqNrsForAll(t, e, state, expectedSeqNumExec, startBlocks)
+ // after promoting the zero digest, active digest should also be zero
+ activeDigestCommit, err := ccipHome.GetActiveDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPCommit))
+ require.NoError(t, err)
+ require.Equal(t, [32]byte{}, activeDigestCommit)
- // compose the transfer ownership and accept ownership changesets
- timelockContracts := make(map[uint64]*commonchangeset.TimelockExecutionContracts)
- for _, chain := range allChains {
- timelockContracts[chain] = &commonchangeset.TimelockExecutionContracts{
- Timelock: state.Chains[chain].Timelock,
- CallProxy: state.Chains[chain].CallProxy,
- }
+ activeDigestExec, err := ccipHome.GetActiveDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPExec))
+ require.NoError(t, err)
+ require.Equal(t, ActiveDigestExecBefore, activeDigestExec)
+ })
}
+}
- _, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{
- // note this doesn't have proposals.
+func Test_SetCandidate(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ mcmsEnabled bool
+ }{
{
- Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock),
- Config: genTestTransferOwnershipConfig(tenv, allChains, state),
+ name: "MCMS enabled",
+ mcmsEnabled: true,
},
- })
- require.NoError(t, err)
- // Apply the accept ownership proposal to all the chains.
-
- err = ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 2)
- require.NoError(t, err)
-
- // [ACTIVE, CANDIDATE] setup by setting candidate through cap reg
- capReg, ccipHome := state.Chains[tenv.HomeChainSel].CapabilityRegistry, state.Chains[tenv.HomeChainSel].CCIPHome
- donID, err := internal.DonIDForChain(capReg, ccipHome, tenv.FeedChainSel)
- require.NoError(t, err)
- require.NotEqual(t, uint32(0), donID)
- donInfo, err := state.Chains[tenv.HomeChainSel].CapabilityRegistry.GetDON(nil, donID)
- require.NoError(t, err)
- require.Equal(t, 5, len(donInfo.NodeP2PIds))
- require.Equal(t, uint32(4), donInfo.ConfigCount)
-
- state, err = LoadOnchainState(e)
- require.NoError(t, err)
-
- // delete a non-bootstrap node
- nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain)
- require.NoError(t, err)
- var newNodeIDs []string
- // make sure we delete a node that is NOT bootstrap.
- // we will remove bootstrap later by calling nodes.NonBootstrap()
- if nodes[0].IsBootstrap {
- newNodeIDs = e.NodeIDs[:len(e.NodeIDs)-1]
- } else {
- newNodeIDs = e.NodeIDs[1:]
- }
- nodes, err = deployment.NodeInfo(newNodeIDs, e.Offchain)
- require.NoError(t, err)
-
- // this will construct ocr3 configurations for the
- // commit and exec plugin we will be using
- rmnHomeAddress := state.Chains[tenv.HomeChainSel].RMNHome.Address()
- tokenConfig := NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds)
- ccipOCRParams := DefaultOCRParams(
- tenv.FeedChainSel,
- tokenConfig.GetTokenInfo(e.Logger, state.Chains[tenv.FeedChainSel].LinkToken, state.Chains[tenv.FeedChainSel].Weth9),
- nil,
- )
- ocr3ConfigMap, err := internal.BuildOCR3ConfigForCCIPHome(
- e.OCRSecrets,
- state.Chains[tenv.FeedChainSel].OffRamp,
- e.Chains[tenv.FeedChainSel],
- nodes.NonBootstraps(),
- rmnHomeAddress,
- ccipOCRParams.OCRParameters,
- ccipOCRParams.CommitOffChainConfig,
- ccipOCRParams.ExecuteOffChainConfig,
- )
- require.NoError(t, err)
-
- var (
- timelocksPerChain = map[uint64]common.Address{
- tenv.HomeChainSel: state.Chains[tenv.HomeChainSel].Timelock.Address(),
- }
- proposerMCMSes = map[uint64]*gethwrappers.ManyChainMultiSig{
- tenv.HomeChainSel: state.Chains[tenv.HomeChainSel].ProposerMcm,
- }
- )
- setCommitCandidateOp, err := setCandidateOnExistingDon(
- ocr3ConfigMap[cctypes.PluginTypeCCIPCommit],
- state.Chains[tenv.HomeChainSel].CapabilityRegistry,
- state.Chains[tenv.HomeChainSel].CCIPHome,
- tenv.FeedChainSel,
- nodes.NonBootstraps(),
- )
- require.NoError(t, err)
- setCommitCandidateProposal, err := proposalutils.BuildProposalFromBatches(timelocksPerChain, proposerMCMSes, []timelock.BatchChainOperation{{
- ChainIdentifier: mcms.ChainIdentifier(tenv.HomeChainSel),
- Batch: setCommitCandidateOp,
- }}, "set new candidates on commit plugin", 0)
- require.NoError(t, err)
- setCommitCandidateSigned := commonchangeset.SignProposal(t, e, setCommitCandidateProposal)
- commonchangeset.ExecuteProposal(t, e, setCommitCandidateSigned, &commonchangeset.TimelockExecutionContracts{
- Timelock: state.Chains[tenv.HomeChainSel].Timelock,
- CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
- }, tenv.HomeChainSel)
-
- // create the op for the commit plugin as well
- setExecCandidateOp, err := setCandidateOnExistingDon(
- ocr3ConfigMap[cctypes.PluginTypeCCIPExec],
- state.Chains[tenv.HomeChainSel].CapabilityRegistry,
- state.Chains[tenv.HomeChainSel].CCIPHome,
- tenv.FeedChainSel,
- nodes.NonBootstraps(),
- )
- require.NoError(t, err)
-
- setExecCandidateProposal, err := proposalutils.BuildProposalFromBatches(timelocksPerChain, proposerMCMSes, []timelock.BatchChainOperation{{
- ChainIdentifier: mcms.ChainIdentifier(tenv.HomeChainSel),
- Batch: setExecCandidateOp,
- }}, "set new candidates on commit and exec plugins", 0)
- require.NoError(t, err)
- setExecCandidateSigned := commonchangeset.SignProposal(t, e, setExecCandidateProposal)
- commonchangeset.ExecuteProposal(t, e, setExecCandidateSigned, &commonchangeset.TimelockExecutionContracts{
- Timelock: state.Chains[tenv.HomeChainSel].Timelock,
- CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
- }, tenv.HomeChainSel)
-
- // check setup was successful by confirming number of nodes from cap reg
- donInfo, err = state.Chains[tenv.HomeChainSel].CapabilityRegistry.GetDON(nil, donID)
- require.NoError(t, err)
- require.Equal(t, 4, len(donInfo.NodeP2PIds))
- require.Equal(t, uint32(6), donInfo.ConfigCount)
- // [ACTIVE, CANDIDATE] done setup
+ {
+ name: "MCMS disabled",
+ mcmsEnabled: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ ctx := testcontext.Get(t)
+ tenv := NewMemoryEnvironment(t,
+ WithChains(2),
+ WithNodes(4))
+ state, err := LoadOnchainState(tenv.Env)
+ require.NoError(t, err)
- // [ACTIVE, CANDIDATE] make sure we can still send successful transaction without updating job specs
- err = ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 3)
- require.NoError(t, err)
- // [ACTIVE, CANDIDATE] done send successful transaction on active
+ // Deploy to all chains.
+ allChains := maps.Keys(tenv.Env.Chains)
+ source := allChains[0]
+ dest := allChains[1]
- // [NEW ACTIVE, NO CANDIDATE] promote to active
- // confirm by getting old candidate digest and making sure new active matches
- oldCandidateDigest, err := state.Chains[tenv.HomeChainSel].CCIPHome.GetCandidateDigest(nil, donID, uint8(cctypes.PluginTypeCCIPExec))
- require.NoError(t, err)
+ if tc.mcmsEnabled {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ transferToTimelock(t, tenv, state, source, dest)
+ }
- promoteOps, err := promoteAllCandidatesForChainOps(
- tenv.Env.Chains[tenv.HomeChainSel],
- deployment.SimTransactOpts(),
- state.Chains[tenv.HomeChainSel].CapabilityRegistry,
- state.Chains[tenv.HomeChainSel].CCIPHome,
- tenv.FeedChainSel,
- nodes.NonBootstraps(),
- true)
- require.NoError(t, err)
- promoteProposal, err := proposalutils.BuildProposalFromBatches(timelocksPerChain, proposerMCMSes, []timelock.BatchChainOperation{{
- ChainIdentifier: mcms.ChainIdentifier(tenv.HomeChainSel),
- Batch: promoteOps,
- }}, "promote candidates and revoke actives", 0)
- require.NoError(t, err)
- promoteSigned := commonchangeset.SignProposal(t, e, promoteProposal)
- commonchangeset.ExecuteProposal(t, e, promoteSigned, &commonchangeset.TimelockExecutionContracts{
- Timelock: state.Chains[tenv.HomeChainSel].Timelock,
- CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
- }, tenv.HomeChainSel)
- // [NEW ACTIVE, NO CANDIDATE] done promoting
-
- // [NEW ACTIVE, NO CANDIDATE] check onchain state
- newActiveDigest, err := state.Chains[tenv.HomeChainSel].CCIPHome.GetActiveDigest(nil, donID, uint8(cctypes.PluginTypeCCIPExec))
- require.NoError(t, err)
- require.Equal(t, oldCandidateDigest, newActiveDigest)
+ var (
+ capReg = state.Chains[tenv.HomeChainSel].CapabilityRegistry
+ ccipHome = state.Chains[tenv.HomeChainSel].CCIPHome
+ )
+ donID, err := internal.DonIDForChain(capReg, ccipHome, dest)
+ require.NoError(t, err)
+ require.NotEqual(t, uint32(0), donID)
+ candidateDigestCommitBefore, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPCommit))
+ require.NoError(t, err)
+ require.Equal(t, [32]byte{}, candidateDigestCommitBefore)
+ candidateDigestExecBefore, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPExec))
+ require.NoError(t, err)
+ require.Equal(t, [32]byte{}, candidateDigestExecBefore)
- newCandidateDigest, err := state.Chains[tenv.HomeChainSel].CCIPHome.GetCandidateDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit))
- require.NoError(t, err)
- require.Equal(t, newCandidateDigest, [32]byte{})
- // [NEW ACTIVE, NO CANDIDATE] done checking on chain state
+ var mcmsConfig *MCMSConfig
+ if tc.mcmsEnabled {
+ mcmsConfig = &MCMSConfig{
+ MinDelay: 0,
+ }
+ }
+ tokenConfig := NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds)
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
+ tenv.HomeChainSel: {
+ Timelock: state.Chains[tenv.HomeChainSel].Timelock,
+ CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
+ },
+ }, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(SetCandidateChangeset),
+ Config: SetCandidateChangesetConfig{
+ SetCandidateConfigBase: SetCandidateConfigBase{
+ HomeChainSelector: tenv.HomeChainSel,
+ FeedChainSelector: tenv.FeedChainSel,
+ OCRConfigPerRemoteChainSelector: map[uint64]CCIPOCRParams{
+ dest: DefaultOCRParams(
+ tenv.FeedChainSel,
+ tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[dest].LinkToken, state.Chains[dest].Weth9),
+ nil,
+ ),
+ },
+ PluginType: types.PluginTypeCCIPCommit,
+ MCMS: mcmsConfig,
+ },
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(SetCandidateChangeset),
+ Config: SetCandidateChangesetConfig{
+ SetCandidateConfigBase: SetCandidateConfigBase{
+ HomeChainSelector: tenv.HomeChainSel,
+ FeedChainSelector: tenv.FeedChainSel,
+ OCRConfigPerRemoteChainSelector: map[uint64]CCIPOCRParams{
+ dest: DefaultOCRParams(
+ tenv.FeedChainSel,
+ tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[dest].LinkToken, state.Chains[dest].Weth9),
+ nil,
+ ),
+ },
+ PluginType: types.PluginTypeCCIPExec,
+ MCMS: mcmsConfig,
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
- // [NEW ACTIVE, NO CANDIDATE] send successful request on new active
- donInfo, err = state.Chains[tenv.HomeChainSel].CapabilityRegistry.GetDON(nil, donID)
- require.NoError(t, err)
- require.Equal(t, uint32(8), donInfo.ConfigCount)
+ // after setting a new candidate on both plugins, the candidate config digest
+ // should be nonzero.
+ candidateDigestCommitAfter, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPCommit))
+ require.NoError(t, err)
+ require.NotEqual(t, [32]byte{}, candidateDigestCommitAfter)
+ require.NotEqual(t, candidateDigestCommitBefore, candidateDigestCommitAfter)
- err = ConfirmRequestOnSourceAndDest(t, e, state, tenv.HomeChainSel, tenv.FeedChainSel, 4)
- require.NoError(t, err)
- // [NEW ACTIVE, NO CANDIDATE] done sending successful request
+ candidateDigestExecAfter, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPExec))
+ require.NoError(t, err)
+ require.NotEqual(t, [32]byte{}, candidateDigestExecAfter)
+ require.NotEqual(t, candidateDigestExecBefore, candidateDigestExecAfter)
+ })
+ }
}
-func Test_PromoteCandidate(t *testing.T) {
+func Test_RevokeCandidate(t *testing.T) {
for _, tc := range []struct {
name string
mcmsEnabled bool
@@ -288,37 +262,9 @@ func Test_PromoteCandidate(t *testing.T) {
source := allChains[0]
dest := allChains[1]
- nodes, err := deployment.NodeInfo(tenv.Env.NodeIDs, tenv.Env.Offchain)
- require.NoError(t, err)
-
- var nodeIDs []string
- for _, node := range nodes {
- nodeIDs = append(nodeIDs, node.NodeID)
- }
-
if tc.mcmsEnabled {
// Transfer ownership to timelock so that we can promote the zero digest later down the line.
- _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*commonchangeset.TimelockExecutionContracts{
- source: {
- Timelock: state.Chains[source].Timelock,
- CallProxy: state.Chains[source].CallProxy,
- },
- dest: {
- Timelock: state.Chains[dest].Timelock,
- CallProxy: state.Chains[dest].CallProxy,
- },
- tenv.HomeChainSel: {
- Timelock: state.Chains[tenv.HomeChainSel].Timelock,
- CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
- },
- }, []commonchangeset.ChangesetApplication{
- {
- Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock),
- Config: genTestTransferOwnershipConfig(tenv, allChains, state),
- },
- })
- require.NoError(t, err)
- assertTimelockOwnership(t, tenv, allChains, state)
+ transferToTimelock(t, tenv, state, source, dest)
}
var (
@@ -345,36 +291,239 @@ func Test_PromoteCandidate(t *testing.T) {
MinDelay: 0,
}
}
- _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*commonchangeset.TimelockExecutionContracts{
+ tokenConfig := NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds)
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
tenv.HomeChainSel: {
Timelock: state.Chains[tenv.HomeChainSel].Timelock,
CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
},
}, []commonchangeset.ChangesetApplication{
{
- Changeset: commonchangeset.WrapChangeSet(PromoteAllCandidatesChangeset),
- Config: PromoteAllCandidatesChangesetConfig{
- HomeChainSelector: tenv.HomeChainSel,
- DONChainSelector: dest,
- NodeIDs: nodeIDs,
- MCMS: mcmsConfig,
+ Changeset: commonchangeset.WrapChangeSet(SetCandidateChangeset),
+ Config: SetCandidateChangesetConfig{
+ SetCandidateConfigBase: SetCandidateConfigBase{
+ HomeChainSelector: tenv.HomeChainSel,
+ FeedChainSelector: tenv.FeedChainSel,
+ OCRConfigPerRemoteChainSelector: map[uint64]CCIPOCRParams{
+ dest: DefaultOCRParams(
+ tenv.FeedChainSel,
+ tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[dest].LinkToken, state.Chains[dest].Weth9),
+ nil,
+ ),
+ },
+ PluginType: types.PluginTypeCCIPCommit,
+ MCMS: mcmsConfig,
+ },
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(SetCandidateChangeset),
+ Config: SetCandidateChangesetConfig{
+ SetCandidateConfigBase: SetCandidateConfigBase{
+ HomeChainSelector: tenv.HomeChainSel,
+ FeedChainSelector: tenv.FeedChainSel,
+ OCRConfigPerRemoteChainSelector: map[uint64]CCIPOCRParams{
+ dest: DefaultOCRParams(
+ tenv.FeedChainSel,
+ tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[dest].LinkToken, state.Chains[dest].Weth9),
+ nil,
+ ),
+ },
+ PluginType: types.PluginTypeCCIPExec,
+ MCMS: mcmsConfig,
+ },
},
},
})
require.NoError(t, err)
- // after promoting the zero digest, active digest should also be zero
- activeDigestCommit, err := ccipHome.GetActiveDigest(&bind.CallOpts{
+ // after setting a new candidate on both plugins, the candidate config digest
+ // should be nonzero.
+ candidateDigestCommitAfter, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
Context: ctx,
}, donID, uint8(types.PluginTypeCCIPCommit))
require.NoError(t, err)
- require.Equal(t, [32]byte{}, activeDigestCommit)
+ require.NotEqual(t, [32]byte{}, candidateDigestCommitAfter)
+ require.NotEqual(t, candidateDigestCommitBefore, candidateDigestCommitAfter)
- activeDigestExec, err := ccipHome.GetActiveDigest(&bind.CallOpts{
+ candidateDigestExecAfter, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPExec))
+ require.NoError(t, err)
+ require.NotEqual(t, [32]byte{}, candidateDigestExecAfter)
+ require.NotEqual(t, candidateDigestExecBefore, candidateDigestExecAfter)
+
+ // next we can revoke candidate - this should set the candidate digest back to zero
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
+ tenv.HomeChainSel: {
+ Timelock: state.Chains[tenv.HomeChainSel].Timelock,
+ CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
+ },
+ }, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(RevokeCandidateChangeset),
+ Config: RevokeCandidateChangesetConfig{
+ HomeChainSelector: tenv.HomeChainSel,
+ RemoteChainSelector: dest,
+ PluginType: types.PluginTypeCCIPCommit,
+ MCMS: mcmsConfig,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(RevokeCandidateChangeset),
+ Config: RevokeCandidateChangesetConfig{
+ HomeChainSelector: tenv.HomeChainSel,
+ RemoteChainSelector: dest,
+ PluginType: types.PluginTypeCCIPExec,
+ MCMS: mcmsConfig,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // after revoking the candidate, the candidate digest should be zero
+ candidateDigestCommitAfterRevoke, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
+ Context: ctx,
+ }, donID, uint8(types.PluginTypeCCIPCommit))
+ require.NoError(t, err)
+ require.Equal(t, [32]byte{}, candidateDigestCommitAfterRevoke)
+
+ candidateDigestExecAfterRevoke, err := ccipHome.GetCandidateDigest(&bind.CallOpts{
Context: ctx,
}, donID, uint8(types.PluginTypeCCIPExec))
require.NoError(t, err)
- require.Equal(t, [32]byte{}, activeDigestExec)
+ require.Equal(t, [32]byte{}, candidateDigestExecAfterRevoke)
+ })
+ }
+}
+
+func transferToTimelock(
+ t *testing.T,
+ tenv DeployedEnv,
+ state CCIPOnChainState,
+ source,
+ dest uint64) {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ _, err := commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
+ source: {
+ Timelock: state.Chains[source].Timelock,
+ CallProxy: state.Chains[source].CallProxy,
+ },
+ dest: {
+ Timelock: state.Chains[dest].Timelock,
+ CallProxy: state.Chains[dest].CallProxy,
+ },
+ tenv.HomeChainSel: {
+ Timelock: state.Chains[tenv.HomeChainSel].Timelock,
+ CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
+ },
+ }, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock),
+ Config: genTestTransferOwnershipConfig(tenv, []uint64{source, dest}, state),
+ },
+ })
+ require.NoError(t, err)
+ assertTimelockOwnership(t, tenv, []uint64{source, dest}, state)
+}
+
+func Test_UpdateChainConfigs(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ mcmsEnabled bool
+ }{
+ {
+ name: "MCMS enabled",
+ mcmsEnabled: true,
+ },
+ {
+ name: "MCMS disabled",
+ mcmsEnabled: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ tenv := NewMemoryEnvironment(t, WithChains(3))
+ state, err := LoadOnchainState(tenv.Env)
+ require.NoError(t, err)
+
+ allChains := maps.Keys(tenv.Env.Chains)
+ source := allChains[0]
+ dest := allChains[1]
+ otherChain := allChains[2]
+
+ if tc.mcmsEnabled {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ transferToTimelock(t, tenv, state, source, dest)
+ }
+
+ ccipHome := state.Chains[tenv.HomeChainSel].CCIPHome
+ otherChainConfig, err := ccipHome.GetChainConfig(nil, otherChain)
+ require.NoError(t, err)
+ assert.True(t, otherChainConfig.FChain != 0)
+
+ var mcmsConfig *MCMSConfig
+ if tc.mcmsEnabled {
+ mcmsConfig = &MCMSConfig{
+ MinDelay: 0,
+ }
+ }
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
+ tenv.HomeChainSel: {
+ Timelock: state.Chains[tenv.HomeChainSel].Timelock,
+ CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
+ },
+ }, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(UpdateChainConfig),
+ Config: UpdateChainConfigConfig{
+ HomeChainSelector: tenv.HomeChainSel,
+ RemoteChainRemoves: []uint64{otherChain},
+ RemoteChainAdds: make(map[uint64]ChainConfig),
+ MCMS: mcmsConfig,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // other chain should be gone
+ chainConfigAfter, err := ccipHome.GetChainConfig(nil, otherChain)
+ require.NoError(t, err)
+ assert.True(t, chainConfigAfter.FChain == 0)
+
+ // Lets add it back now.
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
+ tenv.HomeChainSel: {
+ Timelock: state.Chains[tenv.HomeChainSel].Timelock,
+ CallProxy: state.Chains[tenv.HomeChainSel].CallProxy,
+ },
+ }, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(UpdateChainConfig),
+ Config: UpdateChainConfigConfig{
+ HomeChainSelector: tenv.HomeChainSel,
+ RemoteChainRemoves: []uint64{},
+ RemoteChainAdds: map[uint64]ChainConfig{
+ otherChain: {
+ EncodableChainConfig: chainconfig.ChainConfig{
+ GasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(internal.GasPriceDeviationPPB)},
+ DAGasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(internal.DAGasPriceDeviationPPB)},
+ OptimisticConfirmations: internal.OptimisticConfirmations,
+ },
+ FChain: otherChainConfig.FChain,
+ Readers: otherChainConfig.Readers,
+ },
+ },
+ MCMS: mcmsConfig,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ chainConfigAfter2, err := ccipHome.GetChainConfig(nil, otherChain)
+ require.NoError(t, err)
+ assert.Equal(t, chainConfigAfter2.FChain, otherChainConfig.FChain)
+ assert.Equal(t, chainConfigAfter2.Readers, otherChainConfig.Readers)
+ assert.Equal(t, chainConfigAfter2.Config, otherChainConfig.Config)
})
}
}
diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go
new file mode 100644
index 00000000000..f85814f1768
--- /dev/null
+++ b/deployment/ccip/changeset/cs_chain_contracts.go
@@ -0,0 +1,1129 @@
+package changeset
+
+import (
+ "bytes"
+ "context"
+ "encoding/hex"
+ "errors"
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
+ commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
+)
+
+var (
+ _ deployment.ChangeSet[UpdateOnRampDestsConfig] = UpdateOnRampsDests
+ _ deployment.ChangeSet[UpdateOffRampSourcesConfig] = UpdateOffRampSources
+ _ deployment.ChangeSet[UpdateRouterRampsConfig] = UpdateRouterRamps
+ _ deployment.ChangeSet[UpdateFeeQuoterDestsConfig] = UpdateFeeQuoterDests
+ _ deployment.ChangeSet[SetOCR3OffRampConfig] = SetOCR3OffRamp
+ _ deployment.ChangeSet[UpdateFeeQuoterPricesConfig] = UpdateFeeQuoterPricesCS
+ _ deployment.ChangeSet[UpdateNonceManagerConfig] = UpdateNonceManagersCS
+)
+
+type UpdateNonceManagerConfig struct {
+ UpdatesByChain map[uint64]NonceManagerUpdate // source -> dest -> update
+ MCMS *MCMSConfig
+}
+
+type NonceManagerUpdate struct {
+ AddedAuthCallers []common.Address
+ RemovedAuthCallers []common.Address
+ PreviousRampsArgs []PreviousRampCfg
+}
+
+type PreviousRampCfg struct {
+ RemoteChainSelector uint64
+ OverrideExisting bool
+ EnableOnRamp bool
+ EnableOffRamp bool
+}
+
+func (cfg UpdateNonceManagerConfig) Validate(e deployment.Environment) error {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return err
+ }
+ for sourceSel, update := range cfg.UpdatesByChain {
+ sourceChainState, ok := state.Chains[sourceSel]
+ if !ok {
+ return fmt.Errorf("chain %d not found in onchain state", sourceSel)
+ }
+ if sourceChainState.NonceManager == nil {
+ return fmt.Errorf("missing nonce manager for chain %d", sourceSel)
+ }
+ sourceChain, ok := e.Chains[sourceSel]
+ if !ok {
+ return fmt.Errorf("missing chain %d in environment", sourceSel)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, sourceChain.DeployerKey.From, sourceChainState.Timelock.Address(), sourceChainState.OnRamp); err != nil {
+ return fmt.Errorf("chain %s: %w", sourceChain.String(), err)
+ }
+ for _, prevRamp := range update.PreviousRampsArgs {
+ if prevRamp.RemoteChainSelector == sourceSel {
+ return errors.New("source and dest chain cannot be the same")
+ }
+ if _, ok := state.Chains[prevRamp.RemoteChainSelector]; !ok {
+ return fmt.Errorf("dest chain %d not found in onchain state for chain %d", prevRamp.RemoteChainSelector, sourceSel)
+ }
+ if !prevRamp.EnableOnRamp && !prevRamp.EnableOffRamp {
+ return errors.New("must specify either onramp or offramp")
+ }
+ if prevRamp.EnableOnRamp {
+ if prevOnRamp := state.Chains[sourceSel].EVM2EVMOnRamp; prevOnRamp == nil {
+ return fmt.Errorf("no previous onramp for source chain %d", sourceSel)
+ } else if prevOnRamp[prevRamp.RemoteChainSelector] == nil {
+ return fmt.Errorf("no previous onramp for source chain %d and dest chain %d", sourceSel, prevRamp.RemoteChainSelector)
+ }
+ }
+ if prevRamp.EnableOffRamp {
+ if prevOffRamp := state.Chains[sourceSel].EVM2EVMOffRamp; prevOffRamp == nil {
+ return fmt.Errorf("missing previous offramps for chain %d", sourceSel)
+ } else if prevOffRamp[prevRamp.RemoteChainSelector] == nil {
+ return fmt.Errorf("no previous offramp for source chain %d and dest chain %d", prevRamp.RemoteChainSelector, sourceSel)
+ }
+ }
+ }
+ }
+ return nil
+}
+
+func UpdateNonceManagersCS(e deployment.Environment, cfg UpdateNonceManagerConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ s, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ var batches []timelock.BatchChainOperation
+ timelocks := make(map[uint64]common.Address)
+ proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig)
+ for chainSel, updates := range cfg.UpdatesByChain {
+ txOpts := e.Chains[chainSel].DeployerKey
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ nm := s.Chains[chainSel].NonceManager
+ var authTx, prevRampsTx *types.Transaction
+ if len(updates.AddedAuthCallers) > 0 || len(updates.RemovedAuthCallers) > 0 {
+ authTx, err = nm.ApplyAuthorizedCallerUpdates(txOpts, nonce_manager.AuthorizedCallersAuthorizedCallerArgs{
+ AddedCallers: updates.AddedAuthCallers,
+ RemovedCallers: updates.RemovedAuthCallers,
+ })
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("error updating authorized callers for chain %s: %w", e.Chains[chainSel].String(), err)
+ }
+ }
+ if len(updates.PreviousRampsArgs) > 0 {
+ previousRampsArgs := make([]nonce_manager.NonceManagerPreviousRampsArgs, 0)
+ for _, prevRamp := range updates.PreviousRampsArgs {
+ var onRamp, offRamp common.Address
+ if prevRamp.EnableOnRamp {
+ onRamp = s.Chains[chainSel].EVM2EVMOnRamp[prevRamp.RemoteChainSelector].Address()
+ }
+ if prevRamp.EnableOffRamp {
+ offRamp = s.Chains[chainSel].EVM2EVMOffRamp[prevRamp.RemoteChainSelector].Address()
+ }
+ previousRampsArgs = append(previousRampsArgs, nonce_manager.NonceManagerPreviousRampsArgs{
+ RemoteChainSelector: prevRamp.RemoteChainSelector,
+ OverrideExistingRamps: prevRamp.OverrideExisting,
+ PrevRamps: nonce_manager.NonceManagerPreviousRamps{
+ PrevOnRamp: onRamp,
+ PrevOffRamp: offRamp,
+ },
+ })
+ }
+ prevRampsTx, err = nm.ApplyPreviousRampsUpdates(txOpts, previousRampsArgs)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("error updating previous ramps for chain %s: %w", e.Chains[chainSel].String(), err)
+ }
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("error updating previous ramps for chain %s: %w", e.Chains[chainSel].String(), err)
+ }
+ }
+ if cfg.MCMS == nil {
+ if authTx != nil {
+ if _, err := deployment.ConfirmIfNoError(e.Chains[chainSel], authTx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ }
+ if prevRampsTx != nil {
+ if _, err := deployment.ConfirmIfNoError(e.Chains[chainSel], prevRampsTx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ }
+ } else {
+ ops := make([]mcms.Operation, 0)
+ if authTx != nil {
+ ops = append(ops, mcms.Operation{
+ To: nm.Address(),
+ Data: authTx.Data(),
+ Value: big.NewInt(0),
+ })
+ }
+ if prevRampsTx != nil {
+ ops = append(ops, mcms.Operation{
+ To: nm.Address(),
+ Data: prevRampsTx.Data(),
+ Value: big.NewInt(0),
+ })
+ }
+ if len(ops) == 0 {
+ return deployment.ChangesetOutput{}, errors.New("no operations to batch")
+ }
+ batches = append(batches, timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(chainSel),
+ Batch: ops,
+ })
+ timelocks[chainSel] = s.Chains[chainSel].Timelock.Address()
+ proposers[chainSel] = s.Chains[chainSel].ProposerMcm
+ }
+ }
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ p, err := proposalutils.BuildProposalFromBatches(
+ timelocks,
+ proposers,
+ batches,
+ "Update nonce manager for previous ramps and authorized callers",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
+
+type UpdateOnRampDestsConfig struct {
+ UpdatesByChain map[uint64]map[uint64]OnRampDestinationUpdate
+ // Disallow mixing MCMS/non-MCMS per chain for simplicity.
+ // (can still be acheived by calling this function multiple times)
+ MCMS *MCMSConfig
+}
+
+type OnRampDestinationUpdate struct {
+ IsEnabled bool // If false, disables the destination by setting router to 0x0.
+ TestRouter bool // Flag for safety only allow specifying either router or testRouter.
+ AllowListEnabled bool
+}
+
+func (cfg UpdateOnRampDestsConfig) Validate(e deployment.Environment) error {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return err
+ }
+ supportedChains := state.SupportedChains()
+ for chainSel, updates := range cfg.UpdatesByChain {
+ chainState, ok := state.Chains[chainSel]
+ if !ok {
+ return fmt.Errorf("chain %d not found in onchain state", chainSel)
+ }
+ if chainState.TestRouter == nil {
+ return fmt.Errorf("missing test router for chain %d", chainSel)
+ }
+ if chainState.Router == nil {
+ return fmt.Errorf("missing router for chain %d", chainSel)
+ }
+ if chainState.OnRamp == nil {
+ return fmt.Errorf("missing onramp onramp for chain %d", chainSel)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, chainState.Timelock.Address(), chainState.OnRamp); err != nil {
+ return err
+ }
+
+ for destination := range updates {
+ // Destination cannot be an unknown destination.
+ if _, ok := supportedChains[destination]; !ok {
+ return fmt.Errorf("destination chain %d is not a supported %s", destination, chainState.OnRamp.Address())
+ }
+ sc, err := chainState.OnRamp.GetStaticConfig(&bind.CallOpts{Context: e.GetContext()})
+ if err != nil {
+ return fmt.Errorf("failed to get onramp static config %s: %w", chainState.OnRamp.Address(), err)
+ }
+ if destination == sc.ChainSelector {
+ return fmt.Errorf("cannot update onramp destination to the same chain")
+ }
+ }
+ }
+ return nil
+}
+
+// UpdateOnRampsDests updates the onramp destinations for each onramp
+// in the chains specified. Multichain support is important - consider when we add a new chain
+// and need to update the onramp destinations for all chains to support the new chain.
+func UpdateOnRampsDests(e deployment.Environment, cfg UpdateOnRampDestsConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ s, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ var batches []timelock.BatchChainOperation
+ timelocks := make(map[uint64]common.Address)
+ proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig)
+ for chainSel, updates := range cfg.UpdatesByChain {
+ txOpts := e.Chains[chainSel].DeployerKey
+ txOpts.Context = e.GetContext()
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ onRamp := s.Chains[chainSel].OnRamp
+ var args []onramp.OnRampDestChainConfigArgs
+ for destination, update := range updates {
+ router := common.HexToAddress("0x0")
+ // If not enabled, set router to 0x0.
+ if update.IsEnabled {
+ if update.TestRouter {
+ router = s.Chains[chainSel].TestRouter.Address()
+ } else {
+ router = s.Chains[chainSel].Router.Address()
+ }
+ }
+ args = append(args, onramp.OnRampDestChainConfigArgs{
+ DestChainSelector: destination,
+ Router: router,
+ AllowlistEnabled: update.AllowListEnabled,
+ })
+ }
+ tx, err := onRamp.ApplyDestChainConfigUpdates(txOpts, args)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if cfg.MCMS == nil {
+ if _, err := deployment.ConfirmIfNoError(e.Chains[chainSel], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ } else {
+ batches = append(batches, timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(chainSel),
+ Batch: []mcms.Operation{
+ {
+ To: onRamp.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ },
+ })
+ timelocks[chainSel] = s.Chains[chainSel].Timelock.Address()
+ proposers[chainSel] = s.Chains[chainSel].ProposerMcm
+ }
+ }
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ p, err := proposalutils.BuildProposalFromBatches(
+ timelocks,
+ proposers,
+ batches,
+ "Update onramp destinations",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
+
+type UpdateFeeQuoterPricesConfig struct {
+ PricesByChain map[uint64]FeeQuoterPriceUpdatePerSource // source -> PriceDetails
+ MCMS *MCMSConfig
+}
+
+type FeeQuoterPriceUpdatePerSource struct {
+ TokenPrices map[common.Address]*big.Int // token address -> price
+ GasPrices map[uint64]*big.Int // dest chain -> gas price
+}
+
+func (cfg UpdateFeeQuoterPricesConfig) Validate(e deployment.Environment) error {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return err
+ }
+ for chainSel, initialPrice := range cfg.PricesByChain {
+ if err := deployment.IsValidChainSelector(chainSel); err != nil {
+ return fmt.Errorf("invalid chain selector: %w", err)
+ }
+ chainState, ok := state.Chains[chainSel]
+ if !ok {
+ return fmt.Errorf("chain %d not found in onchain state", chainSel)
+ }
+ fq := chainState.FeeQuoter
+ if fq == nil {
+ return fmt.Errorf("missing fee quoter for chain %d", chainSel)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, chainState.Timelock.Address(), chainState.FeeQuoter); err != nil {
+ return err
+ }
+ // check that whether price updaters are set
+ authCallers, err := fq.GetAllAuthorizedCallers(&bind.CallOpts{Context: e.GetContext()})
+ if err != nil {
+ return fmt.Errorf("failed to get authorized callers for chain %d: %w", chainSel, err)
+ }
+ if len(authCallers) == 0 {
+ return fmt.Errorf("no authorized callers for chain %d", chainSel)
+ }
+ expectedAuthCaller := e.Chains[chainSel].DeployerKey.From
+ if cfg.MCMS != nil {
+ expectedAuthCaller = chainState.Timelock.Address()
+ }
+ foundCaller := false
+ for _, authCaller := range authCallers {
+ if authCaller.Cmp(expectedAuthCaller) == 0 {
+ foundCaller = true
+ }
+ }
+ if !foundCaller {
+ return fmt.Errorf("expected authorized caller %s not found for chain %d", expectedAuthCaller.String(), chainSel)
+ }
+ for token, price := range initialPrice.TokenPrices {
+ if price == nil {
+ return fmt.Errorf("token price for chain %d is nil", chainSel)
+ }
+ if token == (common.Address{}) {
+ return fmt.Errorf("token address for chain %d is empty", chainSel)
+ }
+ contains, err := deployment.AddressBookContains(e.ExistingAddresses, chainSel, token.String())
+ if err != nil {
+ return fmt.Errorf("error checking address book for token %s: %w", token.String(), err)
+ }
+ if !contains {
+ return fmt.Errorf("token %s not found in address book for chain %d", token.String(), chainSel)
+ }
+ }
+ for dest, price := range initialPrice.GasPrices {
+ if chainSel == dest {
+ return errors.New("source and dest chain cannot be the same")
+ }
+ if err := deployment.IsValidChainSelector(dest); err != nil {
+ return fmt.Errorf("invalid dest chain selector: %w", err)
+ }
+ if price == nil {
+ return fmt.Errorf("gas price for chain %d is nil", chainSel)
+ }
+ if _, ok := state.Chains[dest]; !ok {
+ return fmt.Errorf("dest chain %d not found in onchain state for chain %d", dest, chainSel)
+ }
+ }
+ }
+
+ return nil
+}
+
+func UpdateFeeQuoterPricesCS(e deployment.Environment, cfg UpdateFeeQuoterPricesConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ s, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ var batches []timelock.BatchChainOperation
+ timelocks := make(map[uint64]common.Address)
+ proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig)
+ for chainSel, initialPrice := range cfg.PricesByChain {
+ txOpts := e.Chains[chainSel].DeployerKey
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ fq := s.Chains[chainSel].FeeQuoter
+ var tokenPricesArgs []fee_quoter.InternalTokenPriceUpdate
+ for token, price := range initialPrice.TokenPrices {
+ tokenPricesArgs = append(tokenPricesArgs, fee_quoter.InternalTokenPriceUpdate{
+ SourceToken: token,
+ UsdPerToken: price,
+ })
+ }
+ var gasPricesArgs []fee_quoter.InternalGasPriceUpdate
+ for dest, price := range initialPrice.GasPrices {
+ gasPricesArgs = append(gasPricesArgs, fee_quoter.InternalGasPriceUpdate{
+ DestChainSelector: dest,
+ UsdPerUnitGas: price,
+ })
+ }
+ tx, err := fq.UpdatePrices(txOpts, fee_quoter.InternalPriceUpdates{
+ TokenPriceUpdates: tokenPricesArgs,
+ GasPriceUpdates: gasPricesArgs,
+ })
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("error updating prices for chain %s: %w", e.Chains[chainSel].String(), err)
+ }
+ if cfg.MCMS == nil {
+ if _, err := deployment.ConfirmIfNoError(e.Chains[chainSel], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("error confirming transaction for chain %s: %w", e.Chains[chainSel].String(), err)
+ }
+ } else {
+ batches = append(batches, timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(chainSel),
+ Batch: []mcms.Operation{
+ {
+ To: fq.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ },
+ })
+ }
+ }
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ p, err := proposalutils.BuildProposalFromBatches(
+ timelocks,
+ proposers,
+ batches,
+ "Update fq prices",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
+
+type UpdateFeeQuoterDestsConfig struct {
+ UpdatesByChain map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig
+ // Disallow mixing MCMS/non-MCMS per chain for simplicity.
+ // (can still be acheived by calling this function multiple times)
+ MCMS *MCMSConfig
+}
+
+func (cfg UpdateFeeQuoterDestsConfig) Validate(e deployment.Environment) error {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return err
+ }
+ supportedChains := state.SupportedChains()
+ for chainSel, updates := range cfg.UpdatesByChain {
+ chainState, ok := state.Chains[chainSel]
+ if !ok {
+ return fmt.Errorf("chain %d not found in onchain state", chainSel)
+ }
+ if chainState.TestRouter == nil {
+ return fmt.Errorf("missing test router for chain %d", chainSel)
+ }
+ if chainState.Router == nil {
+ return fmt.Errorf("missing router for chain %d", chainSel)
+ }
+ if chainState.OnRamp == nil {
+ return fmt.Errorf("missing onramp onramp for chain %d", chainSel)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, chainState.Timelock.Address(), chainState.FeeQuoter); err != nil {
+ return err
+ }
+
+ for destination := range updates {
+ // Destination cannot be an unknown destination.
+ if _, ok := supportedChains[destination]; !ok {
+ return fmt.Errorf("destination chain %d is not a supported %s", destination, chainState.OnRamp.Address())
+ }
+ sc, err := chainState.OnRamp.GetStaticConfig(&bind.CallOpts{Context: e.GetContext()})
+ if err != nil {
+ return fmt.Errorf("failed to get onramp static config %s: %w", chainState.OnRamp.Address(), err)
+ }
+ if destination == sc.ChainSelector {
+ return fmt.Errorf("source and destination chain cannot be the same")
+ }
+ }
+ }
+ return nil
+}
+
+func UpdateFeeQuoterDests(e deployment.Environment, cfg UpdateFeeQuoterDestsConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ s, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ var batches []timelock.BatchChainOperation
+ timelocks := make(map[uint64]common.Address)
+ proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig)
+ for chainSel, updates := range cfg.UpdatesByChain {
+ txOpts := e.Chains[chainSel].DeployerKey
+ txOpts.Context = e.GetContext()
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ fq := s.Chains[chainSel].FeeQuoter
+ var args []fee_quoter.FeeQuoterDestChainConfigArgs
+ for destination, dc := range updates {
+ args = append(args, fee_quoter.FeeQuoterDestChainConfigArgs{
+ DestChainSelector: destination,
+ DestChainConfig: dc,
+ })
+ }
+ tx, err := fq.ApplyDestChainConfigUpdates(txOpts, args)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if cfg.MCMS == nil {
+ if _, err := deployment.ConfirmIfNoError(e.Chains[chainSel], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ } else {
+ batches = append(batches, timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(chainSel),
+ Batch: []mcms.Operation{
+ {
+ To: fq.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ },
+ })
+ timelocks[chainSel] = s.Chains[chainSel].Timelock.Address()
+ proposers[chainSel] = s.Chains[chainSel].ProposerMcm
+ }
+ }
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ p, err := proposalutils.BuildProposalFromBatches(
+ timelocks,
+ proposers,
+ batches,
+ "Update fq destinations",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
+
+type UpdateOffRampSourcesConfig struct {
+ UpdatesByChain map[uint64]map[uint64]OffRampSourceUpdate
+ MCMS *MCMSConfig
+}
+
+type OffRampSourceUpdate struct {
+ IsEnabled bool // If false, disables the source by setting router to 0x0.
+ TestRouter bool // Flag for safety only allow specifying either router or testRouter.
+}
+
+func (cfg UpdateOffRampSourcesConfig) Validate(e deployment.Environment) error {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return err
+ }
+ supportedChains := state.SupportedChains()
+ for chainSel, updates := range cfg.UpdatesByChain {
+ chainState, ok := state.Chains[chainSel]
+ if !ok {
+ return fmt.Errorf("chain %d not found in onchain state", chainSel)
+ }
+ if chainState.TestRouter == nil {
+ return fmt.Errorf("missing test router for chain %d", chainSel)
+ }
+ if chainState.Router == nil {
+ return fmt.Errorf("missing router for chain %d", chainSel)
+ }
+ if chainState.OffRamp == nil {
+ return fmt.Errorf("missing onramp onramp for chain %d", chainSel)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, chainState.Timelock.Address(), chainState.OffRamp); err != nil {
+ return err
+ }
+
+ for source := range updates {
+ // Source cannot be an unknown
+ if _, ok := supportedChains[source]; !ok {
+ return fmt.Errorf("source chain %d is not a supported chain %s", source, chainState.OffRamp.Address())
+ }
+
+ if source == chainSel {
+ return fmt.Errorf("cannot update offramp source to the same chain %d", source)
+ }
+ sourceChain := state.Chains[source]
+ // Source chain must have the onramp deployed.
+ // Note this also validates the specified source selector.
+ if sourceChain.OnRamp == nil {
+ return fmt.Errorf("missing onramp for source %d", source)
+ }
+ }
+ }
+ return nil
+}
+
+// UpdateOffRampSources updates the offramp sources for each offramp.
+func UpdateOffRampSources(e deployment.Environment, cfg UpdateOffRampSourcesConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ s, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ var batches []timelock.BatchChainOperation
+ timelocks := make(map[uint64]common.Address)
+ proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig)
+ for chainSel, updates := range cfg.UpdatesByChain {
+ txOpts := e.Chains[chainSel].DeployerKey
+ txOpts.Context = e.GetContext()
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ offRamp := s.Chains[chainSel].OffRamp
+ var args []offramp.OffRampSourceChainConfigArgs
+ for source, update := range updates {
+ router := common.HexToAddress("0x0")
+ if update.IsEnabled {
+ if update.TestRouter {
+ router = s.Chains[chainSel].TestRouter.Address()
+ } else {
+ router = s.Chains[chainSel].Router.Address()
+ }
+ }
+ onRamp := s.Chains[source].OnRamp
+ args = append(args, offramp.OffRampSourceChainConfigArgs{
+ SourceChainSelector: source,
+ Router: router,
+ IsEnabled: update.IsEnabled,
+ OnRamp: common.LeftPadBytes(onRamp.Address().Bytes(), 32),
+ })
+ }
+ tx, err := offRamp.ApplySourceChainConfigUpdates(txOpts, args)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if cfg.MCMS == nil {
+ if _, err := deployment.ConfirmIfNoError(e.Chains[chainSel], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ } else {
+ batches = append(batches, timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(chainSel),
+ Batch: []mcms.Operation{
+ {
+ To: offRamp.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ },
+ })
+ timelocks[chainSel] = s.Chains[chainSel].Timelock.Address()
+ proposers[chainSel] = s.Chains[chainSel].ProposerMcm
+ }
+ }
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ p, err := proposalutils.BuildProposalFromBatches(
+ timelocks,
+ proposers,
+ batches,
+ "Update offramp sources",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
+
+type UpdateRouterRampsConfig struct {
+ // TestRouter means the updates will be applied to the test router
+ // on all chains. Disallow mixing test router/non-test router per chain for simplicity.
+ TestRouter bool
+ UpdatesByChain map[uint64]RouterUpdates
+ MCMS *MCMSConfig
+}
+
+type RouterUpdates struct {
+ OffRampUpdates map[uint64]bool
+ OnRampUpdates map[uint64]bool
+}
+
+func (cfg UpdateRouterRampsConfig) Validate(e deployment.Environment) error {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return err
+ }
+ supportedChains := state.SupportedChains()
+ for chainSel, update := range cfg.UpdatesByChain {
+ chainState, ok := state.Chains[chainSel]
+ if !ok {
+ return fmt.Errorf("chain %d not found in onchain state", chainSel)
+ }
+ if chainState.TestRouter == nil {
+ return fmt.Errorf("missing test router for chain %d", chainSel)
+ }
+ if chainState.Router == nil {
+ return fmt.Errorf("missing router for chain %d", chainSel)
+ }
+ if chainState.OffRamp == nil {
+ return fmt.Errorf("missing onramp onramp for chain %d", chainSel)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, chainState.Timelock.Address(), chainState.Router); err != nil {
+ return err
+ }
+
+ for source := range update.OffRampUpdates {
+ // Source cannot be an unknown
+ if _, ok := supportedChains[source]; !ok {
+ return fmt.Errorf("source chain %d is not a supported chain %s", source, chainState.OffRamp.Address())
+ }
+ if source == chainSel {
+ return fmt.Errorf("cannot update offramp source to the same chain %d", source)
+ }
+ sourceChain := state.Chains[source]
+ // Source chain must have the onramp deployed.
+ // Note this also validates the specified source selector.
+ if sourceChain.OnRamp == nil {
+ return fmt.Errorf("missing onramp for source %d", source)
+ }
+ }
+ for destination := range update.OnRampUpdates {
+ // Source cannot be an unknown
+ if _, ok := supportedChains[destination]; !ok {
+ return fmt.Errorf("dest chain %d is not a supported chain %s", destination, chainState.OffRamp.Address())
+ }
+ if destination == chainSel {
+ return fmt.Errorf("cannot update onRamp dest to the same chain %d", destination)
+ }
+ destChain := state.Chains[destination]
+ if destChain.OffRamp == nil {
+ return fmt.Errorf("missing offramp for dest %d", destination)
+ }
+ }
+
+ }
+ return nil
+}
+
+// UpdateRouterRamps updates the on/offramps
+// in either the router or test router for a series of chains. Use cases include:
+// - Ramp upgrade. After deploying new ramps you can enable them on the test router and
+// ensure it works e2e. Then enable the ramps on the real router.
+// - New chain support. When adding a new chain, you can enable the new destination
+// on all chains to support the new chain through the test router first. Once tested,
+// Enable the new destination on the real router.
+func UpdateRouterRamps(e deployment.Environment, cfg UpdateRouterRampsConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ s, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ var batches []timelock.BatchChainOperation
+ timelocks := make(map[uint64]common.Address)
+ proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig)
+ for chainSel, update := range cfg.UpdatesByChain {
+ txOpts := e.Chains[chainSel].DeployerKey
+ txOpts.Context = e.GetContext()
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ routerC := s.Chains[chainSel].Router
+ if cfg.TestRouter {
+ routerC = s.Chains[chainSel].TestRouter
+ }
+ // Note if we add distinct offramps per source to the state,
+ // we'll need to add support here for looking them up.
+ // For now its simple, all sources use the same offramp.
+ offRamp := s.Chains[chainSel].OffRamp
+ var removes, adds []router.RouterOffRamp
+ for source, enabled := range update.OffRampUpdates {
+ if enabled {
+ adds = append(adds, router.RouterOffRamp{
+ SourceChainSelector: source,
+ OffRamp: offRamp.Address(),
+ })
+ } else {
+ removes = append(removes, router.RouterOffRamp{
+ SourceChainSelector: source,
+ OffRamp: offRamp.Address(),
+ })
+ }
+ }
+ // Ditto here, only one onramp expected until 1.7.
+ onRamp := s.Chains[chainSel].OnRamp
+ var onRampUpdates []router.RouterOnRamp
+ for dest, enabled := range update.OnRampUpdates {
+ if enabled {
+ onRampUpdates = append(onRampUpdates, router.RouterOnRamp{
+ DestChainSelector: dest,
+ OnRamp: onRamp.Address(),
+ })
+ } else {
+ onRampUpdates = append(onRampUpdates, router.RouterOnRamp{
+ DestChainSelector: dest,
+ OnRamp: common.HexToAddress("0x0"),
+ })
+ }
+ }
+ tx, err := routerC.ApplyRampUpdates(txOpts, onRampUpdates, removes, adds)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if cfg.MCMS == nil {
+ if _, err := deployment.ConfirmIfNoError(e.Chains[chainSel], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ } else {
+ batches = append(batches, timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(chainSel),
+ Batch: []mcms.Operation{
+ {
+ To: routerC.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ },
+ })
+ timelocks[chainSel] = s.Chains[chainSel].Timelock.Address()
+ proposers[chainSel] = s.Chains[chainSel].ProposerMcm
+ }
+ }
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+
+ p, err := proposalutils.BuildProposalFromBatches(
+ timelocks,
+ proposers,
+ batches,
+ "Update router offramps",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
+
+type SetOCR3OffRampConfig struct {
+ HomeChainSel uint64
+ RemoteChainSels []uint64
+ MCMS *MCMSConfig
+}
+
+func (c SetOCR3OffRampConfig) Validate(e deployment.Environment) error {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return err
+ }
+ if _, ok := state.Chains[c.HomeChainSel]; !ok {
+ return fmt.Errorf("home chain %d not found in onchain state", c.HomeChainSel)
+ }
+ for _, remote := range c.RemoteChainSels {
+ chainState, ok := state.Chains[remote]
+ if !ok {
+ return fmt.Errorf("remote chain %d not found in onchain state", remote)
+ }
+ if err := commoncs.ValidateOwnership(e.GetContext(), c.MCMS != nil, e.Chains[remote].DeployerKey.From, chainState.Timelock.Address(), chainState.OffRamp); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// SetOCR3OffRamp will set the OCR3 offramp for the given chain.
+// to the active configuration on CCIPHome. This
+// is used to complete the candidate->active promotion cycle, it's
+// run after the candidate is confirmed to be working correctly.
+// Multichain is especially helpful for NOP rotations where we have
+// to touch all the chain to change signers.
+func SetOCR3OffRamp(e deployment.Environment, cfg SetOCR3OffRampConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ var batches []timelock.BatchChainOperation
+ timelocks := make(map[uint64]common.Address)
+ proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig)
+ for _, remote := range cfg.RemoteChainSels {
+ donID, err := internal.DonIDForChain(
+ state.Chains[cfg.HomeChainSel].CapabilityRegistry,
+ state.Chains[cfg.HomeChainSel].CCIPHome,
+ remote)
+ args, err := internal.BuildSetOCR3ConfigArgs(donID, state.Chains[cfg.HomeChainSel].CCIPHome, remote)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ set, err := isOCR3ConfigSetOnOffRamp(e.Logger, e.Chains[remote], state.Chains[remote].OffRamp, args)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if set {
+ e.Logger.Infof("OCR3 config already set on offramp for chain %d", remote)
+ continue
+ }
+ txOpts := e.Chains[remote].DeployerKey
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ offRamp := state.Chains[remote].OffRamp
+ tx, err := offRamp.SetOCR3Configs(txOpts, args)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if cfg.MCMS == nil {
+ if _, err := deployment.ConfirmIfNoError(e.Chains[remote], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ } else {
+ batches = append(batches, timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(remote),
+ Batch: []mcms.Operation{
+ {
+ To: offRamp.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ },
+ })
+ timelocks[remote] = state.Chains[remote].Timelock.Address()
+ proposers[remote] = state.Chains[remote].ProposerMcm
+ }
+ }
+ if cfg.MCMS == nil {
+ return deployment.ChangesetOutput{}, nil
+ }
+ p, err := proposalutils.BuildProposalFromBatches(
+ timelocks,
+ proposers,
+ batches,
+ "Update OCR3 config",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("Proposing OCR3 config update for", cfg.RemoteChainSels)
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
+
+func isOCR3ConfigSetOnOffRamp(
+ lggr logger.Logger,
+ chain deployment.Chain,
+ offRamp *offramp.OffRamp,
+ offrampOCR3Configs []offramp.MultiOCR3BaseOCRConfigArgs,
+) (bool, error) {
+ mapOfframpOCR3Configs := make(map[cctypes.PluginType]offramp.MultiOCR3BaseOCRConfigArgs)
+ for _, config := range offrampOCR3Configs {
+ mapOfframpOCR3Configs[cctypes.PluginType(config.OcrPluginType)] = config
+ }
+
+ for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} {
+ ocrConfig, err := offRamp.LatestConfigDetails(&bind.CallOpts{
+ Context: context.Background(),
+ }, uint8(pluginType))
+ if err != nil {
+ return false, fmt.Errorf("error fetching OCR3 config for plugin %s chain %s: %w", pluginType.String(), chain.String(), err)
+ }
+ lggr.Debugw("Fetched OCR3 Configs",
+ "MultiOCR3BaseOCRConfig.F", ocrConfig.ConfigInfo.F,
+ "MultiOCR3BaseOCRConfig.N", ocrConfig.ConfigInfo.N,
+ "MultiOCR3BaseOCRConfig.IsSignatureVerificationEnabled", ocrConfig.ConfigInfo.IsSignatureVerificationEnabled,
+ "Signers", ocrConfig.Signers,
+ "Transmitters", ocrConfig.Transmitters,
+ "configDigest", hex.EncodeToString(ocrConfig.ConfigInfo.ConfigDigest[:]),
+ "chain", chain.String(),
+ )
+ // TODO: assertions to be done as part of full state
+ // resprentation validation CCIP-3047
+ if mapOfframpOCR3Configs[pluginType].ConfigDigest != ocrConfig.ConfigInfo.ConfigDigest {
+ lggr.Infow("OCR3 config digest mismatch", "pluginType", pluginType.String())
+ return false, nil
+ }
+ if mapOfframpOCR3Configs[pluginType].F != ocrConfig.ConfigInfo.F {
+ lggr.Infow("OCR3 config F mismatch", "pluginType", pluginType.String())
+ return false, nil
+ }
+ if mapOfframpOCR3Configs[pluginType].IsSignatureVerificationEnabled != ocrConfig.ConfigInfo.IsSignatureVerificationEnabled {
+ lggr.Infow("OCR3 config signature verification mismatch", "pluginType", pluginType.String())
+ return false, nil
+ }
+ if pluginType == cctypes.PluginTypeCCIPCommit {
+ // only commit will set signers, exec doesn't need them.
+ for i, signer := range mapOfframpOCR3Configs[pluginType].Signers {
+ if !bytes.Equal(signer.Bytes(), ocrConfig.Signers[i].Bytes()) {
+ lggr.Infow("OCR3 config signer mismatch", "pluginType", pluginType.String())
+ return false, nil
+ }
+ }
+ }
+ for i, transmitter := range mapOfframpOCR3Configs[pluginType].Transmitters {
+ if !bytes.Equal(transmitter.Bytes(), ocrConfig.Transmitters[i].Bytes()) {
+ lggr.Infow("OCR3 config transmitter mismatch", "pluginType", pluginType.String())
+ return false, nil
+ }
+ }
+ }
+ return true, nil
+}
+
+func DefaultFeeQuoterDestChainConfig() fee_quoter.FeeQuoterDestChainConfig {
+ // https://github.com/smartcontractkit/ccip/blob/c4856b64bd766f1ddbaf5d13b42d3c4b12efde3a/contracts/src/v0.8/ccip/libraries/Internal.sol#L337-L337
+ /*
+ ```Solidity
+ // bytes4(keccak256("CCIP ChainFamilySelector EVM"))
+ bytes4 public constant CHAIN_FAMILY_SELECTOR_EVM = 0x2812d52c;
+ ```
+ */
+ evmFamilySelector, _ := hex.DecodeString("2812d52c")
+ return fee_quoter.FeeQuoterDestChainConfig{
+ IsEnabled: true,
+ MaxNumberOfTokensPerMsg: 10,
+ MaxDataBytes: 256,
+ MaxPerMsgGasLimit: 3_000_000,
+ DestGasOverhead: ccipevm.DestGasOverhead,
+ DefaultTokenFeeUSDCents: 1,
+ DestGasPerPayloadByte: ccipevm.CalldataGasPerByte,
+ DestDataAvailabilityOverheadGas: 100,
+ DestGasPerDataAvailabilityByte: 100,
+ DestDataAvailabilityMultiplierBps: 1,
+ DefaultTokenDestGasOverhead: 125_000,
+ DefaultTxGasLimit: 200_000,
+ GasMultiplierWeiPerEth: 11e17, // Gas multiplier in wei per eth is scaled by 1e18, so 11e17 is 1.1 = 110%
+ NetworkFeeUSDCents: 1,
+ ChainFamilySelector: [4]byte(evmFamilySelector),
+ }
+}
diff --git a/deployment/ccip/changeset/cs_chain_contracts_test.go b/deployment/ccip/changeset/cs_chain_contracts_test.go
new file mode 100644
index 00000000000..0a1e0ce3b7b
--- /dev/null
+++ b/deployment/ccip/changeset/cs_chain_contracts_test.go
@@ -0,0 +1,364 @@
+package changeset
+
+import (
+ "testing"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/require"
+ "golang.org/x/exp/maps"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
+
+ commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
+)
+
+func TestUpdateOnRampsDests(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ mcmsEnabled bool
+ }{
+ {
+ name: "MCMS enabled",
+ mcmsEnabled: true,
+ },
+ {
+ name: "MCMS disabled",
+ mcmsEnabled: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ ctx := testcontext.Get(t)
+ // Default env just has 2 chains with all contracts
+ // deployed but no lanes.
+ tenv := NewMemoryEnvironment(t)
+ state, err := LoadOnchainState(tenv.Env)
+ require.NoError(t, err)
+
+ allChains := maps.Keys(tenv.Env.Chains)
+ source := allChains[0]
+ dest := allChains[1]
+
+ if tc.mcmsEnabled {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ transferToTimelock(t, tenv, state, source, dest)
+ }
+
+ var mcmsConfig *MCMSConfig
+ if tc.mcmsEnabled {
+ mcmsConfig = &MCMSConfig{
+ MinDelay: 0,
+ }
+ }
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(UpdateOnRampsDests),
+ Config: UpdateOnRampDestsConfig{
+ UpdatesByChain: map[uint64]map[uint64]OnRampDestinationUpdate{
+ source: {
+ dest: {
+ IsEnabled: true,
+ TestRouter: true,
+ AllowListEnabled: false,
+ },
+ },
+ dest: {
+ source: {
+ IsEnabled: true,
+ TestRouter: false,
+ AllowListEnabled: true,
+ },
+ },
+ },
+ MCMS: mcmsConfig,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // Assert the onramp configuration is as we expect.
+ sourceCfg, err := state.Chains[source].OnRamp.GetDestChainConfig(&bind.CallOpts{Context: ctx}, dest)
+ require.NoError(t, err)
+ require.Equal(t, state.Chains[source].TestRouter.Address(), sourceCfg.Router)
+ require.Equal(t, false, sourceCfg.AllowlistEnabled)
+ destCfg, err := state.Chains[dest].OnRamp.GetDestChainConfig(&bind.CallOpts{Context: ctx}, source)
+ require.NoError(t, err)
+ require.Equal(t, state.Chains[dest].Router.Address(), destCfg.Router)
+ require.Equal(t, true, destCfg.AllowlistEnabled)
+ })
+ }
+}
+
+func TestUpdateOffRampsSources(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ mcmsEnabled bool
+ }{
+ {
+ name: "MCMS enabled",
+ mcmsEnabled: true,
+ },
+ {
+ name: "MCMS disabled",
+ mcmsEnabled: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ ctx := testcontext.Get(t)
+ tenv := NewMemoryEnvironment(t)
+ state, err := LoadOnchainState(tenv.Env)
+ require.NoError(t, err)
+
+ allChains := maps.Keys(tenv.Env.Chains)
+ source := allChains[0]
+ dest := allChains[1]
+
+ if tc.mcmsEnabled {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ transferToTimelock(t, tenv, state, source, dest)
+ }
+
+ var mcmsConfig *MCMSConfig
+ if tc.mcmsEnabled {
+ mcmsConfig = &MCMSConfig{
+ MinDelay: 0,
+ }
+ }
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(UpdateOffRampSources),
+ Config: UpdateOffRampSourcesConfig{
+ UpdatesByChain: map[uint64]map[uint64]OffRampSourceUpdate{
+ source: {
+ dest: {
+ IsEnabled: true,
+ TestRouter: true,
+ },
+ },
+ dest: {
+ source: {
+ IsEnabled: true,
+ TestRouter: false,
+ },
+ },
+ },
+ MCMS: mcmsConfig,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // Assert the offramp configuration is as we expect.
+ sourceCfg, err := state.Chains[source].OffRamp.GetSourceChainConfig(&bind.CallOpts{Context: ctx}, dest)
+ require.NoError(t, err)
+ require.Equal(t, state.Chains[source].TestRouter.Address(), sourceCfg.Router)
+ destCfg, err := state.Chains[dest].OffRamp.GetSourceChainConfig(&bind.CallOpts{Context: ctx}, source)
+ require.NoError(t, err)
+ require.Equal(t, state.Chains[dest].Router.Address(), destCfg.Router)
+ })
+ }
+}
+
+func TestUpdateFQDests(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ mcmsEnabled bool
+ }{
+ {
+ name: "MCMS enabled",
+ mcmsEnabled: true,
+ },
+ {
+ name: "MCMS disabled",
+ mcmsEnabled: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ ctx := testcontext.Get(t)
+ tenv := NewMemoryEnvironment(t)
+ state, err := LoadOnchainState(tenv.Env)
+ require.NoError(t, err)
+
+ allChains := maps.Keys(tenv.Env.Chains)
+ source := allChains[0]
+ dest := allChains[1]
+
+ if tc.mcmsEnabled {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ transferToTimelock(t, tenv, state, source, dest)
+ }
+
+ var mcmsConfig *MCMSConfig
+ if tc.mcmsEnabled {
+ mcmsConfig = &MCMSConfig{
+ MinDelay: 0,
+ }
+ }
+
+ fqCfg1 := DefaultFeeQuoterDestChainConfig()
+ fqCfg2 := DefaultFeeQuoterDestChainConfig()
+ fqCfg2.DestGasOverhead = 1000
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(UpdateFeeQuoterDests),
+ Config: UpdateFeeQuoterDestsConfig{
+ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{
+ source: {
+ dest: fqCfg1,
+ },
+ dest: {
+ source: fqCfg2,
+ },
+ },
+ MCMS: mcmsConfig,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // Assert the fq configuration is as we expect.
+ source2destCfg, err := state.Chains[source].FeeQuoter.GetDestChainConfig(&bind.CallOpts{Context: ctx}, dest)
+ require.NoError(t, err)
+ AssertEqualFeeConfig(t, fqCfg1, source2destCfg)
+ dest2sourceCfg, err := state.Chains[dest].FeeQuoter.GetDestChainConfig(&bind.CallOpts{Context: ctx}, source)
+ require.NoError(t, err)
+ AssertEqualFeeConfig(t, fqCfg2, dest2sourceCfg)
+ })
+ }
+}
+
+func TestUpdateRouterRamps(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ mcmsEnabled bool
+ }{
+ {
+ name: "MCMS enabled",
+ mcmsEnabled: true,
+ },
+ {
+ name: "MCMS disabled",
+ mcmsEnabled: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ ctx := testcontext.Get(t)
+ tenv := NewMemoryEnvironment(t)
+ state, err := LoadOnchainState(tenv.Env)
+ require.NoError(t, err)
+
+ allChains := maps.Keys(tenv.Env.Chains)
+ source := allChains[0]
+ dest := allChains[1]
+
+ if tc.mcmsEnabled {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ transferToTimelock(t, tenv, state, source, dest)
+ }
+
+ var mcmsConfig *MCMSConfig
+ if tc.mcmsEnabled {
+ mcmsConfig = &MCMSConfig{
+ MinDelay: 0,
+ }
+ }
+
+ // Updates test router.
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(UpdateRouterRamps),
+ Config: UpdateRouterRampsConfig{
+ TestRouter: true,
+ UpdatesByChain: map[uint64]RouterUpdates{
+ source: {
+ OffRampUpdates: map[uint64]bool{
+ dest: true,
+ },
+ OnRampUpdates: map[uint64]bool{
+ dest: true,
+ },
+ },
+ dest: {
+ OffRampUpdates: map[uint64]bool{
+ source: true,
+ },
+ OnRampUpdates: map[uint64]bool{
+ source: true,
+ },
+ },
+ },
+ MCMS: mcmsConfig,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // Assert the router configuration is as we expect.
+ source2destOnRampTest, err := state.Chains[source].TestRouter.GetOnRamp(&bind.CallOpts{Context: ctx}, dest)
+ require.NoError(t, err)
+ require.Equal(t, state.Chains[source].OnRamp.Address(), source2destOnRampTest)
+ source2destOnRampReal, err := state.Chains[source].Router.GetOnRamp(&bind.CallOpts{Context: ctx}, dest)
+ require.NoError(t, err)
+ require.Equal(t, common.HexToAddress("0x0"), source2destOnRampReal)
+ })
+ }
+}
+
+func TestUpdateNonceManagersCS(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ mcmsEnabled bool
+ }{
+ {
+ name: "MCMS enabled",
+ mcmsEnabled: true,
+ },
+ {
+ name: "MCMS disabled",
+ mcmsEnabled: false,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ tenv := NewMemoryEnvironment(t)
+ state, err := LoadOnchainState(tenv.Env)
+ require.NoError(t, err)
+
+ allChains := maps.Keys(tenv.Env.Chains)
+ source := allChains[0]
+ dest := allChains[1]
+
+ if tc.mcmsEnabled {
+ // Transfer ownership to timelock so that we can promote the zero digest later down the line.
+ transferToTimelock(t, tenv, state, source, dest)
+ }
+
+ var mcmsConfig *MCMSConfig
+ if tc.mcmsEnabled {
+ mcmsConfig = &MCMSConfig{
+ MinDelay: 0,
+ }
+ }
+
+ _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(UpdateNonceManagersCS),
+ Config: UpdateNonceManagerConfig{
+ UpdatesByChain: map[uint64]NonceManagerUpdate{
+ source: {
+ RemovedAuthCallers: []common.Address{state.Chains[source].OnRamp.Address()},
+ },
+ },
+ MCMS: mcmsConfig,
+ },
+ },
+ })
+ require.NoError(t, err)
+ // Assert the nonce manager configuration is as we expect.
+ callers, err := state.Chains[source].NonceManager.GetAllAuthorizedCallers(nil)
+ require.NoError(t, err)
+ require.NotContains(t, callers, state.Chains[source].OnRamp.Address())
+ require.Contains(t, callers, state.Chains[source].OffRamp.Address())
+ })
+ }
+}
diff --git a/deployment/ccip/changeset/cs_deploy_chain.go b/deployment/ccip/changeset/cs_deploy_chain.go
index 5acb8e15307..5a6085202a9 100644
--- a/deployment/ccip/changeset/cs_deploy_chain.go
+++ b/deployment/ccip/changeset/cs_deploy_chain.go
@@ -14,12 +14,10 @@ import (
"github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
)
@@ -31,6 +29,10 @@ var _ deployment.ChangeSet[DeployChainContractsConfig] = DeployChainContracts
// DeployChainContracts is idempotent. If there is an error, it will return the successfully deployed addresses and the error so that the caller can call the
// changeset again with the same input to retry the failed deployment.
// Caller should update the environment's address book with the returned addresses.
+// Points to note :
+// In case of migrating from legacy ccip to 1.6, the previous RMN address should be set while deploying RMNRemote.
+// if there is no existing RMN address found, RMNRemote will be deployed with 0x0 address for previous RMN address
+// which will set RMN to 0x0 address immutably in RMNRemote.
func DeployChainContracts(env deployment.Environment, c DeployChainContractsConfig) (deployment.ChangesetOutput, error) {
if err := c.Validate(); err != nil {
return deployment.ChangesetOutput{}, fmt.Errorf("invalid DeployChainContractsConfig: %w", err)
@@ -173,24 +175,21 @@ func deployChainContracts(
if chainState.Router == nil {
return fmt.Errorf("router not found for chain %s, deploy the prerequisites first", chain.String())
}
- if chainState.Receiver == nil {
- _, err := deployment.DeployContract(e.Logger, chain, ab,
- func(chain deployment.Chain) deployment.ContractDeploy[*maybe_revert_message_receiver.MaybeRevertMessageReceiver] {
- receiverAddr, tx, receiver, err2 := maybe_revert_message_receiver.DeployMaybeRevertMessageReceiver(
- chain.DeployerKey,
- chain.Client,
- false,
- )
- return deployment.ContractDeploy[*maybe_revert_message_receiver.MaybeRevertMessageReceiver]{
- receiverAddr, receiver, tx, deployment.NewTypeAndVersion(CCIPReceiver, deployment.Version1_0_0), err2,
- }
- })
- if err != nil {
- e.Logger.Errorw("Failed to deploy receiver", "err", err)
- return err
- }
- } else {
- e.Logger.Infow("receiver already deployed", "addr", chainState.Receiver.Address, "chain", chain.String())
+ RMNProxy := chainState.RMNProxy
+ if chainState.RMNProxy == nil {
+ e.Logger.Errorw("RMNProxy not found", "chain", chain.String())
+ return fmt.Errorf("rmn proxy not found for chain %s, deploy the prerequisites first", chain.String())
+ }
+ var rmnLegacyAddr common.Address
+ if chainState.MockRMN != nil {
+ rmnLegacyAddr = chainState.MockRMN.Address()
+ }
+ // If RMN is deployed, set rmnLegacyAddr to the RMN address
+ if chainState.RMN != nil {
+ rmnLegacyAddr = chainState.RMN.Address()
+ }
+ if rmnLegacyAddr == (common.Address{}) {
+ e.Logger.Warnf("No legacy RMN contract found for chain %s, will not setRMN in RMNRemote", chain.String())
}
rmnRemoteContract := chainState.RMNRemote
if chainState.RMNRemote == nil {
@@ -201,8 +200,7 @@ func deployChainContracts(
chain.DeployerKey,
chain.Client,
chain.Selector,
- // Indicates no legacy RMN contract
- common.HexToAddress("0x0"),
+ rmnLegacyAddr,
)
return deployment.ContractDeploy[*rmn_remote.RMNRemote]{
rmnRemoteAddr, rmnRemote, tx, deployment.NewTypeAndVersion(RMNRemote, deployment.Version1_6_0_dev), err2,
@@ -216,6 +214,7 @@ func deployChainContracts(
} else {
e.Logger.Infow("rmn remote already deployed", "chain", chain.String(), "addr", chainState.RMNRemote.Address)
}
+
activeDigest, err := rmnHome.GetActiveDigest(&bind.CallOpts{})
if err != nil {
e.Logger.Errorw("Failed to get active digest", "chain", chain.String(), "err", err)
@@ -234,31 +233,6 @@ func deployChainContracts(
e.Logger.Errorw("Failed to confirm RMNRemote config", "chain", chain.String(), "err", err)
return err
}
-
- // we deploy a new RMNProxy so that RMNRemote can be tested first before pointing it to the main Existing RMNProxy
- // To differentiate between the two RMNProxies, we will deploy new one with Version1_6_0_dev
- rmnProxyContract := chainState.RMNProxyNew
- if chainState.RMNProxyNew == nil {
- // we deploy a new rmnproxy contract to test RMNRemote
- rmnProxy, err := deployment.DeployContract(e.Logger, chain, ab,
- func(chain deployment.Chain) deployment.ContractDeploy[*rmn_proxy_contract.RMNProxyContract] {
- rmnProxyAddr, tx, rmnProxy, err2 := rmn_proxy_contract.DeployRMNProxyContract(
- chain.DeployerKey,
- chain.Client,
- rmnRemoteContract.Address(),
- )
- return deployment.ContractDeploy[*rmn_proxy_contract.RMNProxyContract]{
- rmnProxyAddr, rmnProxy, tx, deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_6_0_dev), err2,
- }
- })
- if err != nil {
- e.Logger.Errorw("Failed to deploy RMNProxyNew", "chain", chain.String(), "err", err)
- return err
- }
- rmnProxyContract = rmnProxy.Contract
- } else {
- e.Logger.Infow("rmn proxy already deployed", "chain", chain.String(), "addr", chainState.RMNProxyNew.Address)
- }
if chainState.TestRouter == nil {
_, err := deployment.DeployContract(e.Logger, chain, ab,
func(chain deployment.Chain) deployment.ContractDeploy[*router.Router] {
@@ -266,7 +240,7 @@ func deployChainContracts(
chain.DeployerKey,
chain.Client,
weth9Contract.Address(),
- rmnProxyContract.Address(),
+ RMNProxy.Address(),
)
return deployment.ContractDeploy[*router.Router]{
routerAddr, routerC, tx2, deployment.NewTypeAndVersion(TestRouter, deployment.Version1_2_0), err2,
@@ -350,7 +324,7 @@ func deployChainContracts(
chain.Client,
onramp.OnRampStaticConfig{
ChainSelector: chain.Selector,
- RmnRemote: rmnProxyContract.Address(),
+ RmnRemote: RMNProxy.Address(),
NonceManager: nmContract.Address(),
TokenAdminRegistry: tokenAdminReg.Address(),
},
@@ -382,7 +356,7 @@ func deployChainContracts(
offramp.OffRampStaticConfig{
ChainSelector: chain.Selector,
GasForCallExactCheck: 5_000,
- RmnRemote: rmnProxyContract.Address(),
+ RmnRemote: RMNProxy.Address(),
NonceManager: nmContract.Address(),
TokenAdminRegistry: tokenAdminReg.Address(),
},
diff --git a/deployment/ccip/changeset/cs_deploy_chain_test.go b/deployment/ccip/changeset/cs_deploy_chain_test.go
index fbf9c881138..a72b1b1568b 100644
--- a/deployment/ccip/changeset/cs_deploy_chain_test.go
+++ b/deployment/ccip/changeset/cs_deploy_chain_test.go
@@ -3,7 +3,6 @@ package changeset
import (
"encoding/json"
"fmt"
- "math/big"
"testing"
"github.com/stretchr/testify/require"
@@ -11,12 +10,14 @@ import (
"github.com/smartcontractkit/chainlink/deployment"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
"github.com/smartcontractkit/chainlink/v2/core/logger"
)
func TestDeployChainContractsChangeset(t *testing.T) {
+ t.Parallel()
lggr := logger.TestLogger(t)
e := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{
Bootstraps: 1,
@@ -30,12 +31,13 @@ func TestDeployChainContractsChangeset(t *testing.T) {
p2pIds := nodes.NonBootstraps().PeerIDs()
cfg := make(map[uint64]commontypes.MCMSWithTimelockConfig)
for _, chain := range e.AllChainSelectors() {
- cfg[chain] = commontypes.MCMSWithTimelockConfig{
- Canceller: commonchangeset.SingleGroupMCMS(t),
- Bypasser: commonchangeset.SingleGroupMCMS(t),
- Proposer: commonchangeset.SingleGroupMCMS(t),
- TimelockMinDelay: big.NewInt(0),
- }
+ cfg[chain] = proposalutils.SingleGroupTimelockConfig(t)
+ }
+ var prereqCfg []DeployPrerequisiteConfigPerChain
+ for _, chain := range e.AllChainSelectors() {
+ prereqCfg = append(prereqCfg, DeployPrerequisiteConfigPerChain{
+ ChainSelector: chain,
+ })
}
e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{
{
@@ -61,7 +63,7 @@ func TestDeployChainContractsChangeset(t *testing.T) {
{
Changeset: commonchangeset.WrapChangeSet(DeployPrerequisites),
Config: DeployPrerequisiteConfig{
- ChainSelectors: selectors,
+ Configs: prereqCfg,
},
},
{
@@ -98,6 +100,7 @@ func TestDeployChainContractsChangeset(t *testing.T) {
}
func TestDeployCCIPContracts(t *testing.T) {
+ t.Parallel()
e := NewMemoryEnvironment(t)
// Deploy all the CCIP contracts.
state, err := LoadOnchainState(e.Env)
diff --git a/deployment/ccip/changeset/cs_home_chain.go b/deployment/ccip/changeset/cs_home_chain.go
index 750b21229aa..b92a8d132a4 100644
--- a/deployment/ccip/changeset/cs_home_chain.go
+++ b/deployment/ccip/changeset/cs_home_chain.go
@@ -5,20 +5,24 @@ import (
"context"
"encoding/json"
"fmt"
+ "math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"golang.org/x/exp/maps"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
)
@@ -322,3 +326,93 @@ func addNodes(
_, err = chain.Confirm(tx)
return err
}
+
+type RemoveDONsConfig struct {
+ HomeChainSel uint64
+ DonIDs []uint32
+ MCMS *MCMSConfig
+}
+
+func (c RemoveDONsConfig) Validate(homeChain CCIPChainState) error {
+ if err := deployment.IsValidChainSelector(c.HomeChainSel); err != nil {
+ return fmt.Errorf("home chain selector must be set %w", err)
+ }
+ if len(c.DonIDs) == 0 {
+ return fmt.Errorf("don ids must be set")
+ }
+ // Cap reg must exist
+ if homeChain.CapabilityRegistry == nil {
+ return fmt.Errorf("cap reg does not exist")
+ }
+ if homeChain.CCIPHome == nil {
+ return fmt.Errorf("ccip home does not exist")
+ }
+ if err := internal.DONIdExists(homeChain.CapabilityRegistry, c.DonIDs); err != nil {
+ return err
+ }
+ return nil
+}
+
+// RemoveDONs removes DONs from the CapabilitiesRegistry contract.
+// TODO: Could likely be moved to common, but needs
+// a common state struct first.
+func RemoveDONs(e deployment.Environment, cfg RemoveDONsConfig) (deployment.ChangesetOutput, error) {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ homeChain, ok := e.Chains[cfg.HomeChainSel]
+ if !ok {
+ return deployment.ChangesetOutput{}, fmt.Errorf("home chain %d not found", cfg.HomeChainSel)
+ }
+ homeChainState := state.Chains[cfg.HomeChainSel]
+ if err := cfg.Validate(homeChainState); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ txOpts := homeChain.DeployerKey
+ if cfg.MCMS != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+
+ tx, err := homeChainState.CapabilityRegistry.RemoveDONs(txOpts, cfg.DonIDs)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if cfg.MCMS == nil {
+ _, err = homeChain.Confirm(tx)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("Removed dons using deployer key tx %s", tx.Hash().String())
+ return deployment.ChangesetOutput{}, nil
+ }
+ p, err := proposalutils.BuildProposalFromBatches(
+ map[uint64]common.Address{
+ cfg.HomeChainSel: homeChainState.Timelock.Address(),
+ },
+ map[uint64]*gethwrappers.ManyChainMultiSig{
+ cfg.HomeChainSel: homeChainState.ProposerMcm,
+ },
+ []timelock.BatchChainOperation{
+ {
+ ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSel),
+ Batch: []mcms.Operation{
+ {
+ To: homeChainState.CapabilityRegistry.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ },
+ },
+ },
+ "Remove DONs",
+ cfg.MCMS.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("Created proposal to remove dons")
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{
+ *p,
+ }}, nil
+}
diff --git a/deployment/ccip/changeset/cs_home_chain_test.go b/deployment/ccip/changeset/cs_home_chain_test.go
index a06161f7086..8a2d4f87709 100644
--- a/deployment/ccip/changeset/cs_home_chain_test.go
+++ b/deployment/ccip/changeset/cs_home_chain_test.go
@@ -3,16 +3,20 @@ package changeset
import (
"testing"
+ "github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zapcore"
"github.com/smartcontractkit/chainlink/deployment"
+ commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/common/view/v1_0"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
"github.com/smartcontractkit/chainlink/v2/core/logger"
)
func TestDeployHomeChain(t *testing.T) {
+ t.Parallel()
lggr := logger.TestLogger(t)
e := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{
Bootstraps: 1,
@@ -56,3 +60,114 @@ func TestDeployHomeChain(t *testing.T) {
})
require.Len(t, capRegSnap.Nodes, len(p2pIds))
}
+
+func TestRemoveDonsValidate(t *testing.T) {
+ e := NewMemoryEnvironment(t)
+ s, err := LoadOnchainState(e.Env)
+ require.NoError(t, err)
+ homeChain := s.Chains[e.HomeChainSel]
+ var tt = []struct {
+ name string
+ config RemoveDONsConfig
+ expectErr bool
+ }{
+ {
+ name: "invalid home",
+ config: RemoveDONsConfig{
+ HomeChainSel: 0,
+ DonIDs: []uint32{1},
+ },
+ expectErr: true,
+ },
+ {
+ name: "invalid dons",
+ config: RemoveDONsConfig{
+ HomeChainSel: e.HomeChainSel,
+ DonIDs: []uint32{1377},
+ },
+ expectErr: true,
+ },
+ {
+ name: "no dons",
+ config: RemoveDONsConfig{
+ HomeChainSel: e.HomeChainSel,
+ DonIDs: []uint32{},
+ },
+ expectErr: true,
+ },
+ {
+ name: "success",
+ config: RemoveDONsConfig{
+ HomeChainSel: e.HomeChainSel,
+ DonIDs: []uint32{1},
+ },
+ expectErr: false,
+ },
+ }
+ for _, tc := range tt {
+ t.Run(tc.name, func(t *testing.T) {
+ err := tc.config.Validate(homeChain)
+ if tc.expectErr {
+ require.Error(t, err)
+ } else {
+ require.NoError(t, err)
+ }
+ })
+ }
+}
+
+func TestRemoveDons(t *testing.T) {
+ e := NewMemoryEnvironment(t)
+ s, err := LoadOnchainState(e.Env)
+ require.NoError(t, err)
+ homeChain := s.Chains[e.HomeChainSel]
+
+ // Remove a don w/o MCMS
+ donsBefore, err := homeChain.CapabilityRegistry.GetDONs(nil)
+ require.NoError(t, err)
+ e.Env, err = commoncs.ApplyChangesets(t, e.Env, nil, []commoncs.ChangesetApplication{
+ {
+ Changeset: commoncs.WrapChangeSet(RemoveDONs),
+ Config: RemoveDONsConfig{
+ HomeChainSel: e.HomeChainSel,
+ DonIDs: []uint32{donsBefore[0].Id},
+ },
+ },
+ })
+ require.NoError(t, err)
+ donsAfter, err := homeChain.CapabilityRegistry.GetDONs(nil)
+ require.NoError(t, err)
+ require.Len(t, donsAfter, len(donsBefore)-1)
+
+ // Remove a don w/ MCMS
+ donsBefore, err = homeChain.CapabilityRegistry.GetDONs(nil)
+ require.NoError(t, err)
+ e.Env, err = commoncs.ApplyChangesets(t, e.Env, map[uint64]*proposalutils.TimelockExecutionContracts{
+ e.HomeChainSel: {
+ Timelock: s.Chains[e.HomeChainSel].Timelock,
+ CallProxy: s.Chains[e.HomeChainSel].CallProxy,
+ },
+ }, []commoncs.ChangesetApplication{
+ {
+ Changeset: commoncs.WrapChangeSet(commoncs.TransferToMCMSWithTimelock),
+ Config: commoncs.TransferToMCMSWithTimelockConfig{
+ ContractsByChain: map[uint64][]common.Address{
+ e.HomeChainSel: {homeChain.CapabilityRegistry.Address()},
+ },
+ MinDelay: 0,
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(RemoveDONs),
+ Config: RemoveDONsConfig{
+ HomeChainSel: e.HomeChainSel,
+ DonIDs: []uint32{donsBefore[0].Id},
+ MCMS: &MCMSConfig{MinDelay: 0},
+ },
+ },
+ })
+ require.NoError(t, err)
+ donsAfter, err = homeChain.CapabilityRegistry.GetDONs(nil)
+ require.NoError(t, err)
+ require.Len(t, donsAfter, len(donsBefore)-1)
+}
diff --git a/deployment/ccip/changeset/cs_initial_add_chain.go b/deployment/ccip/changeset/cs_initial_add_chain.go
deleted file mode 100644
index 5ba648d74b5..00000000000
--- a/deployment/ccip/changeset/cs_initial_add_chain.go
+++ /dev/null
@@ -1,532 +0,0 @@
-package changeset
-
-import (
- "bytes"
- "context"
- "encoding/hex"
- "fmt"
- "os"
- "time"
-
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
-
- "github.com/smartcontractkit/chainlink-ccip/chainconfig"
- "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
- "github.com/smartcontractkit/chainlink-ccip/pluginconfig"
- "github.com/smartcontractkit/chainlink-common/pkg/config"
- "github.com/smartcontractkit/chainlink-common/pkg/logger"
- "github.com/smartcontractkit/chainlink-common/pkg/merklemulti"
-
- "github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
- "github.com/smartcontractkit/chainlink/deployment/common/types"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
-)
-
-var _ deployment.ChangeSet[NewChainsConfig] = ConfigureNewChains
-
-// ConfigureNewChains enables new chains as destination(s) for CCIP
-// It performs the following steps per chain:
-// - addChainConfig + AddDON (candidate->primary promotion i.e. init) on the home chain
-// - SetOCR3Config on the remote chain
-// ConfigureNewChains assumes that the home chain is already enabled and all CCIP contracts are already deployed.
-func ConfigureNewChains(env deployment.Environment, c NewChainsConfig) (deployment.ChangesetOutput, error) {
- if err := c.Validate(); err != nil {
- return deployment.ChangesetOutput{}, fmt.Errorf("invalid NewChainsConfig: %w", err)
- }
- err := configureChain(env, c)
- if err != nil {
- env.Logger.Errorw("Failed to configure chain", "err", err)
- return deployment.ChangesetOutput{}, deployment.MaybeDataErr(err)
- }
- return deployment.ChangesetOutput{
- Proposals: []timelock.MCMSWithTimelockProposal{},
- AddressBook: nil,
- JobSpecs: nil,
- }, nil
-}
-
-type CCIPOCRParams struct {
- OCRParameters types.OCRParameters
- // Note contains pointers to Arb feeds for prices
- CommitOffChainConfig pluginconfig.CommitOffchainConfig
- // Note ontains USDC config
- ExecuteOffChainConfig pluginconfig.ExecuteOffchainConfig
-}
-
-func (c CCIPOCRParams) Validate() error {
- if err := c.OCRParameters.Validate(); err != nil {
- return fmt.Errorf("invalid OCR parameters: %w", err)
- }
- if err := c.CommitOffChainConfig.Validate(); err != nil {
- return fmt.Errorf("invalid commit off-chain config: %w", err)
- }
- if err := c.ExecuteOffChainConfig.Validate(); err != nil {
- return fmt.Errorf("invalid execute off-chain config: %w", err)
- }
- return nil
-}
-
-type NewChainsConfig struct {
- // Common to all chains
- HomeChainSel uint64
- FeedChainSel uint64
- // Per chain config
- ChainConfigByChain map[uint64]CCIPOCRParams
-}
-
-func (c NewChainsConfig) Chains() []uint64 {
- chains := make([]uint64, 0, len(c.ChainConfigByChain))
- for chain := range c.ChainConfigByChain {
- chains = append(chains, chain)
- }
- return chains
-}
-
-func (c NewChainsConfig) Validate() error {
- if err := deployment.IsValidChainSelector(c.HomeChainSel); err != nil {
- return fmt.Errorf("invalid home chain selector: %d - %w", c.HomeChainSel, err)
- }
- if err := deployment.IsValidChainSelector(c.FeedChainSel); err != nil {
- return fmt.Errorf("invalid feed chain selector: %d - %w", c.FeedChainSel, err)
- }
- // Validate chain config
- for chain, cfg := range c.ChainConfigByChain {
- if err := cfg.Validate(); err != nil {
- return fmt.Errorf("invalid OCR params for chain %d: %w", chain, err)
- }
- if cfg.CommitOffChainConfig.PriceFeedChainSelector != ccipocr3.ChainSelector(c.FeedChainSel) {
- return fmt.Errorf("chain %d has invalid feed chain selector", chain)
- }
- }
- return nil
-}
-
-// DefaultOCRParams returns the default OCR parameters for a chain,
-// except for a few values which must be parameterized (passed as arguments).
-func DefaultOCRParams(
- feedChainSel uint64,
- tokenInfo map[ccipocr3.UnknownEncodedAddress]pluginconfig.TokenInfo,
- tokenDataObservers []pluginconfig.TokenDataObserverConfig,
-) CCIPOCRParams {
- return CCIPOCRParams{
- OCRParameters: types.OCRParameters{
- DeltaProgress: internal.DeltaProgress,
- DeltaResend: internal.DeltaResend,
- DeltaInitial: internal.DeltaInitial,
- DeltaRound: internal.DeltaRound,
- DeltaGrace: internal.DeltaGrace,
- DeltaCertifiedCommitRequest: internal.DeltaCertifiedCommitRequest,
- DeltaStage: internal.DeltaStage,
- Rmax: internal.Rmax,
- MaxDurationQuery: internal.MaxDurationQuery,
- MaxDurationObservation: internal.MaxDurationObservation,
- MaxDurationShouldAcceptAttestedReport: internal.MaxDurationShouldAcceptAttestedReport,
- MaxDurationShouldTransmitAcceptedReport: internal.MaxDurationShouldTransmitAcceptedReport,
- },
- ExecuteOffChainConfig: pluginconfig.ExecuteOffchainConfig{
- BatchGasLimit: internal.BatchGasLimit,
- RelativeBoostPerWaitHour: internal.RelativeBoostPerWaitHour,
- InflightCacheExpiry: *config.MustNewDuration(internal.InflightCacheExpiry),
- RootSnoozeTime: *config.MustNewDuration(internal.RootSnoozeTime),
- MessageVisibilityInterval: *config.MustNewDuration(internal.FirstBlockAge),
- BatchingStrategyID: internal.BatchingStrategyID,
- TokenDataObservers: tokenDataObservers,
- },
- CommitOffChainConfig: pluginconfig.CommitOffchainConfig{
- RemoteGasPriceBatchWriteFrequency: *config.MustNewDuration(internal.RemoteGasPriceBatchWriteFrequency),
- TokenPriceBatchWriteFrequency: *config.MustNewDuration(internal.TokenPriceBatchWriteFrequency),
- TokenInfo: tokenInfo,
- PriceFeedChainSelector: ccipocr3.ChainSelector(feedChainSel),
- NewMsgScanBatchSize: merklemulti.MaxNumberTreeLeaves,
- MaxReportTransmissionCheckAttempts: 5,
- RMNEnabled: os.Getenv("ENABLE_RMN") == "true", // only enabled in manual test
- RMNSignaturesTimeout: 30 * time.Minute,
- MaxMerkleTreeSize: merklemulti.MaxNumberTreeLeaves,
- SignObservationPrefix: "chainlink ccip 1.6 rmn observation",
- },
- }
-}
-
-// configureChain assumes the all the Home chain contracts and CCIP contracts are deployed
-// It does -
-// 1. addChainConfig for each chain in CCIPHome
-// 2. Registers the nodes with the capability registry
-// 3. SetOCR3Config on the remote chain
-func configureChain(
- e deployment.Environment,
- c NewChainsConfig,
-) error {
- if e.OCRSecrets.IsEmpty() {
- return fmt.Errorf("OCR secrets are empty")
- }
- nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain)
- if err != nil || len(nodes) == 0 {
- e.Logger.Errorw("Failed to get node info", "err", err)
- return err
- }
- existingState, err := LoadOnchainState(e)
- if err != nil {
- e.Logger.Errorw("Failed to load existing onchain state", "err")
- return err
- }
- homeChain := e.Chains[c.HomeChainSel]
- capReg := existingState.Chains[c.HomeChainSel].CapabilityRegistry
- if capReg == nil {
- e.Logger.Errorw("Failed to get capability registry", "chain", homeChain.String())
- return fmt.Errorf("capability registry not found")
- }
- ccipHome := existingState.Chains[c.HomeChainSel].CCIPHome
- if ccipHome == nil {
- e.Logger.Errorw("Failed to get ccip home", "chain", homeChain.String(), "err", err)
- return fmt.Errorf("ccip home not found")
- }
- rmnHome := existingState.Chains[c.HomeChainSel].RMNHome
- if rmnHome == nil {
- e.Logger.Errorw("Failed to get rmn home", "chain", homeChain.String(), "err", err)
- return fmt.Errorf("rmn home not found")
- }
-
- for chainSel, chainConfig := range c.ChainConfigByChain {
- chain, _ := e.Chains[chainSel]
- chainState, ok := existingState.Chains[chain.Selector]
- if !ok {
- return fmt.Errorf("chain state not found for chain %d", chain.Selector)
- }
- if chainState.OffRamp == nil {
- return fmt.Errorf("off ramp not found for chain %d", chain.Selector)
- }
- _, err = addChainConfig(
- e.Logger,
- e.Chains[c.HomeChainSel],
- ccipHome,
- chain.Selector,
- nodes.NonBootstraps().PeerIDs())
- if err != nil {
- return err
- }
- // For each chain, we create a DON on the home chain (2 OCR instances)
- if err := addDON(
- e.Logger,
- e.OCRSecrets,
- capReg,
- ccipHome,
- rmnHome.Address(),
- chainState.OffRamp,
- chain,
- e.Chains[c.HomeChainSel],
- nodes.NonBootstraps(),
- chainConfig,
- ); err != nil {
- e.Logger.Errorw("Failed to add DON", "err", err)
- return err
- }
- }
-
- return nil
-}
-
-func setupConfigInfo(chainSelector uint64, readers [][32]byte, fChain uint8, cfg []byte) ccip_home.CCIPHomeChainConfigArgs {
- return ccip_home.CCIPHomeChainConfigArgs{
- ChainSelector: chainSelector,
- ChainConfig: ccip_home.CCIPHomeChainConfig{
- Readers: readers,
- FChain: fChain,
- Config: cfg,
- },
- }
-}
-
-func isChainConfigEqual(a, b ccip_home.CCIPHomeChainConfig) bool {
- mapReader := make(map[[32]byte]struct{})
- for i := range a.Readers {
- mapReader[a.Readers[i]] = struct{}{}
- }
- for i := range b.Readers {
- if _, ok := mapReader[b.Readers[i]]; !ok {
- return false
- }
- }
- return bytes.Equal(a.Config, b.Config) &&
- a.FChain == b.FChain
-}
-
-func addChainConfig(
- lggr logger.Logger,
- h deployment.Chain,
- ccipConfig *ccip_home.CCIPHome,
- chainSelector uint64,
- p2pIDs [][32]byte,
-) (ccip_home.CCIPHomeChainConfigArgs, error) {
- // First Add CCIPOCRParams that includes all p2pIDs as readers
- encodedExtraChainConfig, err := chainconfig.EncodeChainConfig(chainconfig.ChainConfig{
- GasPriceDeviationPPB: ccipocr3.NewBigIntFromInt64(1000),
- DAGasPriceDeviationPPB: ccipocr3.NewBigIntFromInt64(0),
- OptimisticConfirmations: 1,
- })
- if err != nil {
- return ccip_home.CCIPHomeChainConfigArgs{}, err
- }
- chainConfig := setupConfigInfo(chainSelector, p2pIDs, uint8(len(p2pIDs)/3), encodedExtraChainConfig)
- existingCfg, err := ccipConfig.GetChainConfig(nil, chainSelector)
- if err != nil {
- return ccip_home.CCIPHomeChainConfigArgs{}, fmt.Errorf("get chain config for selector %d: %w", chainSelector, err)
- }
- if isChainConfigEqual(existingCfg, chainConfig.ChainConfig) {
- lggr.Infow("Chain config already exists, not applying again",
- "homeChain", h.String(),
- "addedChain", chainSelector,
- "chainConfig", chainConfig,
- )
- return chainConfig, nil
- }
- tx, err := ccipConfig.ApplyChainConfigUpdates(h.DeployerKey, nil, []ccip_home.CCIPHomeChainConfigArgs{
- chainConfig,
- })
- if _, err := deployment.ConfirmIfNoError(h, tx, err); err != nil {
- return ccip_home.CCIPHomeChainConfigArgs{}, err
- }
- lggr.Infow("Applied chain config updates", "homeChain", h.String(), "addedChain", chainSelector, "chainConfig", chainConfig)
- return chainConfig, nil
-}
-
-// createDON creates one DON with 2 plugins (commit and exec)
-// It first set a new candidate for the DON with the first plugin type and AddDON on capReg
-// Then for subsequent operations it uses UpdateDON to promote the first plugin to the active deployment
-// and to set candidate and promote it for the second plugin
-func createDON(
- lggr logger.Logger,
- capReg *capabilities_registry.CapabilitiesRegistry,
- ccipHome *ccip_home.CCIPHome,
- ocr3Configs map[cctypes.PluginType]ccip_home.CCIPHomeOCR3Config,
- home deployment.Chain,
- newChainSel uint64,
- nodes deployment.Nodes,
-) error {
- donID, err := internal.DonIDForChain(capReg, ccipHome, newChainSel)
- if err != nil {
- return fmt.Errorf("fetch don id for chain: %w", err)
- }
- if donID != 0 {
- lggr.Infow("DON already exists not adding it again", "donID", donID, "chain", newChainSel)
- return ValidateCCIPHomeConfigSetUp(lggr, capReg, ccipHome, newChainSel)
- }
-
- commitConfig, ok := ocr3Configs[cctypes.PluginTypeCCIPCommit]
- if !ok {
- return fmt.Errorf("missing commit plugin in ocr3Configs")
- }
-
- execConfig, ok := ocr3Configs[cctypes.PluginTypeCCIPExec]
- if !ok {
- return fmt.Errorf("missing exec plugin in ocr3Configs")
- }
-
- latestDon, err := internal.LatestCCIPDON(capReg)
- if err != nil {
- return err
- }
-
- donID = latestDon.Id + 1
-
- err = internal.SetupCommitDON(lggr, donID, commitConfig, capReg, home, nodes, ccipHome)
- if err != nil {
- return fmt.Errorf("setup commit don: %w", err)
- }
-
- // TODO: bug in contract causing this to not work as expected.
- err = internal.SetupExecDON(lggr, donID, execConfig, capReg, home, nodes, ccipHome)
- if err != nil {
- return fmt.Errorf("setup exec don: %w", err)
- }
- return ValidateCCIPHomeConfigSetUp(lggr, capReg, ccipHome, newChainSel)
-}
-
-func addDON(
- lggr logger.Logger,
- ocrSecrets deployment.OCRSecrets,
- capReg *capabilities_registry.CapabilitiesRegistry,
- ccipHome *ccip_home.CCIPHome,
- rmnHomeAddress common.Address,
- offRamp *offramp.OffRamp,
- dest deployment.Chain,
- home deployment.Chain,
- nodes deployment.Nodes,
- ocrParams CCIPOCRParams,
-) error {
- ocrConfigs, err := internal.BuildOCR3ConfigForCCIPHome(
- ocrSecrets, offRamp, dest, nodes, rmnHomeAddress, ocrParams.OCRParameters, ocrParams.CommitOffChainConfig, ocrParams.ExecuteOffChainConfig)
- if err != nil {
- return err
- }
- err = createDON(lggr, capReg, ccipHome, ocrConfigs, home, dest.Selector, nodes)
- if err != nil {
- return err
- }
- don, err := internal.LatestCCIPDON(capReg)
- if err != nil {
- return err
- }
- lggr.Infow("Added DON", "donID", don.Id)
-
- offrampOCR3Configs, err := internal.BuildSetOCR3ConfigArgs(don.Id, ccipHome, dest.Selector)
- if err != nil {
- return err
- }
- lggr.Infow("Setting OCR3 Configs",
- "offrampOCR3Configs", offrampOCR3Configs,
- "configDigestCommit", hex.EncodeToString(offrampOCR3Configs[cctypes.PluginTypeCCIPCommit].ConfigDigest[:]),
- "configDigestExec", hex.EncodeToString(offrampOCR3Configs[cctypes.PluginTypeCCIPExec].ConfigDigest[:]),
- "chainSelector", dest.Selector,
- )
-
- // check if OCR3 config is already set on offramp
- ocr3ConfigSet, err := isOCR3ConfigSetOnOffRamp(lggr, dest, offRamp, offrampOCR3Configs)
- if err != nil {
- return fmt.Errorf("error checking if OCR3 config is set on offramp: %w", err)
- }
- if ocr3ConfigSet {
- lggr.Infow("OCR3 config already set on offramp, not applying again", "chain", dest.String())
- return nil
- }
- tx, err := offRamp.SetOCR3Configs(dest.DeployerKey, offrampOCR3Configs)
- if _, err := deployment.ConfirmIfNoError(dest, tx, err); err != nil {
- return err
- }
- lggr.Infow("Set OCR3 Configs", "chain", dest.String())
- // now check if OCR3 config is set on offramp
- ocr3ConfigSet, err = isOCR3ConfigSetOnOffRamp(lggr, dest, offRamp, offrampOCR3Configs)
- if err != nil {
- return fmt.Errorf("error checking if OCR3 config is set on offramp: %w", err)
- }
- if !ocr3ConfigSet {
- return fmt.Errorf("OCR3 config not set on offramp properly, check logs, chain %s", dest.String())
- }
- return nil
-}
-
-func isOCR3ConfigSetOnOffRamp(
- lggr logger.Logger,
- chain deployment.Chain,
- offRamp *offramp.OffRamp,
- offrampOCR3Configs []offramp.MultiOCR3BaseOCRConfigArgs,
-) (bool, error) {
- mapOfframpOCR3Configs := make(map[cctypes.PluginType]offramp.MultiOCR3BaseOCRConfigArgs)
- for _, config := range offrampOCR3Configs {
- mapOfframpOCR3Configs[cctypes.PluginType(config.OcrPluginType)] = config
- }
-
- for _, pluginType := range []cctypes.PluginType{cctypes.PluginTypeCCIPCommit, cctypes.PluginTypeCCIPExec} {
- ocrConfig, err := offRamp.LatestConfigDetails(&bind.CallOpts{
- Context: context.Background(),
- }, uint8(pluginType))
- if err != nil {
- return false, fmt.Errorf("error fetching OCR3 config for plugin %s chain %s: %w", pluginType.String(), chain.String(), err)
- }
- lggr.Debugw("Fetched OCR3 Configs",
- "MultiOCR3BaseOCRConfig.F", ocrConfig.ConfigInfo.F,
- "MultiOCR3BaseOCRConfig.N", ocrConfig.ConfigInfo.N,
- "MultiOCR3BaseOCRConfig.IsSignatureVerificationEnabled", ocrConfig.ConfigInfo.IsSignatureVerificationEnabled,
- "Signers", ocrConfig.Signers,
- "Transmitters", ocrConfig.Transmitters,
- "configDigest", hex.EncodeToString(ocrConfig.ConfigInfo.ConfigDigest[:]),
- "chain", chain.String(),
- )
- // TODO: assertions to be done as part of full state
- // resprentation validation CCIP-3047
- if mapOfframpOCR3Configs[pluginType].ConfigDigest != ocrConfig.ConfigInfo.ConfigDigest {
- lggr.Infow("OCR3 config digest mismatch", "pluginType", pluginType.String())
- return false, nil
- }
- if mapOfframpOCR3Configs[pluginType].F != ocrConfig.ConfigInfo.F {
- lggr.Infow("OCR3 config F mismatch", "pluginType", pluginType.String())
- return false, nil
- }
- if mapOfframpOCR3Configs[pluginType].IsSignatureVerificationEnabled != ocrConfig.ConfigInfo.IsSignatureVerificationEnabled {
- lggr.Infow("OCR3 config signature verification mismatch", "pluginType", pluginType.String())
- return false, nil
- }
- if pluginType == cctypes.PluginTypeCCIPCommit {
- // only commit will set signers, exec doesn't need them.
- for i, signer := range mapOfframpOCR3Configs[pluginType].Signers {
- if !bytes.Equal(signer.Bytes(), ocrConfig.Signers[i].Bytes()) {
- lggr.Infow("OCR3 config signer mismatch", "pluginType", pluginType.String())
- return false, nil
- }
- }
- }
- for i, transmitter := range mapOfframpOCR3Configs[pluginType].Transmitters {
- if !bytes.Equal(transmitter.Bytes(), ocrConfig.Transmitters[i].Bytes()) {
- lggr.Infow("OCR3 config transmitter mismatch", "pluginType", pluginType.String())
- return false, nil
- }
- }
- }
- return true, nil
-}
-
-// ValidateCCIPHomeConfigSetUp checks that the commit and exec active and candidate configs are set up correctly
-func ValidateCCIPHomeConfigSetUp(
- lggr logger.Logger,
- capReg *capabilities_registry.CapabilitiesRegistry,
- ccipHome *ccip_home.CCIPHome,
- chainSel uint64,
-) error {
- // fetch DONID
- donID, err := internal.DonIDForChain(capReg, ccipHome, chainSel)
- if err != nil {
- return fmt.Errorf("fetch don id for chain: %w", err)
- }
- if donID == 0 {
- return fmt.Errorf("don id for chain(%d) does not exist", chainSel)
- }
-
- // final sanity checks on configs.
- commitConfigs, err := ccipHome.GetAllConfigs(&bind.CallOpts{
- //Pending: true,
- }, donID, uint8(cctypes.PluginTypeCCIPCommit))
- if err != nil {
- return fmt.Errorf("get all commit configs: %w", err)
- }
- commitActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit))
- if err != nil {
- return fmt.Errorf("get active commit digest: %w", err)
- }
- lggr.Debugw("Fetched active commit digest", "commitActiveDigest", hex.EncodeToString(commitActiveDigest[:]))
- commitCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, uint8(cctypes.PluginTypeCCIPCommit))
- if err != nil {
- return fmt.Errorf("get commit candidate digest: %w", err)
- }
- lggr.Debugw("Fetched candidate commit digest", "commitCandidateDigest", hex.EncodeToString(commitCandidateDigest[:]))
- if commitConfigs.ActiveConfig.ConfigDigest == [32]byte{} {
- return fmt.Errorf(
- "active config digest is empty for commit, expected nonempty, donID: %d, cfg: %+v, config digest from GetActiveDigest call: %x, config digest from GetCandidateDigest call: %x",
- donID, commitConfigs.ActiveConfig, commitActiveDigest, commitCandidateDigest)
- }
- if commitConfigs.CandidateConfig.ConfigDigest != [32]byte{} {
- return fmt.Errorf(
- "candidate config digest is nonempty for commit, expected empty, donID: %d, cfg: %+v, config digest from GetCandidateDigest call: %x, config digest from GetActiveDigest call: %x",
- donID, commitConfigs.CandidateConfig, commitCandidateDigest, commitActiveDigest)
- }
-
- execConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(cctypes.PluginTypeCCIPExec))
- if err != nil {
- return fmt.Errorf("get all exec configs: %w", err)
- }
- lggr.Debugw("Fetched exec configs",
- "ActiveConfig.ConfigDigest", hex.EncodeToString(execConfigs.ActiveConfig.ConfigDigest[:]),
- "CandidateConfig.ConfigDigest", hex.EncodeToString(execConfigs.CandidateConfig.ConfigDigest[:]),
- )
- if execConfigs.ActiveConfig.ConfigDigest == [32]byte{} {
- return fmt.Errorf("active config digest is empty for exec, expected nonempty, cfg: %v", execConfigs.ActiveConfig)
- }
- if execConfigs.CandidateConfig.ConfigDigest != [32]byte{} {
- return fmt.Errorf("candidate config digest is nonempty for exec, expected empty, cfg: %v", execConfigs.CandidateConfig)
- }
- return nil
-}
diff --git a/deployment/ccip/changeset/cs_initial_add_chain_test.go b/deployment/ccip/changeset/cs_initial_add_chain_test.go
deleted file mode 100644
index c1404eb7123..00000000000
--- a/deployment/ccip/changeset/cs_initial_add_chain_test.go
+++ /dev/null
@@ -1,92 +0,0 @@
-package changeset
-
-import (
- "testing"
-
- "github.com/ethereum/go-ethereum/common"
- "github.com/smartcontractkit/chainlink-ccip/pluginconfig"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
- "github.com/stretchr/testify/require"
-
- commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
-)
-
-func TestInitialAddChainAppliedTwice(t *testing.T) {
- // This already applies the initial add chain changeset.
- e := NewMemoryEnvironment(t)
-
- state, err := LoadOnchainState(e.Env)
- require.NoError(t, err)
-
- // now try to apply it again for the second time
- // Build the per chain config.
- allChains := e.Env.AllChainSelectors()
- tokenConfig := NewTestTokenConfig(state.Chains[e.FeedChainSel].USDFeeds)
- chainConfigs := make(map[uint64]CCIPOCRParams)
- timelockContractsPerChain := make(map[uint64]*commonchangeset.TimelockExecutionContracts)
-
- for _, chain := range allChains {
- timelockContractsPerChain[chain] = &commonchangeset.TimelockExecutionContracts{
- Timelock: state.Chains[chain].Timelock,
- CallProxy: state.Chains[chain].CallProxy,
- }
- tokenInfo := tokenConfig.GetTokenInfo(e.Env.Logger, state.Chains[chain].LinkToken, state.Chains[chain].Weth9)
- ocrParams := DefaultOCRParams(e.FeedChainSel, tokenInfo, []pluginconfig.TokenDataObserverConfig{})
- chainConfigs[chain] = ocrParams
- }
- e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, timelockContractsPerChain, []commonchangeset.ChangesetApplication{
- {
- Changeset: commonchangeset.WrapChangeSet(ConfigureNewChains),
- Config: NewChainsConfig{
- HomeChainSel: e.HomeChainSel,
- FeedChainSel: e.FeedChainSel,
- ChainConfigByChain: chainConfigs,
- },
- },
- })
- require.NoError(t, err)
- // send requests
- chain1, chain2 := allChains[0], allChains[1]
-
- _, err = AddLanes(e.Env, AddLanesConfig{
- LaneConfigs: []LaneConfig{
- {
- SourceSelector: chain1,
- DestSelector: chain2,
- InitialPricesBySource: DefaultInitialPrices,
- FeeQuoterDestChain: DefaultFeeQuoterDestChainConfig(),
- TestRouter: true,
- },
- },
- })
- require.NoError(t, err)
- ReplayLogs(t, e.Env.Offchain, e.ReplayBlocks)
- // Need to keep track of the block number for each chain so that event subscription can be done from that block.
- startBlocks := make(map[uint64]*uint64)
- // Send a message from each chain to every other chain.
- expectedSeqNumExec := make(map[SourceDestPair][]uint64)
- expectedSeqNum := make(map[SourceDestPair]uint64)
- latesthdr, err := e.Env.Chains[chain2].Client.HeaderByNumber(testcontext.Get(t), nil)
- require.NoError(t, err)
- block := latesthdr.Number.Uint64()
- startBlocks[chain2] = &block
- msgSentEvent := TestSendRequest(t, e.Env, state, chain1, chain2, true, router.ClientEVM2AnyMessage{
- Receiver: common.LeftPadBytes(state.Chains[chain2].Receiver.Address().Bytes(), 32),
- Data: []byte("hello"),
- TokenAmounts: nil,
- FeeToken: common.HexToAddress("0x0"),
- ExtraArgs: nil,
- })
-
- expectedSeqNum[SourceDestPair{
- SourceChainSelector: chain1,
- DestChainSelector: chain2,
- }] = msgSentEvent.SequenceNumber
- expectedSeqNumExec[SourceDestPair{
- SourceChainSelector: chain1,
- DestChainSelector: chain2,
- }] = []uint64{msgSentEvent.SequenceNumber}
- ConfirmCommitForAllWithExpectedSeqNums(t, e.Env, state, expectedSeqNum, startBlocks)
- ConfirmExecWithSeqNrsForAll(t, e.Env, state, expectedSeqNumExec, startBlocks)
-}
diff --git a/deployment/ccip/changeset/cs_jobspec_test.go b/deployment/ccip/changeset/cs_jobspec_test.go
index 21e80e85aa2..a0445b0d5ee 100644
--- a/deployment/ccip/changeset/cs_jobspec_test.go
+++ b/deployment/ccip/changeset/cs_jobspec_test.go
@@ -13,6 +13,7 @@ import (
)
func TestJobSpecChangeset(t *testing.T) {
+ t.Parallel()
lggr := logger.TestLogger(t)
e := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{
Chains: 1,
diff --git a/deployment/ccip/changeset/cs_prerequisites.go b/deployment/ccip/changeset/cs_prerequisites.go
index 2386d3bb784..2736ecf44bf 100644
--- a/deployment/ccip/changeset/cs_prerequisites.go
+++ b/deployment/ccip/changeset/cs_prerequisites.go
@@ -9,8 +9,11 @@ import (
"golang.org/x/sync/errgroup"
"github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/registry_module_owner_custom"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry"
@@ -32,7 +35,7 @@ func DeployPrerequisites(env deployment.Environment, cfg DeployPrerequisiteConfi
return deployment.ChangesetOutput{}, errors.Wrapf(deployment.ErrInvalidConfig, "%v", err)
}
ab := deployment.NewMemoryAddressBook()
- err = deployPrerequisiteChainContracts(env, ab, cfg.ChainSelectors, cfg.Opts...)
+ err = deployPrerequisiteChainContracts(env, ab, cfg)
if err != nil {
env.Logger.Errorw("Failed to deploy prerequisite contracts", "err", err, "addressBook", ab)
return deployment.ChangesetOutput{
@@ -47,13 +50,23 @@ func DeployPrerequisites(env deployment.Environment, cfg DeployPrerequisiteConfi
}
type DeployPrerequisiteContractsOpts struct {
- USDCEnabledChains []uint64
- Multicall3Enabled bool
+ USDCEnabled bool
+ Multicall3Enabled bool
+ LegacyDeploymentCfg *LegacyDeploymentConfig
+}
+
+type LegacyDeploymentConfig struct {
+ RMNConfig *rmn_contract.RMNConfig
+ PriceRegStalenessThreshold uint32
}
type DeployPrerequisiteConfig struct {
- ChainSelectors []uint64
- Opts []PrerequisiteOpt
+ Configs []DeployPrerequisiteConfigPerChain
+}
+
+type DeployPrerequisiteConfigPerChain struct {
+ ChainSelector uint64
+ Opts []PrerequisiteOpt
// TODO handle tokens and feeds in prerequisite config
Tokens map[TokenSymbol]common.Address
Feeds map[TokenSymbol]common.Address
@@ -61,7 +74,8 @@ type DeployPrerequisiteConfig struct {
func (c DeployPrerequisiteConfig) Validate() error {
mapAllChainSelectors := make(map[uint64]struct{})
- for _, cs := range c.ChainSelectors {
+ for _, cfg := range c.Configs {
+ cs := cfg.ChainSelector
mapAllChainSelectors[cs] = struct{}{}
if err := deployment.IsValidChainSelector(cs); err != nil {
return fmt.Errorf("invalid chain selector: %d - %w", cs, err)
@@ -72,31 +86,41 @@ func (c DeployPrerequisiteConfig) Validate() error {
type PrerequisiteOpt func(o *DeployPrerequisiteContractsOpts)
-func WithUSDCChains(chains []uint64) PrerequisiteOpt {
+func WithUSDCEnabled() PrerequisiteOpt {
return func(o *DeployPrerequisiteContractsOpts) {
- o.USDCEnabledChains = chains
+ o.USDCEnabled = true
}
}
-func WithMulticall3(enabled bool) PrerequisiteOpt {
+func WithMultiCall3Enabled() PrerequisiteOpt {
return func(o *DeployPrerequisiteContractsOpts) {
- o.Multicall3Enabled = enabled
+ o.Multicall3Enabled = true
}
}
-func deployPrerequisiteChainContracts(e deployment.Environment, ab deployment.AddressBook, selectors []uint64, opts ...PrerequisiteOpt) error {
+func WithLegacyDeploymentEnabled(cfg LegacyDeploymentConfig) PrerequisiteOpt {
+ return func(o *DeployPrerequisiteContractsOpts) {
+ if cfg.PriceRegStalenessThreshold == 0 {
+ panic("PriceRegStalenessThreshold must be set")
+ }
+ // TODO validate RMNConfig
+ o.LegacyDeploymentCfg = &cfg
+ }
+}
+
+func deployPrerequisiteChainContracts(e deployment.Environment, ab deployment.AddressBook, cfg DeployPrerequisiteConfig) error {
state, err := LoadOnchainState(e)
if err != nil {
e.Logger.Errorw("Failed to load existing onchain state", "err")
return err
}
deployGrp := errgroup.Group{}
- for _, sel := range selectors {
- chain := e.Chains[sel]
+ for _, c := range cfg.Configs {
+ chain := e.Chains[c.ChainSelector]
deployGrp.Go(func() error {
- err := deployPrerequisiteContracts(e, ab, state, chain, opts...)
+ err := deployPrerequisiteContracts(e, ab, state, chain, c.Opts...)
if err != nil {
- e.Logger.Errorw("Failed to deploy prerequisite contracts", "chain", sel, "err", err)
+ e.Logger.Errorw("Failed to deploy prerequisite contracts", "chain", chain.String(), "err", err)
return err
}
return nil
@@ -114,64 +138,119 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
opt(deployOpts)
}
}
- var isUSDC bool
- for _, sel := range deployOpts.USDCEnabledChains {
- if sel == chain.Selector {
- isUSDC = true
- break
- }
- }
lggr := e.Logger
chainState, chainExists := state.Chains[chain.Selector]
var weth9Contract *weth9.WETH9
var tokenAdminReg *token_admin_registry.TokenAdminRegistry
var registryModule *registry_module_owner_custom.RegistryModuleOwnerCustom
- var rmnProxy *rmn_proxy_contract.RMNProxyContract
+ var rmnProxy *rmn_proxy_contract.RMNProxy
var r *router.Router
var mc3 *multicall3.Multicall3
if chainExists {
weth9Contract = chainState.Weth9
tokenAdminReg = chainState.TokenAdminRegistry
registryModule = chainState.RegistryModule
- rmnProxy = chainState.RMNProxyExisting
+ rmnProxy = chainState.RMNProxy
r = chainState.Router
mc3 = chainState.Multicall3
}
+ var rmnAddr common.Address
+ // if we are setting up 1.5 version, deploy RMN contract based on the config provided
+ // else deploy the mock RMN contract
+ if deployOpts.LegacyDeploymentCfg != nil && deployOpts.LegacyDeploymentCfg.RMNConfig != nil {
+ if chainState.RMN == nil {
+ rmn, err := deployment.DeployContract(lggr, chain, ab,
+ func(chain deployment.Chain) deployment.ContractDeploy[*rmn_contract.RMNContract] {
+ rmnAddress, tx2, rmnC, err2 := rmn_contract.DeployRMNContract(
+ chain.DeployerKey,
+ chain.Client,
+ *deployOpts.LegacyDeploymentCfg.RMNConfig,
+ )
+ return deployment.ContractDeploy[*rmn_contract.RMNContract]{
+ Address: rmnAddress, Contract: rmnC, Tx: tx2, Tv: deployment.NewTypeAndVersion(RMN, deployment.Version1_5_0), Err: err2,
+ }
+ })
+ if err != nil {
+ lggr.Errorw("Failed to deploy RMN", "chain", chain.String(), "err", err)
+ return err
+ }
+ rmnAddr = rmn.Address
+ } else {
+ lggr.Infow("RMN already deployed", "chain", chain.String(), "address", chainState.RMN.Address)
+ rmnAddr = chainState.RMN.Address()
+ }
+ } else {
+ if chainState.MockRMN == nil {
+ rmn, err := deployment.DeployContract(lggr, chain, ab,
+ func(chain deployment.Chain) deployment.ContractDeploy[*mock_rmn_contract.MockRMNContract] {
+ rmnAddress, tx2, rmnC, err2 := mock_rmn_contract.DeployMockRMNContract(
+ chain.DeployerKey,
+ chain.Client,
+ )
+ return deployment.ContractDeploy[*mock_rmn_contract.MockRMNContract]{
+ Address: rmnAddress, Contract: rmnC, Tx: tx2, Tv: deployment.NewTypeAndVersion(MockRMN, deployment.Version1_0_0), Err: err2,
+ }
+ })
+ if err != nil {
+ lggr.Errorw("Failed to deploy mock RMN", "chain", chain.String(), "err", err)
+ return err
+ }
+ rmnAddr = rmn.Address
+ } else {
+ lggr.Infow("Mock RMN already deployed", "chain", chain.String(), "addr", chainState.MockRMN.Address)
+ rmnAddr = chainState.MockRMN.Address()
+ }
+ }
if rmnProxy == nil {
- // we want to replicate the mainnet scenario where RMNProxy is already deployed with some existing RMN
- // This will need us to use two different RMNProxy contracts
- // 1. RMNProxyNew with RMNRemote - ( deployed later in chain contracts)
- // 2. RMNProxyExisting with mockRMN - ( deployed here, replicating the behavior of existing RMNProxy with already set RMN)
- rmn, err := deployment.DeployContract(lggr, chain, ab,
- func(chain deployment.Chain) deployment.ContractDeploy[*mock_rmn_contract.MockRMNContract] {
- rmnAddr, tx2, rmn, err2 := mock_rmn_contract.DeployMockRMNContract(
+ RMNProxy, err := deployment.DeployContract(lggr, chain, ab,
+ func(chain deployment.Chain) deployment.ContractDeploy[*rmn_proxy_contract.RMNProxy] {
+ rmnProxyAddr, tx2, rmnProxy2, err2 := rmn_proxy_contract.DeployRMNProxy(
chain.DeployerKey,
chain.Client,
+ rmnAddr,
)
- return deployment.ContractDeploy[*mock_rmn_contract.MockRMNContract]{
- rmnAddr, rmn, tx2, deployment.NewTypeAndVersion(MockRMN, deployment.Version1_0_0), err2,
+ return deployment.ContractDeploy[*rmn_proxy_contract.RMNProxy]{
+ Address: rmnProxyAddr, Contract: rmnProxy2, Tx: tx2, Tv: deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_0_0), Err: err2,
}
})
if err != nil {
- lggr.Errorw("Failed to deploy mock RMN", "chain", chain.String(), "err", err)
+ lggr.Errorw("Failed to deploy RMNProxy", "chain", chain.String(), "err", err)
return err
}
- rmnProxyContract, err := deployment.DeployContract(lggr, chain, ab,
- func(chain deployment.Chain) deployment.ContractDeploy[*rmn_proxy_contract.RMNProxyContract] {
- rmnProxyAddr, tx2, rmnProxy, err2 := rmn_proxy_contract.DeployRMNProxyContract(
- chain.DeployerKey,
- chain.Client,
- rmn.Address,
- )
- return deployment.ContractDeploy[*rmn_proxy_contract.RMNProxyContract]{
- rmnProxyAddr, rmnProxy, tx2, deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_0_0), err2,
- }
- })
+ rmnProxy = RMNProxy.Contract
+ } else {
+ lggr.Infow("RMNProxy already deployed", "chain", chain.String(), "addr", rmnProxy.Address)
+ // check if the RMNProxy is pointing to the correct RMN contract
+ currentRMNAddr, err := rmnProxy.GetARM(nil)
if err != nil {
- lggr.Errorw("Failed to deploy RMNProxyExisting", "chain", chain.String(), "err", err)
+ lggr.Errorw("Failed to get RMN from RMNProxy", "chain", chain.String(), "err", err)
return err
}
- rmnProxy = rmnProxyContract.Contract
+ if currentRMNAddr != rmnAddr {
+ lggr.Infow("RMNProxy is not pointing to the correct RMN contract, updating RMN", "chain", chain.String(), "currentRMN", currentRMNAddr, "expectedRMN", rmnAddr)
+ rmnOwner, err := rmnProxy.Owner(nil)
+ if err != nil {
+ lggr.Errorw("Failed to get owner of RMNProxy", "chain", chain.String(), "err", err)
+ return err
+ }
+ if rmnOwner != chain.DeployerKey.From {
+ lggr.Warnw(
+ "RMNProxy is not owned by the deployer and RMNProxy is not pointing to the correct RMN contract, "+
+ "run SetRMNRemoteOnRMNProxy to update RMN with a proposal",
+ "chain", chain.String(), "owner", rmnOwner, "currentRMN", currentRMNAddr, "expectedRMN", rmnAddr)
+ } else {
+ tx, err := rmnProxy.SetARM(chain.DeployerKey, rmnAddr)
+ if err != nil {
+ lggr.Errorw("Failed to set RMN on RMNProxy", "chain", chain.String(), "err", err)
+ return err
+ }
+ _, err = chain.Confirm(tx)
+ if err != nil {
+ lggr.Errorw("Failed to confirm setRMN on RMNProxy", "chain", chain.String(), "err", err)
+ return err
+ }
+ }
+ }
}
if tokenAdminReg == nil {
tokenAdminRegistry, err := deployment.DeployContract(e.Logger, chain, ab,
@@ -180,7 +259,7 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
chain.DeployerKey,
chain.Client)
return deployment.ContractDeploy[*token_admin_registry.TokenAdminRegistry]{
- tokenAdminRegistryAddr, tokenAdminRegistry, tx2, deployment.NewTypeAndVersion(TokenAdminRegistry, deployment.Version1_5_0), err2,
+ Address: tokenAdminRegistryAddr, Contract: tokenAdminRegistry, Tx: tx2, Tv: deployment.NewTypeAndVersion(TokenAdminRegistry, deployment.Version1_5_0), Err: err2,
}
})
if err != nil {
@@ -199,7 +278,7 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
chain.Client,
tokenAdminReg.Address())
return deployment.ContractDeploy[*registry_module_owner_custom.RegistryModuleOwnerCustom]{
- regModAddr, regMod, tx2, deployment.NewTypeAndVersion(RegistryModule, deployment.Version1_5_0), err2,
+ Address: regModAddr, Contract: regMod, Tx: tx2, Tv: deployment.NewTypeAndVersion(RegistryModule, deployment.Version1_5_0), Err: err2,
}
})
if err != nil {
@@ -237,7 +316,7 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
chain.Client,
)
return deployment.ContractDeploy[*weth9.WETH9]{
- weth9Addr, weth9c, tx2, deployment.NewTypeAndVersion(WETH9, deployment.Version1_0_0), err2,
+ Address: weth9Addr, Contract: weth9c, Tx: tx2, Tv: deployment.NewTypeAndVersion(WETH9, deployment.Version1_0_0), Err: err2,
}
})
if err != nil {
@@ -246,8 +325,10 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
}
weth9Contract = weth.Contract
} else {
- lggr.Infow("weth9 already deployed", "addr", weth9Contract.Address)
+ lggr.Infow("weth9 already deployed", "chain", chain.String(), "addr", weth9Contract.Address)
+ weth9Contract = chainState.Weth9
}
+
// if router is not already deployed, we deploy it
if r == nil {
routerContract, err := deployment.DeployContract(e.Logger, chain, ab,
@@ -259,7 +340,7 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
rmnProxy.Address(),
)
return deployment.ContractDeploy[*router.Router]{
- routerAddr, routerC, tx2, deployment.NewTypeAndVersion(Router, deployment.Version1_2_0), err2,
+ Address: routerAddr, Contract: routerC, Tx: tx2, Tv: deployment.NewTypeAndVersion(Router, deployment.Version1_2_0), Err: err2,
}
})
if err != nil {
@@ -279,7 +360,7 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
chain.Client,
)
return deployment.ContractDeploy[*multicall3.Multicall3]{
- multicall3Addr, multicall3Wrapper, tx2, deployment.NewTypeAndVersion(Multicall3, deployment.Version1_0_0), err2,
+ Address: multicall3Addr, Contract: multicall3Wrapper, Tx: tx2, Tv: deployment.NewTypeAndVersion(Multicall3, deployment.Version1_0_0), Err: err2,
}
})
if err != nil {
@@ -291,7 +372,7 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
e.Logger.Info("ccip multicall already deployed", "chain", chain.String(), "addr", mc3.Address)
}
}
- if isUSDC {
+ if deployOpts.USDCEnabled {
token, pool, messenger, transmitter, err1 := DeployUSDC(e.Logger, chain, ab, rmnProxy.Address(), r.Address())
if err1 != nil {
return err1
@@ -304,5 +385,49 @@ func deployPrerequisiteContracts(e deployment.Environment, ab deployment.Address
"messenger", messenger.Address(),
)
}
+ if chainState.Receiver == nil {
+ _, err := deployment.DeployContract(e.Logger, chain, ab,
+ func(chain deployment.Chain) deployment.ContractDeploy[*maybe_revert_message_receiver.MaybeRevertMessageReceiver] {
+ receiverAddr, tx, receiver, err2 := maybe_revert_message_receiver.DeployMaybeRevertMessageReceiver(
+ chain.DeployerKey,
+ chain.Client,
+ false,
+ )
+ return deployment.ContractDeploy[*maybe_revert_message_receiver.MaybeRevertMessageReceiver]{
+ Address: receiverAddr, Contract: receiver, Tx: tx, Tv: deployment.NewTypeAndVersion(CCIPReceiver, deployment.Version1_0_0), Err: err2,
+ }
+ })
+ if err != nil {
+ e.Logger.Errorw("Failed to deploy receiver", "chain", chain.String(), "err", err)
+ return err
+ }
+ } else {
+ e.Logger.Infow("receiver already deployed", "addr", chainState.Receiver.Address, "chain", chain.String())
+ }
+ // Only applicable if setting up for 1.5 version, remove this once we have fully migrated to 1.6
+ if deployOpts.LegacyDeploymentCfg != nil {
+ if chainState.PriceRegistry == nil {
+ _, err := deployment.DeployContract(lggr, chain, ab,
+ func(chain deployment.Chain) deployment.ContractDeploy[*price_registry_1_2_0.PriceRegistry] {
+ priceRegAddr, tx2, priceRegAddrC, err2 := price_registry_1_2_0.DeployPriceRegistry(
+ chain.DeployerKey,
+ chain.Client,
+ nil,
+ []common.Address{weth9Contract.Address(), chainState.LinkToken.Address()},
+ deployOpts.LegacyDeploymentCfg.PriceRegStalenessThreshold,
+ )
+ return deployment.ContractDeploy[*price_registry_1_2_0.PriceRegistry]{
+ Address: priceRegAddr, Contract: priceRegAddrC, Tx: tx2,
+ Tv: deployment.NewTypeAndVersion(PriceRegistry, deployment.Version1_2_0), Err: err2,
+ }
+ })
+ if err != nil {
+ lggr.Errorw("Failed to deploy PriceRegistry", "chain", chain.String(), "err", err)
+ return err
+ }
+ } else {
+ lggr.Infow("PriceRegistry already deployed", "chain", chain.String(), "addr", chainState.PriceRegistry.Address)
+ }
+ }
return nil
}
diff --git a/deployment/ccip/changeset/cs_prerequisites_test.go b/deployment/ccip/changeset/cs_prerequisites_test.go
index da1ff9c83a9..5835bd41aa3 100644
--- a/deployment/ccip/changeset/cs_prerequisites_test.go
+++ b/deployment/ccip/changeset/cs_prerequisites_test.go
@@ -20,7 +20,11 @@ func TestDeployPrerequisites(t *testing.T) {
})
newChain := e.AllChainSelectors()[0]
cfg := DeployPrerequisiteConfig{
- ChainSelectors: []uint64{newChain},
+ Configs: []DeployPrerequisiteConfigPerChain{
+ {
+ ChainSelector: newChain,
+ },
+ },
}
output, err := DeployPrerequisites(e, cfg)
require.NoError(t, err)
diff --git a/deployment/ccip/changeset/cs_update_rmn_config.go b/deployment/ccip/changeset/cs_update_rmn_config.go
index b10991c977c..96f8eacb4cc 100644
--- a/deployment/ccip/changeset/cs_update_rmn_config.go
+++ b/deployment/ccip/changeset/cs_update_rmn_config.go
@@ -11,13 +11,146 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
+
"github.com/smartcontractkit/chainlink/deployment"
- commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
+type SetRMNRemoteOnRMNProxyConfig struct {
+ ChainSelectors []uint64
+ MCMSConfig *MCMSConfig
+}
+
+func (c SetRMNRemoteOnRMNProxyConfig) Validate(state CCIPOnChainState) error {
+ for _, chain := range c.ChainSelectors {
+ err := deployment.IsValidChainSelector(chain)
+ if err != nil {
+ return err
+ }
+ chainState, exists := state.Chains[chain]
+ if !exists {
+ return fmt.Errorf("chain %d not found in state", chain)
+ }
+ if chainState.RMNRemote == nil {
+ return fmt.Errorf("RMNRemote not found for chain %d", chain)
+ }
+ if chainState.RMNProxy == nil {
+ return fmt.Errorf("RMNProxy not found for chain %d", chain)
+ }
+ }
+ return nil
+}
+
+func SetRMNRemoteOnRMNProxy(e deployment.Environment, cfg SetRMNRemoteOnRMNProxyConfig) (deployment.ChangesetOutput, error) {
+ state, err := LoadOnchainState(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err)
+ }
+ if err := cfg.Validate(state); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ timelocks, err := state.GetAllTimeLocksForChains(cfg.ChainSelectors)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to get timelocks for chains %v: %w", cfg.ChainSelectors, err)
+ }
+ multiSigs, err := state.GetAllProposerMCMSForChains(cfg.ChainSelectors)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to get proposer MCMS for chains %v: %w", cfg.ChainSelectors, err)
+ }
+ var timelockBatch []timelock.BatchChainOperation
+ for _, sel := range cfg.ChainSelectors {
+ chain, exists := e.Chains[sel]
+ if !exists {
+ return deployment.ChangesetOutput{}, fmt.Errorf("chain %d not found", sel)
+ }
+ txOpts := chain.DeployerKey
+ if cfg.MCMSConfig != nil {
+ txOpts = deployment.SimTransactOpts()
+ }
+ mcmsOps, err := setRMNRemoteOnRMNProxyOp(txOpts, chain, state.Chains[sel], cfg.MCMSConfig != nil)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), err)
+ }
+ if cfg.MCMSConfig != nil {
+ timelockBatch = append(timelockBatch, timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(sel),
+ Batch: []mcms.Operation{mcmsOps},
+ })
+ }
+ }
+ // If we're not using MCMS, we can just return now as we've already confirmed the transactions
+ if len(timelockBatch) == 0 {
+ return deployment.ChangesetOutput{}, nil
+ }
+ prop, err := proposalutils.BuildProposalFromBatches(
+ timelocks,
+ multiSigs,
+ timelockBatch,
+ fmt.Sprintf("proposal to set RMNRemote on RMNProxy for chains %v", cfg.ChainSelectors),
+ cfg.MCMSConfig.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{
+ Proposals: []timelock.MCMSWithTimelockProposal{
+ *prop,
+ },
+ }, nil
+}
+
+func setRMNRemoteOnRMNProxyOp(txOpts *bind.TransactOpts, chain deployment.Chain, chainState CCIPChainState, mcmsEnabled bool) (mcms.Operation, error) {
+ rmnProxy := chainState.RMNProxy
+ rmnRemoteAddr := chainState.RMNRemote.Address()
+ setRMNTx, err := rmnProxy.SetARM(txOpts, rmnRemoteAddr)
+ if err != nil {
+ return mcms.Operation{}, fmt.Errorf("failed to build call data/transaction to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), err)
+ }
+ if !mcmsEnabled {
+ _, err = deployment.ConfirmIfNoError(chain, setRMNTx, err)
+ if err != nil {
+ return mcms.Operation{}, fmt.Errorf("failed to confirm tx to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), deployment.MaybeDataErr(err))
+ }
+ }
+ return mcms.Operation{
+ To: rmnProxy.Address(),
+ Data: setRMNTx.Data(),
+ Value: big.NewInt(0),
+ }, nil
+}
+
+type RMNNopConfig struct {
+ NodeIndex uint64
+ OffchainPublicKey [32]byte
+ EVMOnChainPublicKey common.Address
+ PeerId p2pkey.PeerID
+}
+
+func (c RMNNopConfig) ToRMNHomeNode() rmn_home.RMNHomeNode {
+ return rmn_home.RMNHomeNode{
+ PeerId: c.PeerId,
+ OffchainPublicKey: c.OffchainPublicKey,
+ }
+}
+
+func (c RMNNopConfig) ToRMNRemoteSigner() rmn_remote.RMNRemoteSigner {
+ return rmn_remote.RMNRemoteSigner{
+ OnchainPublicKey: c.EVMOnChainPublicKey,
+ NodeIndex: c.NodeIndex,
+ }
+}
+
+func (c RMNNopConfig) SetBit(bitmap *big.Int, value bool) {
+ if value {
+ bitmap.SetBit(bitmap, int(c.NodeIndex), 1)
+ } else {
+ bitmap.SetBit(bitmap, int(c.NodeIndex), 0)
+ }
+}
+
func getDeployer(e deployment.Environment, chain uint64, mcmConfig *MCMSConfig) *bind.TransactOpts {
if mcmConfig == nil {
return e.Chains[chain].DeployerKey
@@ -274,10 +407,10 @@ func NewPromoteCandidateConfigChangeset(e deployment.Environment, config Promote
}, nil
}
-func buildTimelockPerChain(e deployment.Environment, state CCIPOnChainState) map[uint64]*commonchangeset.TimelockExecutionContracts {
- timelocksPerChain := make(map[uint64]*commonchangeset.TimelockExecutionContracts)
+func buildTimelockPerChain(e deployment.Environment, state CCIPOnChainState) map[uint64]*proposalutils.TimelockExecutionContracts {
+ timelocksPerChain := make(map[uint64]*proposalutils.TimelockExecutionContracts)
for _, chain := range e.Chains {
- timelocksPerChain[chain.Selector] = &commonchangeset.TimelockExecutionContracts{
+ timelocksPerChain[chain.Selector] = &proposalutils.TimelockExecutionContracts{
Timelock: state.Chains[chain.Selector].Timelock,
CallProxy: state.Chains[chain.Selector].CallProxy,
}
@@ -310,10 +443,14 @@ func buildRMNRemotePerChain(e deployment.Environment, state CCIPOnChainState) ma
return timelocksPerChain
}
+type RMNRemoteConfig struct {
+ Signers []rmn_remote.RMNRemoteSigner
+ F uint64
+}
+
type SetRMNRemoteConfig struct {
HomeChainSelector uint64
- Signers []rmn_remote.RMNRemoteSigner
- F uint64
+ RMNRemoteConfigs map[uint64]RMNRemoteConfig
MCMSConfig *MCMSConfig
}
@@ -323,14 +460,21 @@ func (c SetRMNRemoteConfig) Validate() error {
return err
}
- for i := 0; i < len(c.Signers)-1; i++ {
- if c.Signers[i].NodeIndex >= c.Signers[i+1].NodeIndex {
- return fmt.Errorf("signers must be in ascending order of nodeIndex")
+ for chain, config := range c.RMNRemoteConfigs {
+ err := deployment.IsValidChainSelector(chain)
+ if err != nil {
+ return err
+ }
+
+ for i := 0; i < len(config.Signers)-1; i++ {
+ if config.Signers[i].NodeIndex >= config.Signers[i+1].NodeIndex {
+ return fmt.Errorf("signers must be in ascending order of nodeIndex, but found %d >= %d", config.Signers[i].NodeIndex, config.Signers[i+1].NodeIndex)
+ }
}
- }
- if len(c.Signers) < 2*int(c.F)+1 {
- return fmt.Errorf("signers count must greater than or equal to %d", 2*c.F+1)
+ if len(config.Signers) < 2*int(config.F)+1 {
+ return fmt.Errorf("signers count (%d) must be greater than or equal to %d", len(config.Signers), 2*config.F+1)
+ }
}
return nil
@@ -367,9 +511,10 @@ func NewSetRMNRemoteConfigChangeset(e deployment.Environment, config SetRMNRemot
rmnRemotePerChain := buildRMNRemotePerChain(e, state)
batches := make([]timelock.BatchChainOperation, 0)
- for chain, remote := range rmnRemotePerChain {
- if remote == nil {
- continue
+ for chain, remoteConfig := range config.RMNRemoteConfigs {
+ remote, ok := rmnRemotePerChain[chain]
+ if !ok {
+ return deployment.ChangesetOutput{}, fmt.Errorf("RMNRemote contract not found for chain %d", chain)
}
currentVersionConfig, err := remote.GetVersionedConfig(nil)
@@ -379,8 +524,8 @@ func NewSetRMNRemoteConfigChangeset(e deployment.Environment, config SetRMNRemot
newConfig := rmn_remote.RMNRemoteConfig{
RmnHomeContractConfigDigest: activeConfig,
- Signers: config.Signers,
- F: config.F,
+ Signers: remoteConfig.Signers,
+ F: remoteConfig.F,
}
if reflect.DeepEqual(currentVersionConfig.Config, newConfig) {
diff --git a/deployment/ccip/changeset/cs_update_rmn_config_test.go b/deployment/ccip/changeset/cs_update_rmn_config_test.go
index e22b85cdf81..e7543e22cb7 100644
--- a/deployment/ccip/changeset/cs_update_rmn_config_test.go
+++ b/deployment/ccip/changeset/cs_update_rmn_config_test.go
@@ -8,13 +8,37 @@ import (
"github.com/smartcontractkit/chainlink/deployment"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote"
)
+var (
+ rmn_staging_1 = RMNNopConfig{
+ NodeIndex: 0,
+ PeerId: deployment.MustPeerIDFromString("p2p_12D3KooWRXxZq3pd4a3ZGkKj7Nt1SQQrnB8CuvbPnnV9KVeMeWqg"),
+ OffchainPublicKey: [32]byte(common.FromHex("0xb34944857a42444d1b285d7940d6e06682309e0781e43a69676ee9f85c73c2d1")),
+ EVMOnChainPublicKey: common.HexToAddress("0x5af8ee32316a6427f169a45fdc1b3a91a85ac459e3c1cb91c69e1c51f0c1fc21"),
+ }
+ rmn_staging_2 = RMNNopConfig{
+ NodeIndex: 1,
+ PeerId: deployment.MustPeerIDFromString("p2p_12D3KooWEmdxYQFsRbD9aFczF32zA3CcUwuSiWCk2CrmACo4v9RL"),
+ OffchainPublicKey: [32]byte(common.FromHex("0x68d9f3f274e3985528a923a9bace3d39c55dd778b187b4120b384cc48c892859")),
+ EVMOnChainPublicKey: common.HexToAddress("0x858589216956f482a0f68b282a7050af4cd48ed2"),
+ }
+ rmn_staging_3 = RMNNopConfig{
+ NodeIndex: 2,
+ PeerId: deployment.MustPeerIDFromString("p2p_12D3KooWJS42cNXKJvj6DeZnxEX7aGxhEuap6uNFrz554AbUDw6Q"),
+ OffchainPublicKey: [32]byte(common.FromHex("0x5af8ee32316a6427f169a45fdc1b3a91a85ac459e3c1cb91c69e1c51f0c1fc21")),
+ EVMOnChainPublicKey: common.HexToAddress("0x7c5e94162c6fabbdeb3bfe83ae532846e337bfae"),
+ }
+)
+
type updateRMNConfigTestCase struct {
useMCMS bool
name string
+ nops []RMNNopConfig
}
func TestUpdateRMNConfig(t *testing.T) {
@@ -23,15 +47,18 @@ func TestUpdateRMNConfig(t *testing.T) {
{
useMCMS: true,
name: "with MCMS",
+ nops: []RMNNopConfig{rmn_staging_1, rmn_staging_2, rmn_staging_3},
},
{
useMCMS: false,
name: "without MCMS",
+ nops: []RMNNopConfig{rmn_staging_1, rmn_staging_2, rmn_staging_3},
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
+ t.Parallel()
updateRMNConfig(t, tc)
})
}
@@ -80,10 +107,15 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) {
}
}
+ nodes := make([]rmn_home.RMNHomeNode, 0, len(tc.nops))
+ for _, nop := range tc.nops {
+ nodes = append(nodes, nop.ToRMNHomeNode())
+ }
+
setRMNHomeCandidateConfig := SetRMNHomeCandidateConfig{
HomeChainSelector: e.HomeChainSel,
RMNStaticConfig: rmn_home.RMNHomeStaticConfig{
- Nodes: []rmn_home.RMNHomeNode{},
+ Nodes: nodes,
OffchainConfig: []byte(""),
},
RMNDynamicConfig: rmn_home.RMNHomeDynamicConfig{
@@ -132,16 +164,25 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) {
require.NoError(t, err)
require.NotEqual(t, previousActiveDigest, currentActiveDigest)
+ signers := make([]rmn_remote.RMNRemoteSigner, 0, len(tc.nops))
+ for _, nop := range tc.nops {
+ signers = append(signers, nop.ToRMNRemoteSigner())
+ }
+
+ remoteConfigs := make(map[uint64]RMNRemoteConfig, len(e.Env.Chains))
+ for _, chain := range e.Env.Chains {
+ remoteConfig := RMNRemoteConfig{
+ Signers: signers,
+ F: 0,
+ }
+
+ remoteConfigs[chain.Selector] = remoteConfig
+ }
+
setRemoteConfig := SetRMNRemoteConfig{
HomeChainSelector: e.HomeChainSel,
- Signers: []rmn_remote.RMNRemoteSigner{
- {
- OnchainPublicKey: common.Address{},
- NodeIndex: 0,
- },
- },
- F: 0,
- MCMSConfig: mcmsConfig,
+ RMNRemoteConfigs: remoteConfigs,
+ MCMSConfig: mcmsConfig,
}
_, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{
@@ -176,3 +217,90 @@ func buildRMNRemoteAddressPerChain(e deployment.Environment, state CCIPOnChainSt
}
return rmnRemoteAddressPerChain
}
+
+func TestSetRMNRemoteOnRMNProxy(t *testing.T) {
+ t.Parallel()
+ e := NewMemoryEnvironment(t, WithNoJobsAndContracts())
+ allChains := e.Env.AllChainSelectors()
+ mcmsCfg := make(map[uint64]commontypes.MCMSWithTimelockConfig)
+ var err error
+ var prereqCfgs []DeployPrerequisiteConfigPerChain
+ for _, c := range e.Env.AllChainSelectors() {
+ mcmsCfg[c] = proposalutils.SingleGroupTimelockConfig(t)
+ prereqCfgs = append(prereqCfgs, DeployPrerequisiteConfigPerChain{
+ ChainSelector: c,
+ })
+ }
+ // Need to deploy prerequisites first so that we can form the USDC config
+ // no proposals to be made, timelock can be passed as nil here
+ e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken),
+ Config: allChains,
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(DeployPrerequisites),
+ Config: DeployPrerequisiteConfig{
+ Configs: prereqCfgs,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock),
+ Config: mcmsCfg,
+ },
+ })
+ require.NoError(t, err)
+ contractsByChain := make(map[uint64][]common.Address)
+ state, err := LoadOnchainState(e.Env)
+ require.NoError(t, err)
+ for _, chain := range allChains {
+ rmnProxy := state.Chains[chain].RMNProxy
+ require.NotNil(t, rmnProxy)
+ contractsByChain[chain] = []common.Address{rmnProxy.Address()}
+ }
+ timelockContractsPerChain := make(map[uint64]*proposalutils.TimelockExecutionContracts)
+ for _, chain := range allChains {
+ timelockContractsPerChain[chain] = &proposalutils.TimelockExecutionContracts{
+ Timelock: state.Chains[chain].Timelock,
+ CallProxy: state.Chains[chain].CallProxy,
+ }
+ }
+ e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, timelockContractsPerChain, []commonchangeset.ChangesetApplication{
+ // transfer ownership of RMNProxy to timelock
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock),
+ Config: commonchangeset.TransferToMCMSWithTimelockConfig{
+ ContractsByChain: contractsByChain,
+ MinDelay: 0,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(DeployChainContracts),
+ Config: DeployChainContractsConfig{
+ ChainSelectors: allChains,
+ HomeChainSelector: e.HomeChainSel,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(SetRMNRemoteOnRMNProxy),
+ Config: SetRMNRemoteOnRMNProxyConfig{
+ ChainSelectors: allChains,
+ MCMSConfig: &MCMSConfig{
+ MinDelay: 0,
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+ state, err = LoadOnchainState(e.Env)
+ require.NoError(t, err)
+ for _, chain := range allChains {
+ rmnProxy := state.Chains[chain].RMNProxy
+ proxyOwner, err := rmnProxy.Owner(nil)
+ require.NoError(t, err)
+ require.Equal(t, state.Chains[chain].Timelock.Address(), proxyOwner)
+ rmnAddr, err := rmnProxy.GetARM(nil)
+ require.NoError(t, err)
+ require.Equal(t, rmnAddr, state.Chains[chain].RMNRemote.Address())
+ }
+}
diff --git a/deployment/ccip/changeset/internal/deploy_home_chain.go b/deployment/ccip/changeset/internal/deploy_home_chain.go
index aa029fd4bec..ec5b879be0c 100644
--- a/deployment/ccip/changeset/internal/deploy_home_chain.go
+++ b/deployment/ccip/changeset/internal/deploy_home_chain.go
@@ -8,7 +8,6 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
- "github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper"
@@ -20,7 +19,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
const (
@@ -47,6 +46,10 @@ const (
MaxDurationObservation = 5 * time.Second
MaxDurationShouldAcceptAttestedReport = 10 * time.Second
MaxDurationShouldTransmitAcceptedReport = 10 * time.Second
+
+ GasPriceDeviationPPB = 1000
+ DAGasPriceDeviationPPB = 0
+ OptimisticConfirmations = 1
)
var (
@@ -123,6 +126,12 @@ func DonIDForChain(registry *capabilities_registry.CapabilitiesRegistry, ccipHom
if err != nil {
return 0, fmt.Errorf("get all commit configs from cciphome: %w", err)
}
+ if configs.ActiveConfig.ConfigDigest == [32]byte{} && configs.CandidateConfig.ConfigDigest == [32]byte{} {
+ configs, err = ccipHome.GetAllConfigs(nil, don.Id, uint8(types.PluginTypeCCIPExec))
+ if err != nil {
+ return 0, fmt.Errorf("get all exec configs from cciphome: %w", err)
+ }
+ }
if configs.ActiveConfig.Config.ChainSelector == chainSelector || configs.CandidateConfig.Config.ChainSelector == chainSelector {
donIDs = append(donIDs, don.Id)
}
@@ -143,6 +152,8 @@ func DonIDForChain(registry *capabilities_registry.CapabilitiesRegistry, ccipHom
return donIDs[0], nil
}
+// BuildSetOCR3ConfigArgs builds the OCR3 config arguments for the OffRamp contract
+// using the donID's OCR3 configs from the CCIPHome contract.
func BuildSetOCR3ConfigArgs(
donID uint32,
ccipHome *ccip_home.CCIPHome,
@@ -185,255 +196,6 @@ func BuildSetOCR3ConfigArgs(
return offrampOCR3Configs, nil
}
-func SetupExecDON(
- lggr logger.Logger,
- donID uint32,
- execConfig ccip_home.CCIPHomeOCR3Config,
- capReg *capabilities_registry.CapabilitiesRegistry,
- home deployment.Chain,
- nodes deployment.Nodes,
- ccipHome *ccip_home.CCIPHome,
-) error {
- encodedSetCandidateCall, err := CCIPHomeABI.Pack(
- "setCandidate",
- donID,
- execConfig.PluginType,
- execConfig,
- [32]byte{},
- )
- if err != nil {
- return fmt.Errorf("pack set candidate call: %w", err)
- }
-
- // set candidate call
- tx, err := capReg.UpdateDON(
- home.DeployerKey,
- donID,
- nodes.PeerIDs(),
- []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: CCIPCapabilityID,
- Config: encodedSetCandidateCall,
- },
- },
- false,
- nodes.DefaultF(),
- )
- if err != nil {
- return fmt.Errorf("update don w/ exec config: %w", err)
- }
-
- if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil {
- return fmt.Errorf("confirm update don w/ exec config: %w", err)
- }
- lggr.Infow("Updated DON with exec config", "chain", home.String(), "donID", donID, "txHash", tx.Hash().Hex(), "setCandidateCall", encodedSetCandidateCall)
-
- execCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, execConfig.PluginType)
- if err != nil {
- return fmt.Errorf("get exec candidate digest 1st time: %w", err)
- }
-
- if execCandidateDigest == [32]byte{} {
- return fmt.Errorf("candidate digest is empty, expected nonempty")
- }
- lggr.Infow("Got exec candidate digest", "chain", home.String(), "donID", donID, "execCandidateDigest", execCandidateDigest)
- // promote candidate call
- encodedPromotionCall, err := CCIPHomeABI.Pack(
- "promoteCandidateAndRevokeActive",
- donID,
- execConfig.PluginType,
- execCandidateDigest,
- [32]byte{},
- )
- if err != nil {
- return fmt.Errorf("pack promotion call: %w", err)
- }
-
- tx, err = capReg.UpdateDON(
- home.DeployerKey,
- donID,
- nodes.PeerIDs(),
- []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: CCIPCapabilityID,
- Config: encodedPromotionCall,
- },
- },
- false,
- nodes.DefaultF(),
- )
- if err != nil {
- return fmt.Errorf("update don w/ exec config: %w", err)
- }
- bn, err := deployment.ConfirmIfNoError(home, tx, err)
- if err != nil {
- return fmt.Errorf("confirm update don w/ exec config: %w", err)
- }
- if bn == 0 {
- return fmt.Errorf("UpdateDON tx not confirmed")
- }
- lggr.Infow("Promoted exec candidate", "chain", home.String(), "donID", donID, "txHash", tx.Hash().Hex(), "promotionCall", encodedPromotionCall)
- // check if candidate digest is promoted
- pEvent, err := ccipHome.FilterConfigPromoted(&bind.FilterOpts{
- Context: context.Background(),
- Start: bn,
- }, [][32]byte{execCandidateDigest})
- if err != nil {
- return fmt.Errorf("filter exec config promoted: %w", err)
- }
- if !pEvent.Next() {
- return fmt.Errorf("exec config not promoted")
- }
- // check that candidate digest is empty.
- execCandidateDigest, err = ccipHome.GetCandidateDigest(nil, donID, execConfig.PluginType)
- if err != nil {
- return fmt.Errorf("get exec candidate digest 2nd time: %w", err)
- }
-
- if execCandidateDigest != [32]byte{} {
- return fmt.Errorf("candidate digest is nonempty after promotion, expected empty")
- }
-
- // check that active digest is non-empty.
- execActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(types.PluginTypeCCIPExec))
- if err != nil {
- return fmt.Errorf("get active exec digest: %w", err)
- }
-
- if execActiveDigest == [32]byte{} {
- return fmt.Errorf("active exec digest is empty, expected nonempty")
- }
-
- execConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(types.PluginTypeCCIPExec))
- if err != nil {
- return fmt.Errorf("get all exec configs 2nd time: %w", err)
- }
-
- // log the above info
- lggr.Infow("completed exec DON creation and promotion",
- "donID", donID,
- "execCandidateDigest", execCandidateDigest,
- "execActiveDigest", execActiveDigest,
- "execCandidateDigestFromGetAllConfigs", execConfigs.CandidateConfig.ConfigDigest,
- "execActiveDigestFromGetAllConfigs", execConfigs.ActiveConfig.ConfigDigest,
- )
-
- return nil
-}
-
-func SetupCommitDON(
- lggr logger.Logger,
- donID uint32,
- commitConfig ccip_home.CCIPHomeOCR3Config,
- capReg *capabilities_registry.CapabilitiesRegistry,
- home deployment.Chain,
- nodes deployment.Nodes,
- ccipHome *ccip_home.CCIPHome,
-) error {
- encodedSetCandidateCall, err := CCIPHomeABI.Pack(
- "setCandidate",
- donID,
- commitConfig.PluginType,
- commitConfig,
- [32]byte{},
- )
- if err != nil {
- return fmt.Errorf("pack set candidate call: %w", err)
- }
- tx, err := capReg.AddDON(home.DeployerKey, nodes.PeerIDs(), []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: CCIPCapabilityID,
- Config: encodedSetCandidateCall,
- },
- }, false, false, nodes.DefaultF())
- if err != nil {
- return fmt.Errorf("add don w/ commit config: %w", err)
- }
-
- if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil {
- return fmt.Errorf("confirm add don w/ commit config: %w", err)
- }
- lggr.Debugw("Added DON with commit config", "chain", home.String(), "donID", donID, "txHash", tx.Hash().Hex(), "setCandidateCall", encodedSetCandidateCall)
- commitCandidateDigest, err := ccipHome.GetCandidateDigest(nil, donID, commitConfig.PluginType)
- if err != nil {
- return fmt.Errorf("get commit candidate digest: %w", err)
- }
-
- if commitCandidateDigest == [32]byte{} {
- return fmt.Errorf("candidate digest is empty, expected nonempty")
- }
- lggr.Debugw("Got commit candidate digest", "chain", home.String(), "donID", donID, "commitCandidateDigest", commitCandidateDigest)
-
- encodedPromotionCall, err := CCIPHomeABI.Pack(
- "promoteCandidateAndRevokeActive",
- donID,
- commitConfig.PluginType,
- commitCandidateDigest,
- [32]byte{},
- )
- if err != nil {
- return fmt.Errorf("pack promotion call: %w", err)
- }
-
- tx, err = capReg.UpdateDON(
- home.DeployerKey,
- donID,
- nodes.PeerIDs(),
- []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
- {
- CapabilityId: CCIPCapabilityID,
- Config: encodedPromotionCall,
- },
- },
- false,
- nodes.DefaultF(),
- )
- if err != nil {
- return fmt.Errorf("update don w/ commit config: %w", err)
- }
-
- if _, err := deployment.ConfirmIfNoError(home, tx, err); err != nil {
- return fmt.Errorf("confirm update don w/ commit config: %w", err)
- }
- lggr.Debugw("Promoted commit candidate", "chain", home.String(), "donID", donID, "txHash", tx.Hash().Hex(), "promotionCall", encodedPromotionCall)
-
- // check that candidate digest is empty.
- commitCandidateDigest, err = ccipHome.GetCandidateDigest(nil, donID, commitConfig.PluginType)
- if err != nil {
- return fmt.Errorf("get commit candidate digest 2nd time: %w", err)
- }
-
- if commitCandidateDigest != [32]byte{} {
- return fmt.Errorf("candidate digest is nonempty after promotion, expected empty")
- }
-
- // check that active digest is non-empty.
- commitActiveDigest, err := ccipHome.GetActiveDigest(nil, donID, uint8(types.PluginTypeCCIPCommit))
- if err != nil {
- return fmt.Errorf("get active commit digest: %w", err)
- }
-
- if commitActiveDigest == [32]byte{} {
- return fmt.Errorf("active commit digest is empty, expected nonempty")
- }
-
- commitConfigs, err := ccipHome.GetAllConfigs(nil, donID, uint8(types.PluginTypeCCIPCommit))
- if err != nil {
- return fmt.Errorf("get all commit configs 2nd time: %w", err)
- }
-
- // log the above information
- lggr.Infow("completed commit DON creation and promotion",
- "donID", donID,
- "commitCandidateDigest", commitCandidateDigest,
- "commitActiveDigest", commitActiveDigest,
- "commitCandidateDigestFromGetAllConfigs", commitConfigs.CandidateConfig.ConfigDigest,
- "commitActiveDigestFromGetAllConfigs", commitConfigs.ActiveConfig.ConfigDigest,
- )
-
- return nil
-}
-
func BuildOCR3ConfigForCCIPHome(
ocrSecrets deployment.OCRSecrets,
offRamp *offramp.OffRamp,
@@ -564,3 +326,24 @@ func BuildOCR3ConfigForCCIPHome(
return ocr3Configs, nil
}
+
+func DONIdExists(cr *capabilities_registry.CapabilitiesRegistry, donIDs []uint32) error {
+ // DON ids must exist
+ dons, err := cr.GetDONs(nil)
+ if err != nil {
+ return fmt.Errorf("failed to get dons: %w", err)
+ }
+ for _, donID := range donIDs {
+ exists := false
+ for _, don := range dons {
+ if don.Id == donID {
+ exists = true
+ break
+ }
+ }
+ if !exists {
+ return fmt.Errorf("don id %d does not exist", donID)
+ }
+ }
+ return nil
+}
diff --git a/deployment/ccip/changeset/solana_state.go b/deployment/ccip/changeset/solana_state.go
new file mode 100644
index 00000000000..4e5507cfcd3
--- /dev/null
+++ b/deployment/ccip/changeset/solana_state.go
@@ -0,0 +1,6 @@
+package changeset
+
+// SolChainState holds a Go binding for all the currently deployed CCIP programs
+// on a chain. If a binding is nil, it means here is no such contract on the chain.
+type SolCCIPChainState struct {
+}
diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go
index 7453195d304..b50724eaa16 100644
--- a/deployment/ccip/changeset/state.go
+++ b/deployment/ccip/changeset/state.go
@@ -3,7 +3,14 @@ package changeset
import (
"fmt"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
+
burn_mint_token_pool "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_4_0"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_messenger"
@@ -23,7 +30,7 @@ import (
commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset"
commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
common_v1_0 "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store"
+
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/registry_module_owner_custom"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
@@ -32,7 +39,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager"
@@ -43,12 +50,14 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/weth9"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface"
)
var (
- // Legacy
- CommitStore deployment.ContractType = "CommitStore"
+ // Legacy
+ CommitStore deployment.ContractType = "CommitStore"
+ PriceRegistry deployment.ContractType = "PriceRegistry"
+ RMN deployment.ContractType = "RMN"
// Not legacy
MockRMN deployment.ContractType = "MockRMN"
@@ -87,26 +96,16 @@ type CCIPChainState struct {
commoncs.MCMSWithTimelockState
commoncs.LinkTokenState
commoncs.StaticLinkTokenState
- OnRamp *onramp.OnRamp
- OffRamp *offramp.OffRamp
- FeeQuoter *fee_quoter.FeeQuoter
- // We need 2 RMNProxy contracts because we are in the process of migrating to a new version.
- // We will switch to the existing one once the migration is complete.
- // This is the new RMNProxy contract that will be used for testing RMNRemote before migration.
- // Initially RMNProxyNew will point to RMNRemote
- RMNProxyNew *rmn_proxy_contract.RMNProxyContract
- // Existing RMNProxy contract that is used in production, This already has existing 1.5 RMN set.
- // once RMNRemote is tested with RMNProxyNew, as part of migration
- // RMNProxyExisting will point to RMNRemote. This will switch over CCIP 1.5 to 1.6
- RMNProxyExisting *rmn_proxy_contract.RMNProxyContract
+ OnRamp *onramp.OnRamp
+ OffRamp *offramp.OffRamp
+ FeeQuoter *fee_quoter.FeeQuoter
+ RMNProxy *rmn_proxy_contract.RMNProxy
NonceManager *nonce_manager.NonceManager
TokenAdminRegistry *token_admin_registry.TokenAdminRegistry
RegistryModule *registry_module_owner_custom.RegistryModuleOwnerCustom
Router *router.Router
- CommitStore *commit_store.CommitStore
Weth9 *weth9.WETH9
RMNRemote *rmn_remote.RMNRemote
- MockRMN *mock_rmn_contract.MockRMNContract
// Map between token Descriptor (e.g. LinkSymbol, WethSymbol)
// and the respective token contract
// This is more of an illustration of how we'll have tokens, and it might need some work later to work properly.
@@ -129,6 +128,14 @@ type CCIPChainState struct {
MockUSDCTransmitter *mock_usdc_token_transmitter.MockE2EUSDCTransmitter
MockUSDCTokenMessenger *mock_usdc_token_messenger.MockE2EUSDCTokenMessenger
Multicall3 *multicall3.Multicall3
+
+ // Legacy contracts
+ EVM2EVMOnRamp map[uint64]*evm_2_evm_onramp.EVM2EVMOnRamp // mapping of dest chain selector -> EVM2EVMOnRamp
+ CommitStore map[uint64]*commit_store.CommitStore // mapping of source chain selector -> CommitStore
+ EVM2EVMOffRamp map[uint64]*evm_2_evm_offramp.EVM2EVMOffRamp // mapping of source chain selector -> EVM2EVMOffRamp
+ MockRMN *mock_rmn_contract.MockRMNContract
+ PriceRegistry *price_registry_1_2_0.PriceRegistry
+ RMN *rmn_contract.RMNContract
}
func (c CCIPChainState) GenerateView() (view.ChainView, error) {
@@ -159,8 +166,17 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) {
if err != nil {
return chainView, errors.Wrapf(err, "failed to generate rmn remote view for rmn remote %s", c.RMNRemote.Address().String())
}
- chainView.RMN[c.RMNRemote.Address().Hex()] = rmnView
+ chainView.RMNRemote[c.RMNRemote.Address().Hex()] = rmnView
}
+
+ if c.RMNHome != nil {
+ rmnHomeView, err := v1_6.GenerateRMNHomeView(c.RMNHome)
+ if err != nil {
+ return chainView, errors.Wrapf(err, "failed to generate rmn home view for rmn home %s", c.RMNHome.Address().String())
+ }
+ chainView.RMNHome[c.RMNHome.Address().Hex()] = rmnHomeView
+ }
+
if c.FeeQuoter != nil && c.Router != nil && c.TokenAdminRegistry != nil {
fqView, err := v1_6.GenerateFeeQuoterView(c.FeeQuoter, c.Router, c.TokenAdminRegistry)
if err != nil {
@@ -192,20 +208,12 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) {
chainView.OffRamp[c.OffRamp.Address().Hex()] = offRampView
}
- if c.CommitStore != nil {
- commitStoreView, err := v1_5.GenerateCommitStoreView(c.CommitStore)
- if err != nil {
- return chainView, errors.Wrapf(err, "failed to generate commit store view for commit store %s", c.CommitStore.Address().String())
- }
- chainView.CommitStore[c.CommitStore.Address().Hex()] = commitStoreView
- }
-
- if c.RMNProxyNew != nil {
- rmnProxyView, err := v1_0.GenerateRMNProxyView(c.RMNProxyNew)
+ if c.RMNProxy != nil {
+ rmnProxyView, err := v1_0.GenerateRMNProxyView(c.RMNProxy)
if err != nil {
- return chainView, errors.Wrapf(err, "failed to generate rmn proxy view for rmn proxy %s", c.RMNProxyNew.Address().String())
+ return chainView, errors.Wrapf(err, "failed to generate rmn proxy view for rmn proxy %s", c.RMNProxy.Address().String())
}
- chainView.RMNProxy[c.RMNProxyNew.Address().Hex()] = rmnProxyView
+ chainView.RMNProxy[c.RMNProxy.Address().Hex()] = rmnProxyView
}
if c.CCIPHome != nil && c.CapabilityRegistry != nil {
chView, err := v1_6.GenerateCCIPHomeView(c.CapabilityRegistry, c.CCIPHome)
@@ -242,6 +250,53 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) {
}
chainView.StaticLinkToken = staticLinkTokenView
}
+ // Legacy contracts
+ if c.CommitStore != nil {
+ for source, commitStore := range c.CommitStore {
+ commitStoreView, err := v1_5.GenerateCommitStoreView(commitStore)
+ if err != nil {
+ return chainView, errors.Wrapf(err, "failed to generate commit store view for commit store %s for source %d", commitStore.Address().String(), source)
+ }
+ chainView.CommitStore[commitStore.Address().Hex()] = commitStoreView
+ }
+ }
+
+ if c.PriceRegistry != nil {
+ priceRegistryView, err := v1_2.GeneratePriceRegistryView(c.PriceRegistry)
+ if err != nil {
+ return chainView, errors.Wrapf(err, "failed to generate price registry view for price registry %s", c.PriceRegistry.Address().String())
+ }
+ chainView.PriceRegistry[c.PriceRegistry.Address().String()] = priceRegistryView
+ }
+
+ if c.RMN != nil {
+ rmnView, err := v1_5.GenerateRMNView(c.RMN)
+ if err != nil {
+ return chainView, errors.Wrapf(err, "failed to generate rmn view for rmn %s", c.RMN.Address().String())
+ }
+ chainView.RMN[c.RMN.Address().Hex()] = rmnView
+ }
+
+ if c.EVM2EVMOffRamp != nil {
+ for source, offRamp := range c.EVM2EVMOffRamp {
+ offRampView, err := v1_5.GenerateOffRampView(offRamp)
+ if err != nil {
+ return chainView, errors.Wrapf(err, "failed to generate off ramp view for off ramp %s for source %d", offRamp.Address().String(), source)
+ }
+ chainView.EVM2EVMOffRamp[offRamp.Address().Hex()] = offRampView
+ }
+ }
+
+ if c.EVM2EVMOnRamp != nil {
+ for dest, onRamp := range c.EVM2EVMOnRamp {
+ onRampView, err := v1_5.GenerateOnRampView(onRamp)
+ if err != nil {
+ return chainView, errors.Wrapf(err, "failed to generate on ramp view for on ramp %s for dest %d", onRamp.Address().String(), dest)
+ }
+ chainView.EVM2EVMOnRamp[onRamp.Address().Hex()] = onRampView
+ }
+ }
+
return chainView, nil
}
@@ -252,7 +307,46 @@ type CCIPOnChainState struct {
// Populated go bindings for the appropriate version for all contracts.
// We would hold 2 versions of each contract here. Once we upgrade we can phase out the old one.
// When generating bindings, make sure the package name corresponds to the version.
- Chains map[uint64]CCIPChainState
+ Chains map[uint64]CCIPChainState
+ SolChains map[uint64]SolCCIPChainState
+}
+
+func (s CCIPOnChainState) GetAllProposerMCMSForChains(chains []uint64) (map[uint64]*gethwrappers.ManyChainMultiSig, error) {
+ multiSigs := make(map[uint64]*gethwrappers.ManyChainMultiSig)
+ for _, chain := range chains {
+ chainState, ok := s.Chains[chain]
+ if !ok {
+ return nil, fmt.Errorf("chain %d not found", chain)
+ }
+ if chainState.ProposerMcm == nil {
+ return nil, fmt.Errorf("proposer mcm not found for chain %d", chain)
+ }
+ multiSigs[chain] = chainState.ProposerMcm
+ }
+ return multiSigs, nil
+}
+
+func (s CCIPOnChainState) GetAllTimeLocksForChains(chains []uint64) (map[uint64]common.Address, error) {
+ timelocks := make(map[uint64]common.Address)
+ for _, chain := range chains {
+ chainState, ok := s.Chains[chain]
+ if !ok {
+ return nil, fmt.Errorf("chain %d not found", chain)
+ }
+ if chainState.Timelock == nil {
+ return nil, fmt.Errorf("timelock not found for chain %d", chain)
+ }
+ timelocks[chain] = chainState.Timelock.Address()
+ }
+ return timelocks, nil
+}
+
+func (s CCIPOnChainState) SupportedChains() map[uint64]struct{} {
+ chains := make(map[uint64]struct{})
+ for chain := range s.Chains {
+ chains[chain] = struct{}{}
+ }
+ return chains
}
func (s CCIPOnChainState) View(chains []uint64) (map[string]view.ChainView, error) {
@@ -270,7 +364,11 @@ func (s CCIPOnChainState) View(chains []uint64) (map[string]view.ChainView, erro
if err != nil {
return m, err
}
- m[chainInfo.ChainName] = chainView
+ name := chainInfo.ChainName
+ if chainInfo.ChainName == "" {
+ name = fmt.Sprintf("%d", chainSelector)
+ }
+ m[name] = chainView
}
return m, nil
}
@@ -301,13 +399,13 @@ func LoadOnchainState(e deployment.Environment) (CCIPOnChainState, error) {
// LoadChainState Loads all state for a chain into state
func LoadChainState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (CCIPChainState, error) {
var state CCIPChainState
- mcmsWithTimelock, err := commoncs.MaybeLoadMCMSWithTimelockState(chain, addresses)
+ mcmsWithTimelock, err := commoncs.MaybeLoadMCMSWithTimelockChainState(chain, addresses)
if err != nil {
return state, err
}
state.MCMSWithTimelockState = *mcmsWithTimelock
- linkState, err := commoncs.MaybeLoadLinkTokenState(chain, addresses)
+ linkState, err := commoncs.MaybeLoadLinkTokenChainState(chain, addresses)
if err != nil {
return state, err
}
@@ -347,29 +445,11 @@ func LoadChainState(chain deployment.Chain, addresses map[string]deployment.Type
}
state.OffRamp = offRamp
case deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_0_0).String():
- armProxy, err := rmn_proxy_contract.NewRMNProxyContract(common.HexToAddress(address), chain.Client)
- if err != nil {
- return state, err
- }
- state.RMNProxyExisting = armProxy
- case deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_6_0_dev).String():
- armProxy, err := rmn_proxy_contract.NewRMNProxyContract(common.HexToAddress(address), chain.Client)
- if err != nil {
- return state, err
- }
- state.RMNProxyNew = armProxy
- case deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_6_0_dev).String():
- armProxy, err := rmn_proxy_contract.NewRMNProxyContract(common.HexToAddress(address), chain.Client)
- if err != nil {
- return state, err
- }
- state.RMNProxyNew = armProxy
- case deployment.NewTypeAndVersion(MockRMN, deployment.Version1_0_0).String():
- mockRMN, err := mock_rmn_contract.NewMockRMNContract(common.HexToAddress(address), chain.Client)
+ armProxy, err := rmn_proxy_contract.NewRMNProxy(common.HexToAddress(address), chain.Client)
if err != nil {
return state, err
}
- state.MockRMN = mockRMN
+ state.RMNProxy = armProxy
case deployment.NewTypeAndVersion(RMNRemote, deployment.Version1_6_0_dev).String():
rmnRemote, err := rmn_remote.NewRMNRemote(common.HexToAddress(address), chain.Client)
if err != nil {
@@ -394,12 +474,6 @@ func LoadChainState(chain deployment.Chain, addresses map[string]deployment.Type
return state, err
}
state.NonceManager = nm
- case deployment.NewTypeAndVersion(CommitStore, deployment.Version1_5_0).String():
- cs, err := commit_store.NewCommitStore(common.HexToAddress(address), chain.Client)
- if err != nil {
- return state, err
- }
- state.CommitStore = cs
case deployment.NewTypeAndVersion(TokenAdminRegistry, deployment.Version1_5_0).String():
tm, err := token_admin_registry.NewTokenAdminRegistry(common.HexToAddress(address), chain.Client)
if err != nil {
@@ -525,6 +599,64 @@ func LoadChainState(chain deployment.Chain, addresses map[string]deployment.Type
return state, fmt.Errorf("failed to get token symbol of token at %s: %w", address, err)
}
state.BurnMintTokens677[TokenSymbol(symbol)] = tok
+ // legacy addresses below
+ case deployment.NewTypeAndVersion(OnRamp, deployment.Version1_5_0).String():
+ onRampC, err := evm_2_evm_onramp.NewEVM2EVMOnRamp(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return state, err
+ }
+ sCfg, err := onRampC.GetStaticConfig(nil)
+ if err != nil {
+ return state, fmt.Errorf("failed to get static config chain %s: %w", chain.String(), err)
+ }
+ if state.EVM2EVMOnRamp == nil {
+ state.EVM2EVMOnRamp = make(map[uint64]*evm_2_evm_onramp.EVM2EVMOnRamp)
+ }
+ state.EVM2EVMOnRamp[sCfg.DestChainSelector] = onRampC
+ case deployment.NewTypeAndVersion(OffRamp, deployment.Version1_5_0).String():
+ offRamp, err := evm_2_evm_offramp.NewEVM2EVMOffRamp(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return state, err
+ }
+ sCfg, err := offRamp.GetStaticConfig(nil)
+ if err != nil {
+ return state, err
+ }
+ if state.EVM2EVMOffRamp == nil {
+ state.EVM2EVMOffRamp = make(map[uint64]*evm_2_evm_offramp.EVM2EVMOffRamp)
+ }
+ state.EVM2EVMOffRamp[sCfg.SourceChainSelector] = offRamp
+ case deployment.NewTypeAndVersion(CommitStore, deployment.Version1_5_0).String():
+ commitStore, err := commit_store.NewCommitStore(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return state, err
+ }
+ sCfg, err := commitStore.GetStaticConfig(nil)
+ if err != nil {
+ return state, err
+ }
+ if state.CommitStore == nil {
+ state.CommitStore = make(map[uint64]*commit_store.CommitStore)
+ }
+ state.CommitStore[sCfg.SourceChainSelector] = commitStore
+ case deployment.NewTypeAndVersion(PriceRegistry, deployment.Version1_2_0).String():
+ pr, err := price_registry_1_2_0.NewPriceRegistry(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return state, err
+ }
+ state.PriceRegistry = pr
+ case deployment.NewTypeAndVersion(RMN, deployment.Version1_5_0).String():
+ rmnC, err := rmn_contract.NewRMNContract(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return state, err
+ }
+ state.RMN = rmnC
+ case deployment.NewTypeAndVersion(MockRMN, deployment.Version1_0_0).String():
+ mockRMN, err := mock_rmn_contract.NewMockRMNContract(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return state, err
+ }
+ state.MockRMN = mockRMN
default:
return state, fmt.Errorf("unknown contract %s", tvStr)
}
diff --git a/deployment/ccip/changeset/test_assertions.go b/deployment/ccip/changeset/test_assertions.go
index c0b510acc07..bcfb49250d4 100644
--- a/deployment/ccip/changeset/test_assertions.go
+++ b/deployment/ccip/changeset/test_assertions.go
@@ -10,6 +10,7 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/sync/errgroup"
@@ -221,8 +222,8 @@ func ConfirmCommitForAllWithExpectedSeqNums(
return false
}
},
- 3*time.Minute,
- 1*time.Second,
+ tests.WaitTimeout(t),
+ 2*time.Second,
"all commitments did not confirm",
)
}
@@ -636,3 +637,19 @@ func executionStateToString(state uint8) string {
return "UNKNOWN"
}
}
+
+func AssertEqualFeeConfig(t *testing.T, want, have fee_quoter.FeeQuoterDestChainConfig) {
+ assert.Equal(t, want.DestGasOverhead, have.DestGasOverhead)
+ assert.Equal(t, want.IsEnabled, have.IsEnabled)
+ assert.Equal(t, want.ChainFamilySelector, have.ChainFamilySelector)
+ assert.Equal(t, want.DefaultTokenDestGasOverhead, have.DefaultTokenDestGasOverhead)
+ assert.Equal(t, want.DefaultTokenFeeUSDCents, have.DefaultTokenFeeUSDCents)
+ assert.Equal(t, want.DefaultTxGasLimit, have.DefaultTxGasLimit)
+ assert.Equal(t, want.DestGasPerPayloadByte, have.DestGasPerPayloadByte)
+ assert.Equal(t, want.DestGasPerDataAvailabilityByte, have.DestGasPerDataAvailabilityByte)
+ assert.Equal(t, want.DestDataAvailabilityMultiplierBps, have.DestDataAvailabilityMultiplierBps)
+ assert.Equal(t, want.DestDataAvailabilityOverheadGas, have.DestDataAvailabilityOverheadGas)
+ assert.Equal(t, want.MaxDataBytes, have.MaxDataBytes)
+ assert.Equal(t, want.MaxNumberOfTokensPerMsg, have.MaxNumberOfTokensPerMsg)
+ assert.Equal(t, want.MaxPerMsgGasLimit, have.MaxPerMsgGasLimit)
+}
diff --git a/deployment/ccip/changeset/test_environment.go b/deployment/ccip/changeset/test_environment.go
index ede078254c2..f723efbf619 100644
--- a/deployment/ccip/changeset/test_environment.go
+++ b/deployment/ccip/changeset/test_environment.go
@@ -9,17 +9,23 @@ import (
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/stretchr/testify/require"
+ "go.uber.org/zap/zapcore"
+
+ "github.com/smartcontractkit/chainlink-ccip/chainconfig"
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
"github.com/smartcontractkit/chainlink-ccip/pluginconfig"
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
- "github.com/stretchr/testify/require"
- "go.uber.org/zap/zapcore"
+
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
"github.com/smartcontractkit/chainlink/deployment"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
)
@@ -33,13 +39,16 @@ const (
)
type TestConfigs struct {
- Type EnvType // set by env var CCIP_V16_TEST_ENV, defaults to Memory
- CreateJob bool
+ Type EnvType // set by env var CCIP_V16_TEST_ENV, defaults to Memory
+ CreateJob bool
+ // TODO: This should be CreateContracts so the booleans make sense?
CreateJobAndContracts bool
- Chains int // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
- NumOfUsersPerChain int // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
- Nodes int // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
- Bootstraps int // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
+ LegacyDeployment bool
+ Chains int // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
+ ChainIDs []uint64 // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
+ NumOfUsersPerChain int // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
+ Nodes int // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
+ Bootstraps int // only used in memory mode, for docker mode, this is determined by the integration-test config toml input
IsUSDC bool
IsUSDCAttestationMissing bool
IsMultiCall3 bool
@@ -97,6 +106,18 @@ func WithMultiCall3() TestOps {
}
}
+func WithLegacyDeployment() TestOps {
+ return func(testCfg *TestConfigs) {
+ testCfg.LegacyDeployment = true
+ }
+}
+
+func WithChainIds(chainIDs []uint64) TestOps {
+ return func(testCfg *TestConfigs) {
+ testCfg.ChainIDs = chainIDs
+ }
+}
+
func WithJobsOnly() TestOps {
return func(testCfg *TestConfigs) {
testCfg.CreateJobAndContracts = false
@@ -176,6 +197,19 @@ type DeployedEnv struct {
Users map[uint64][]*bind.TransactOpts
}
+func (d *DeployedEnv) TimelockContracts(t *testing.T) map[uint64]*proposalutils.TimelockExecutionContracts {
+ timelocks := make(map[uint64]*proposalutils.TimelockExecutionContracts)
+ state, err := LoadOnchainState(d.Env)
+ require.NoError(t, err)
+ for chain, chainState := range state.Chains {
+ timelocks[chain] = &proposalutils.TimelockExecutionContracts{
+ Timelock: chainState.Timelock,
+ CallProxy: chainState.CallProxy,
+ }
+ }
+ return timelocks
+}
+
func (d *DeployedEnv) SetupJobs(t *testing.T) {
ctx := testcontext.Get(t)
out, err := CCIPCapabilityJobspec(d.Env, struct{}{})
@@ -199,7 +233,7 @@ func (d *DeployedEnv) SetupJobs(t *testing.T) {
type MemoryEnvironment struct {
DeployedEnv
- chains map[uint64]deployment.Chain
+ Chains map[uint64]deployment.Chain
}
func (m *MemoryEnvironment) DeployedEnvironment() DeployedEnv {
@@ -208,14 +242,29 @@ func (m *MemoryEnvironment) DeployedEnvironment() DeployedEnv {
func (m *MemoryEnvironment) StartChains(t *testing.T, tc *TestConfigs) {
ctx := testcontext.Get(t)
- chains, users := memory.NewMemoryChains(t, tc.Chains, tc.NumOfUsersPerChain)
- m.chains = chains
+ var chains map[uint64]deployment.Chain
+ var users map[uint64][]*bind.TransactOpts
+ if len(tc.ChainIDs) > 0 {
+ chains, users = memory.NewMemoryChainsWithChainIDs(t, tc.ChainIDs, tc.NumOfUsersPerChain)
+ if tc.Chains > len(tc.ChainIDs) {
+ additionalChains, additionalUsers := memory.NewMemoryChains(t, tc.Chains-len(tc.ChainIDs), tc.NumOfUsersPerChain)
+ for k, v := range additionalChains {
+ chains[k] = v
+ }
+ for k, v := range additionalUsers {
+ users[k] = v
+ }
+ }
+ } else {
+ chains, users = memory.NewMemoryChains(t, tc.Chains, tc.NumOfUsersPerChain)
+ }
+ m.Chains = chains
homeChainSel, feedSel := allocateCCIPChainSelectors(chains)
replayBlocks, err := LatestBlocksByChain(ctx, chains)
require.NoError(t, err)
m.DeployedEnv = DeployedEnv{
Env: deployment.Environment{
- Chains: m.chains,
+ Chains: m.Chains,
},
HomeChainSel: homeChainSel,
FeedChainSel: feedSel,
@@ -225,9 +274,9 @@ func (m *MemoryEnvironment) StartChains(t *testing.T, tc *TestConfigs) {
}
func (m *MemoryEnvironment) StartNodes(t *testing.T, tc *TestConfigs, crConfig deployment.CapabilityRegistryConfig) {
- require.NotNil(t, m.chains, "start chains first, chains are empty")
+ require.NotNil(t, m.Chains, "start chains first, chains are empty")
require.NotNil(t, m.DeployedEnv, "start chains and initiate deployed env first before starting nodes")
- nodes := memory.NewNodes(t, zapcore.InfoLevel, m.chains, tc.Nodes, tc.Bootstraps, crConfig)
+ nodes := memory.NewNodes(t, zapcore.InfoLevel, m.Chains, tc.Nodes, tc.Bootstraps, crConfig)
ctx := testcontext.Get(t)
lggr := logger.Test(t)
for _, node := range nodes {
@@ -236,7 +285,7 @@ func (m *MemoryEnvironment) StartNodes(t *testing.T, tc *TestConfigs, crConfig d
require.NoError(t, node.App.Stop())
})
}
- m.DeployedEnv.Env = memory.NewMemoryEnvironmentFromChainsNodes(func() context.Context { return ctx }, lggr, m.chains, nodes)
+ m.DeployedEnv.Env = memory.NewMemoryEnvironmentFromChainsNodes(func() context.Context { return ctx }, lggr, m.Chains, nodes)
}
func (m *MemoryEnvironment) MockUSDCAttestationServer(t *testing.T, isUSDCAttestationMissing bool) string {
@@ -256,6 +305,9 @@ func NewMemoryEnvironment(t *testing.T, opts ...TestOps) DeployedEnv {
}
require.NoError(t, testCfg.Validate(), "invalid test config")
env := &MemoryEnvironment{}
+ if testCfg.LegacyDeployment {
+ return NewLegacyEnvironment(t, testCfg, env)
+ }
if testCfg.CreateJobAndContracts {
return NewEnvironmentWithJobsAndContracts(t, testCfg, env)
}
@@ -265,6 +317,59 @@ func NewMemoryEnvironment(t *testing.T, opts ...TestOps) DeployedEnv {
return NewEnvironment(t, testCfg, env)
}
+func NewLegacyEnvironment(t *testing.T, tc *TestConfigs, tEnv TestEnvironment) DeployedEnv {
+ var err error
+ tEnv.StartChains(t, tc)
+ e := tEnv.DeployedEnvironment()
+ require.NotEmpty(t, e.Env.Chains)
+ tEnv.StartNodes(t, tc, deployment.CapabilityRegistryConfig{})
+ e = tEnv.DeployedEnvironment()
+ allChains := e.Env.AllChainSelectors()
+
+ mcmsCfg := make(map[uint64]commontypes.MCMSWithTimelockConfig)
+ for _, c := range e.Env.AllChainSelectors() {
+ mcmsCfg[c] = proposalutils.SingleGroupTimelockConfig(t)
+ }
+ var prereqCfg []DeployPrerequisiteConfigPerChain
+ for _, chain := range allChains {
+ var opts []PrerequisiteOpt
+ if tc != nil {
+ if tc.IsUSDC {
+ opts = append(opts, WithUSDCEnabled())
+ }
+ if tc.IsMultiCall3 {
+ opts = append(opts, WithMultiCall3Enabled())
+ }
+ }
+ opts = append(opts, WithLegacyDeploymentEnabled(LegacyDeploymentConfig{
+ PriceRegStalenessThreshold: 60 * 60 * 24 * 14, // two weeks
+ }))
+ prereqCfg = append(prereqCfg, DeployPrerequisiteConfigPerChain{
+ ChainSelector: chain,
+ Opts: opts,
+ })
+ }
+
+ e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken),
+ Config: allChains,
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(DeployPrerequisites),
+ Config: DeployPrerequisiteConfig{
+ Configs: prereqCfg,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock),
+ Config: mcmsCfg,
+ },
+ })
+ require.NoError(t, err)
+ return e
+}
+
func NewEnvironment(t *testing.T, tc *TestConfigs, tEnv TestEnvironment) DeployedEnv {
lggr := logger.Test(t)
tEnv.StartChains(t, tc)
@@ -276,6 +381,7 @@ func NewEnvironment(t *testing.T, tc *TestConfigs, tEnv TestEnvironment) Deploye
crConfig := DeployTestContracts(t, lggr, ab, dEnv.HomeChainSel, dEnv.FeedChainSel, dEnv.Env.Chains, tc.LinkPrice, tc.WethPrice)
tEnv.StartNodes(t, tc, crConfig)
dEnv = tEnv.DeployedEnvironment()
+ // TODO: Should use ApplyChangesets here.
envNodes, err := deployment.NodeInfo(dEnv.Env.NodeIDs, dEnv.Env.Offchain)
require.NoError(t, err)
dEnv.Env.ExistingAddresses = ab
@@ -299,22 +405,24 @@ func NewEnvironmentWithJobsAndContracts(t *testing.T, tc *TestConfigs, tEnv Test
mcmsCfg := make(map[uint64]commontypes.MCMSWithTimelockConfig)
for _, c := range e.Env.AllChainSelectors() {
- mcmsCfg[c] = commontypes.MCMSWithTimelockConfig{
- Canceller: commonchangeset.SingleGroupMCMS(t),
- Bypasser: commonchangeset.SingleGroupMCMS(t),
- Proposer: commonchangeset.SingleGroupMCMS(t),
- TimelockMinDelay: big.NewInt(0),
- }
+ mcmsCfg[c] = proposalutils.SingleGroupTimelockConfig(t)
}
- var (
- usdcChains []uint64
- isMulticall3 bool
- )
- if tc != nil {
- if tc.IsUSDC {
- usdcChains = allChains
+
+ var prereqCfg []DeployPrerequisiteConfigPerChain
+ for _, chain := range allChains {
+ var opts []PrerequisiteOpt
+ if tc != nil {
+ if tc.IsUSDC {
+ opts = append(opts, WithUSDCEnabled())
+ }
+ if tc.IsMultiCall3 {
+ opts = append(opts, WithMultiCall3Enabled())
+ }
}
- isMulticall3 = tc.IsMultiCall3
+ prereqCfg = append(prereqCfg, DeployPrerequisiteConfigPerChain{
+ ChainSelector: chain,
+ Opts: opts,
+ })
}
// Need to deploy prerequisites first so that we can form the USDC config
// no proposals to be made, timelock can be passed as nil here
@@ -326,11 +434,7 @@ func NewEnvironmentWithJobsAndContracts(t *testing.T, tc *TestConfigs, tEnv Test
{
Changeset: commonchangeset.WrapChangeSet(DeployPrerequisites),
Config: DeployPrerequisiteConfig{
- ChainSelectors: allChains,
- Opts: []PrerequisiteOpt{
- WithUSDCChains(usdcChains),
- WithMulticall3(isMulticall3),
- },
+ Configs: prereqCfg,
},
},
{
@@ -344,27 +448,30 @@ func NewEnvironmentWithJobsAndContracts(t *testing.T, tc *TestConfigs, tEnv Test
HomeChainSelector: e.HomeChainSel,
},
},
+ {
+ Changeset: commonchangeset.WrapChangeSet(SetRMNRemoteOnRMNProxy),
+ Config: SetRMNRemoteOnRMNProxyConfig{
+ ChainSelectors: allChains,
+ },
+ },
})
require.NoError(t, err)
state, err := LoadOnchainState(e.Env)
require.NoError(t, err)
- // Assert USDC set up as expected.
- for _, chain := range usdcChains {
- require.NotNil(t, state.Chains[chain].MockUSDCTokenMessenger)
- require.NotNil(t, state.Chains[chain].MockUSDCTransmitter)
- require.NotNil(t, state.Chains[chain].USDCTokenPool)
- }
// Assert link present
require.NotNil(t, state.Chains[e.FeedChainSel].LinkToken)
require.NotNil(t, state.Chains[e.FeedChainSel].Weth9)
tokenConfig := NewTestTokenConfig(state.Chains[e.FeedChainSel].USDFeeds)
var tokenDataProviders []pluginconfig.TokenDataObserverConfig
- if len(usdcChains) > 0 {
+ if tc.IsUSDC {
endpoint := tEnv.MockUSDCAttestationServer(t, tc.IsUSDCAttestationMissing)
cctpContracts := make(map[cciptypes.ChainSelector]pluginconfig.USDCCCTPTokenConfig)
- for _, usdcChain := range usdcChains {
+ for _, usdcChain := range allChains {
+ require.NotNil(t, state.Chains[usdcChain].MockUSDCTokenMessenger)
+ require.NotNil(t, state.Chains[usdcChain].MockUSDCTransmitter)
+ require.NotNil(t, state.Chains[usdcChain].USDCTokenPool)
cctpContracts[cciptypes.ChainSelector(usdcChain)] = pluginconfig.USDCCCTPTokenConfig{
SourcePoolAddress: state.Chains[usdcChain].USDCTokenPool.Address().String(),
SourceMessageTransmitterAddr: state.Chains[usdcChain].MockUSDCTransmitter.Address().String(),
@@ -381,10 +488,13 @@ func NewEnvironmentWithJobsAndContracts(t *testing.T, tc *TestConfigs, tEnv Test
}})
}
// Build the per chain config.
- chainConfigs := make(map[uint64]CCIPOCRParams)
- timelockContractsPerChain := make(map[uint64]*commonchangeset.TimelockExecutionContracts)
+ ocrConfigs := make(map[uint64]CCIPOCRParams)
+ chainConfigs := make(map[uint64]ChainConfig)
+ timelockContractsPerChain := make(map[uint64]*proposalutils.TimelockExecutionContracts)
+ nodeInfo, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain)
+ require.NoError(t, err)
for _, chain := range allChains {
- timelockContractsPerChain[chain] = &commonchangeset.TimelockExecutionContracts{
+ timelockContractsPerChain[chain] = &proposalutils.TimelockExecutionContracts{
Timelock: state.Chains[chain].Timelock,
CallProxy: state.Chains[chain].CallProxy,
}
@@ -393,16 +503,75 @@ func NewEnvironmentWithJobsAndContracts(t *testing.T, tc *TestConfigs, tEnv Test
if tc.OCRConfigOverride != nil {
ocrParams = tc.OCRConfigOverride(ocrParams)
}
- chainConfigs[chain] = ocrParams
+ ocrConfigs[chain] = ocrParams
+ chainConfigs[chain] = ChainConfig{
+ Readers: nodeInfo.NonBootstraps().PeerIDs(),
+ FChain: uint8(len(nodeInfo.NonBootstraps().PeerIDs()) / 3),
+ EncodableChainConfig: chainconfig.ChainConfig{
+ GasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(internal.GasPriceDeviationPPB)},
+ DAGasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(internal.DAGasPriceDeviationPPB)},
+ OptimisticConfirmations: internal.OptimisticConfirmations,
+ },
+ }
}
// Deploy second set of changesets to deploy and configure the CCIP contracts.
e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, timelockContractsPerChain, []commonchangeset.ChangesetApplication{
{
- Changeset: commonchangeset.WrapChangeSet(ConfigureNewChains),
- Config: NewChainsConfig{
- HomeChainSel: e.HomeChainSel,
- FeedChainSel: e.FeedChainSel,
- ChainConfigByChain: chainConfigs,
+ // Add the chain configs for the new chains.
+ Changeset: commonchangeset.WrapChangeSet(UpdateChainConfig),
+ Config: UpdateChainConfigConfig{
+ HomeChainSelector: e.HomeChainSel,
+ RemoteChainAdds: chainConfigs,
+ },
+ },
+ {
+ // Add the DONs and candidate commit OCR instances for the chain.
+ Changeset: commonchangeset.WrapChangeSet(AddDonAndSetCandidateChangeset),
+ Config: AddDonAndSetCandidateChangesetConfig{
+ SetCandidateConfigBase{
+ HomeChainSelector: e.HomeChainSel,
+ FeedChainSelector: e.FeedChainSel,
+ OCRConfigPerRemoteChainSelector: ocrConfigs,
+ PluginType: types.PluginTypeCCIPCommit,
+ },
+ },
+ },
+ {
+ // Add the exec OCR instances for the new chains.
+ Changeset: commonchangeset.WrapChangeSet(SetCandidateChangeset),
+ Config: SetCandidateChangesetConfig{
+ SetCandidateConfigBase{
+ HomeChainSelector: e.HomeChainSel,
+ FeedChainSelector: e.FeedChainSel,
+ OCRConfigPerRemoteChainSelector: ocrConfigs,
+ PluginType: types.PluginTypeCCIPExec,
+ },
+ },
+ },
+ {
+ // Promote everything
+ Changeset: commonchangeset.WrapChangeSet(PromoteAllCandidatesChangeset),
+ Config: PromoteCandidatesChangesetConfig{
+ HomeChainSelector: e.HomeChainSel,
+ RemoteChainSelectors: allChains,
+ PluginType: types.PluginTypeCCIPCommit,
+ },
+ },
+ {
+ // Promote everything
+ Changeset: commonchangeset.WrapChangeSet(PromoteAllCandidatesChangeset),
+ Config: PromoteCandidatesChangesetConfig{
+ HomeChainSelector: e.HomeChainSel,
+ RemoteChainSelectors: allChains,
+ PluginType: types.PluginTypeCCIPExec,
+ },
+ },
+ {
+ // Enable the OCR config on the remote chains.
+ Changeset: commonchangeset.WrapChangeSet(SetOCR3OffRamp),
+ Config: SetOCR3OffRampConfig{
+ HomeChainSel: e.HomeChainSel,
+ RemoteChainSels: allChains,
},
},
{
diff --git a/deployment/ccip/changeset/test_helpers.go b/deployment/ccip/changeset/test_helpers.go
index 75801d99cff..2069030191c 100644
--- a/deployment/ccip/changeset/test_helpers.go
+++ b/deployment/ccip/changeset/test_helpers.go
@@ -18,6 +18,8 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/pkg/errors"
+ commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
"github.com/smartcontractkit/chainlink/v2/core/services/relay"
"github.com/ethereum/go-ethereum/common"
@@ -40,13 +42,13 @@ import (
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_v3_aggregator_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/mock_ethusd_aggregator_wrapper"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/mock_v3_aggregator_contract"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers"
)
@@ -60,6 +62,10 @@ var (
evmExtraArgsV2Tag = hexutil.MustDecode("0x181dcf10")
routerABI = abihelpers.MustParseABI(router.RouterABI)
+
+ DefaultLinkPrice = deployment.E18Mult(20)
+ DefaultWethPrice = deployment.E18Mult(4000)
+ DefaultGasPrice = ToPackedFee(big.NewInt(8e14), big.NewInt(0))
)
// Context returns a context with the test's deadline, if available.
@@ -384,30 +390,102 @@ func MakeEVMExtraArgsV2(gasLimit uint64, allowOOO bool) []byte {
return extraArgs
}
-func AddLaneWithDefaultPricesAndFeeQuoterConfig(e deployment.Environment, state CCIPOnChainState, from, to uint64, isTestRouter bool) error {
- cfg := LaneConfig{
- SourceSelector: from,
- DestSelector: to,
- InitialPricesBySource: DefaultInitialPrices,
- FeeQuoterDestChain: DefaultFeeQuoterDestChainConfig(),
- }
- return addLane(e, state, cfg, isTestRouter)
+func AddLane(t *testing.T, e *DeployedEnv, from, to uint64, isTestRouter bool, gasprice map[uint64]*big.Int, tokenPrices map[common.Address]*big.Int, fqCfg fee_quoter.FeeQuoterDestChainConfig) {
+ var err error
+ e.Env, err = commoncs.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commoncs.ChangesetApplication{
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateOnRampsDests),
+ Config: UpdateOnRampDestsConfig{
+ UpdatesByChain: map[uint64]map[uint64]OnRampDestinationUpdate{
+ from: {
+ to: {
+ IsEnabled: true,
+ TestRouter: isTestRouter,
+ AllowListEnabled: false,
+ },
+ },
+ },
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateFeeQuoterPricesCS),
+ Config: UpdateFeeQuoterPricesConfig{
+ PricesByChain: map[uint64]FeeQuoterPriceUpdatePerSource{
+ from: {
+ TokenPrices: tokenPrices,
+ GasPrices: gasprice,
+ },
+ },
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateFeeQuoterDests),
+ Config: UpdateFeeQuoterDestsConfig{
+ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{
+ from: {
+ to: fqCfg,
+ },
+ },
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateOffRampSources),
+ Config: UpdateOffRampSourcesConfig{
+ UpdatesByChain: map[uint64]map[uint64]OffRampSourceUpdate{
+ to: {
+ from: {
+ IsEnabled: true,
+ TestRouter: isTestRouter,
+ },
+ },
+ },
+ },
+ },
+ {
+ Changeset: commoncs.WrapChangeSet(UpdateRouterRamps),
+ Config: UpdateRouterRampsConfig{
+ TestRouter: isTestRouter,
+ UpdatesByChain: map[uint64]RouterUpdates{
+ // onRamp update on source chain
+ from: {
+ OnRampUpdates: map[uint64]bool{
+ to: true,
+ },
+ },
+ // offramp update on dest chain
+ to: {
+ OffRampUpdates: map[uint64]bool{
+ from: true,
+ },
+ },
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+}
+
+func AddLaneWithDefaultPricesAndFeeQuoterConfig(t *testing.T, e *DeployedEnv, state CCIPOnChainState, from, to uint64, isTestRouter bool) {
+ stateChainFrom := state.Chains[from]
+ AddLane(t, e, from, to, isTestRouter,
+ map[uint64]*big.Int{
+ to: DefaultGasPrice,
+ }, map[common.Address]*big.Int{
+ stateChainFrom.LinkToken.Address(): DefaultLinkPrice,
+ stateChainFrom.Weth9.Address(): DefaultWethPrice,
+ }, DefaultFeeQuoterDestChainConfig())
}
// AddLanesForAll adds densely connected lanes for all chains in the environment so that each chain
// is connected to every other chain except itself.
-func AddLanesForAll(e deployment.Environment, state CCIPOnChainState) error {
- for source := range e.Chains {
- for dest := range e.Chains {
+func AddLanesForAll(t *testing.T, e *DeployedEnv, state CCIPOnChainState) {
+ for source := range e.Env.Chains {
+ for dest := range e.Env.Chains {
if source != dest {
- err := AddLaneWithDefaultPricesAndFeeQuoterConfig(e, state, source, dest, false)
- if err != nil {
- return err
- }
+ AddLaneWithDefaultPricesAndFeeQuoterConfig(t, e, state, source, dest, false)
}
}
}
- return nil
}
func ToPackedFee(execFee, daFee *big.Int) *big.Int {
diff --git a/deployment/ccip/changeset/test_params.go b/deployment/ccip/changeset/test_params.go
index eea0f8eb183..a76a610a178 100644
--- a/deployment/ccip/changeset/test_params.go
+++ b/deployment/ccip/changeset/test_params.go
@@ -4,7 +4,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
func NewTestRMNStaticConfig() rmn_home.RMNHomeStaticConfig {
diff --git a/deployment/ccip/changeset/token_info.go b/deployment/ccip/changeset/token_info.go
index 7c008a8a884..84f728df9f4 100644
--- a/deployment/ccip/changeset/token_info.go
+++ b/deployment/ccip/changeset/token_info.go
@@ -7,7 +7,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/weth9"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/aggregator_v3_interface"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface"
)
type TokenSymbol string
diff --git a/deployment/ccip/changeset/v1_5/cs_jobspec.go b/deployment/ccip/changeset/v1_5/cs_jobspec.go
new file mode 100644
index 00000000000..bdb36d531f8
--- /dev/null
+++ b/deployment/ccip/changeset/v1_5/cs_jobspec.go
@@ -0,0 +1,149 @@
+package v1_5
+
+import (
+ "fmt"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
+ integrationtesthelpers "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers/integration"
+)
+
+type JobSpecsForLanesConfig struct {
+ Configs []JobSpecInput
+}
+
+func (c JobSpecsForLanesConfig) Validate() error {
+ for _, cfg := range c.Configs {
+ if err := cfg.Validate(); err != nil {
+ return fmt.Errorf("invalid JobSpecInput: %w", err)
+ }
+ }
+ return nil
+}
+
+type JobSpecInput struct {
+ SourceChainSelector uint64
+ DestinationChainSelector uint64
+ DestEVMChainID uint64
+ DestinationStartBlock uint64
+ TokenPricesUSDPipeline string
+ PriceGetterConfigJson string
+ USDCAttestationAPI string
+ USDCCfg *config.USDCConfig
+}
+
+func (j JobSpecInput) Validate() error {
+ if err := deployment.IsValidChainSelector(j.SourceChainSelector); err != nil {
+ return fmt.Errorf("SourceChainSelector is invalid: %w", err)
+ }
+ if err := deployment.IsValidChainSelector(j.DestinationChainSelector); err != nil {
+ return fmt.Errorf("DestinationChainSelector is invalid: %w", err)
+ }
+ if j.TokenPricesUSDPipeline == "" && j.PriceGetterConfigJson == "" {
+ return fmt.Errorf("TokenPricesUSDPipeline or PriceGetterConfigJson is required")
+ }
+ if j.USDCCfg != nil {
+ if err := j.USDCCfg.ValidateUSDCConfig(); err != nil {
+ return fmt.Errorf("USDCCfg is invalid: %w", err)
+ }
+ if j.USDCAttestationAPI == "" {
+ return fmt.Errorf("USDCAttestationAPI is required")
+ }
+ }
+ return nil
+}
+
+func JobSpecsForLanes(env deployment.Environment, c JobSpecsForLanesConfig) (deployment.ChangesetOutput, error) {
+ if err := c.Validate(); err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("invalid JobSpecsForLanesConfig: %w", err)
+ }
+ state, err := changeset.LoadOnchainState(env)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ nodesToJobSpecs, err := jobSpecsForLane(env, state, c)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{
+ JobSpecs: nodesToJobSpecs,
+ }, nil
+}
+
+func jobSpecsForLane(
+ env deployment.Environment,
+ state changeset.CCIPOnChainState,
+ lanesCfg JobSpecsForLanesConfig,
+) (map[string][]string, error) {
+ nodes, err := deployment.NodeInfo(env.NodeIDs, env.Offchain)
+ if err != nil {
+ return nil, err
+ }
+ nodesToJobSpecs := make(map[string][]string)
+ for _, node := range nodes {
+ var specs []string
+ for _, cfg := range lanesCfg.Configs {
+ destChainState := state.Chains[cfg.DestinationChainSelector]
+ sourceChain := env.Chains[cfg.SourceChainSelector]
+ destChain := env.Chains[cfg.DestinationChainSelector]
+
+ ccipJobParam := integrationtesthelpers.CCIPJobSpecParams{
+ OffRamp: destChainState.EVM2EVMOffRamp[cfg.SourceChainSelector].Address(),
+ CommitStore: destChainState.CommitStore[cfg.SourceChainSelector].Address(),
+ SourceChainName: sourceChain.Name(),
+ DestChainName: destChain.Name(),
+ DestEvmChainId: cfg.DestEVMChainID,
+ TokenPricesUSDPipeline: cfg.TokenPricesUSDPipeline,
+ PriceGetterConfig: cfg.PriceGetterConfigJson,
+ DestStartBlock: cfg.DestinationStartBlock,
+ USDCAttestationAPI: cfg.USDCAttestationAPI,
+ USDCConfig: cfg.USDCCfg,
+ P2PV2Bootstrappers: nodes.BootstrapLocators(),
+ }
+ if !node.IsBootstrap {
+ ocrCfg, found := node.OCRConfigForChainSelector(cfg.DestinationChainSelector)
+ if !found {
+ return nil, fmt.Errorf("OCR config not found for chain %s", destChain.String())
+ }
+ ocrKeyBundleID := ocrCfg.KeyBundleID
+ transmitterID := ocrCfg.TransmitAccount
+ commitSpec, err := ccipJobParam.CommitJobSpec()
+ if err != nil {
+ return nil, fmt.Errorf("failed to generate commit job spec for source %s and destination %s: %w",
+ sourceChain.String(), destChain.String(), err)
+ }
+ commitSpec.OCR2OracleSpec.OCRKeyBundleID.SetValid(ocrKeyBundleID)
+ commitSpec.OCR2OracleSpec.TransmitterID.SetValid(string(transmitterID))
+ commitSpecStr, err := commitSpec.String()
+ if err != nil {
+ return nil, fmt.Errorf("failed to convert commit job spec to string for source %s and destination %s: %w",
+ sourceChain.String(), destChain.String(), err)
+ }
+ execSpec, err := ccipJobParam.ExecutionJobSpec()
+ if err != nil {
+ return nil, fmt.Errorf("failed to generate execution job spec for source %s and destination %s: %w",
+ sourceChain.String(), destChain.String(), err)
+ }
+ execSpec.OCR2OracleSpec.OCRKeyBundleID.SetValid(ocrKeyBundleID)
+ execSpec.OCR2OracleSpec.TransmitterID.SetValid(string(transmitterID))
+ execSpecStr, err := execSpec.String()
+ if err != nil {
+ return nil, fmt.Errorf("failed to convert execution job spec to string for source %s and destination %s: %w",
+ sourceChain.String(), destChain.String(), err)
+ }
+ specs = append(specs, commitSpecStr, execSpecStr)
+ } else {
+ bootstrapSpec := ccipJobParam.BootstrapJob(destChainState.CommitStore[cfg.SourceChainSelector].Address().String())
+ bootstrapSpecStr, err := bootstrapSpec.String()
+ if err != nil {
+ return nil, fmt.Errorf("failed to convert bootstrap job spec to string for source %s and destination %s: %w",
+ sourceChain.String(), destChain.String(), err)
+ }
+ specs = append(specs, bootstrapSpecStr)
+ }
+ }
+ nodesToJobSpecs[node.NodeID] = append(nodesToJobSpecs[node.NodeID], specs...)
+ }
+ return nodesToJobSpecs, nil
+}
diff --git a/deployment/ccip/changeset/v1_5/cs_lane_contracts.go b/deployment/ccip/changeset/v1_5/cs_lane_contracts.go
new file mode 100644
index 00000000000..2d6c8fcb5ed
--- /dev/null
+++ b/deployment/ccip/changeset/v1_5/cs_lane_contracts.go
@@ -0,0 +1,288 @@
+package v1_5
+
+import (
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/common"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
+)
+
+var _ deployment.ChangeSet[DeployLanesConfig] = DeployLanes
+
+type DeployLanesConfig struct {
+ Configs []DeployLaneConfig
+}
+
+func (c *DeployLanesConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error {
+ for _, cfg := range c.Configs {
+ if err := cfg.Validate(e, state); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+type DeployLaneConfig struct {
+ SourceChainSelector uint64
+ DestinationChainSelector uint64
+
+ // onRamp specific configuration
+ OnRampStaticCfg evm_2_evm_onramp.EVM2EVMOnRampStaticConfig
+ OnRampDynamicCfg evm_2_evm_onramp.EVM2EVMOnRampDynamicConfig
+ OnRampFeeTokenArgs []evm_2_evm_onramp.EVM2EVMOnRampFeeTokenConfigArgs
+ OnRampTransferTokenCfgs []evm_2_evm_onramp.EVM2EVMOnRampTokenTransferFeeConfigArgs
+ OnRampNopsAndWeight []evm_2_evm_onramp.EVM2EVMOnRampNopAndWeight
+ OnRampRateLimiterCfg evm_2_evm_onramp.RateLimiterConfig
+
+ // offRamp specific configuration
+ OffRampRateLimiterCfg evm_2_evm_offramp.RateLimiterConfig
+
+ // Price Registry specific configuration
+ InitialTokenPrices []price_registry_1_2_0.InternalTokenPriceUpdate
+ GasPriceUpdates []price_registry_1_2_0.InternalGasPriceUpdate
+}
+
+func (c *DeployLaneConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error {
+ if err := deployment.IsValidChainSelector(c.SourceChainSelector); err != nil {
+ return err
+ }
+ if err := deployment.IsValidChainSelector(c.DestinationChainSelector); err != nil {
+ return err
+ }
+ sourceChain, exists := e.Chains[c.SourceChainSelector]
+ if !exists {
+ return fmt.Errorf("source chain %d not found in environment", c.SourceChainSelector)
+ }
+ destChain, exists := e.Chains[c.DestinationChainSelector]
+ if !exists {
+ return fmt.Errorf("destination chain %d not found in environment", c.DestinationChainSelector)
+ }
+ sourceChainState, exists := state.Chains[c.SourceChainSelector]
+ if !exists {
+ return fmt.Errorf("source chain %d not found in state", c.SourceChainSelector)
+ }
+ destChainState, exists := state.Chains[c.DestinationChainSelector]
+ if !exists {
+ return fmt.Errorf("destination chain %d not found in state", c.DestinationChainSelector)
+ }
+ // check for existing chain contracts on both source and destination chains
+ if err := arePrerequisitesMet(sourceChainState, sourceChain); err != nil {
+ return err
+ }
+ if err := arePrerequisitesMet(destChainState, destChain); err != nil {
+ return err
+ }
+ // TODO: Add rest of the config validation
+ return nil
+}
+
+func DeployLanes(env deployment.Environment, c DeployLanesConfig) (deployment.ChangesetOutput, error) {
+ state, err := changeset.LoadOnchainState(env)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to load CCIP onchain state: %w", err)
+ }
+ if err := c.Validate(env, state); err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("invalid DeployChainContractsConfig: %w", err)
+ }
+ newAddresses := deployment.NewMemoryAddressBook()
+ for _, cfg := range c.Configs {
+ if err := deployLane(env, state, newAddresses, cfg); err != nil {
+ return deployment.ChangesetOutput{
+ AddressBook: newAddresses,
+ }, err
+ }
+ }
+ return deployment.ChangesetOutput{
+ AddressBook: newAddresses,
+ }, nil
+}
+
+func deployLane(e deployment.Environment, state changeset.CCIPOnChainState, ab deployment.AddressBook, cfg DeployLaneConfig) error {
+ // update prices on the source price registry
+ sourceChainState := state.Chains[cfg.SourceChainSelector]
+ destChainState := state.Chains[cfg.DestinationChainSelector]
+ sourceChain := e.Chains[cfg.SourceChainSelector]
+ destChain := e.Chains[cfg.DestinationChainSelector]
+ sourcePriceReg := sourceChainState.PriceRegistry
+ tx, err := sourcePriceReg.UpdatePrices(sourceChain.DeployerKey, price_registry_1_2_0.InternalPriceUpdates{
+ TokenPriceUpdates: cfg.InitialTokenPrices,
+ GasPriceUpdates: cfg.GasPriceUpdates,
+ })
+ if err != nil {
+ return err
+ }
+ _, err = sourceChain.Confirm(tx)
+ if err != nil {
+ return fmt.Errorf("failed to confirm price update tx for chain %s: %w", sourceChain.String(), deployment.MaybeDataErr(err))
+ }
+ // ================================================================
+ // │ Deploy Lane │
+ // ================================================================
+ // Deploy onRamp on source chain
+ onRamp, onRampExists := sourceChainState.EVM2EVMOnRamp[cfg.DestinationChainSelector]
+ if !onRampExists {
+ onRampC, err := deployment.DeployContract(e.Logger, sourceChain, ab,
+ func(chain deployment.Chain) deployment.ContractDeploy[*evm_2_evm_onramp.EVM2EVMOnRamp] {
+ onRampAddress, tx2, onRampC, err2 := evm_2_evm_onramp.DeployEVM2EVMOnRamp(
+ sourceChain.DeployerKey,
+ sourceChain.Client,
+ cfg.OnRampStaticCfg,
+ cfg.OnRampDynamicCfg,
+ cfg.OnRampRateLimiterCfg,
+ cfg.OnRampFeeTokenArgs,
+ cfg.OnRampTransferTokenCfgs,
+ cfg.OnRampNopsAndWeight,
+ )
+ return deployment.ContractDeploy[*evm_2_evm_onramp.EVM2EVMOnRamp]{
+ Address: onRampAddress, Contract: onRampC, Tx: tx2,
+ Tv: deployment.NewTypeAndVersion(changeset.OnRamp, deployment.Version1_5_0), Err: err2,
+ }
+ })
+ if err != nil {
+ e.Logger.Errorw("Failed to deploy EVM2EVMOnRamp", "chain", sourceChain.String(), "err", err)
+ return err
+ }
+ onRamp = onRampC.Contract
+ } else {
+ e.Logger.Infow("EVM2EVMOnRamp already exists",
+ "source chain", sourceChain.String(), "destination chain", destChain.String(),
+ "address", onRamp.Address().String())
+ }
+
+ // Deploy commit store on source chain
+ commitStore, commitStoreExists := destChainState.CommitStore[cfg.SourceChainSelector]
+ if !commitStoreExists {
+ commitStoreC, err := deployment.DeployContract(e.Logger, destChain, ab,
+ func(chain deployment.Chain) deployment.ContractDeploy[*commit_store.CommitStore] {
+ commitStoreAddress, tx2, commitStoreC, err2 := commit_store.DeployCommitStore(
+ destChain.DeployerKey,
+ destChain.Client,
+ commit_store.CommitStoreStaticConfig{
+ ChainSelector: destChain.Selector,
+ SourceChainSelector: sourceChain.Selector,
+ OnRamp: onRamp.Address(),
+ RmnProxy: destChainState.RMNProxy.Address(),
+ },
+ )
+ return deployment.ContractDeploy[*commit_store.CommitStore]{
+ Address: commitStoreAddress, Contract: commitStoreC, Tx: tx2,
+ Tv: deployment.NewTypeAndVersion(changeset.CommitStore, deployment.Version1_5_0), Err: err2,
+ }
+ })
+ if err != nil {
+ e.Logger.Errorw("Failed to deploy CommitStore", "chain", sourceChain.String(), "err", err)
+ return err
+ }
+ commitStore = commitStoreC.Contract
+ } else {
+ e.Logger.Infow("CommitStore already exists",
+ "source chain", sourceChain.String(), "destination chain", destChain.String(),
+ "address", commitStore.Address().String())
+ }
+
+ // Deploy offRamp on destination chain
+ offRamp, offRampExists := destChainState.EVM2EVMOffRamp[cfg.SourceChainSelector]
+ if !offRampExists {
+ offRampC, err := deployment.DeployContract(e.Logger, destChain, ab,
+ func(chain deployment.Chain) deployment.ContractDeploy[*evm_2_evm_offramp.EVM2EVMOffRamp] {
+ offRampAddress, tx2, offRampC, err2 := evm_2_evm_offramp.DeployEVM2EVMOffRamp(
+ destChain.DeployerKey,
+ destChain.Client,
+ evm_2_evm_offramp.EVM2EVMOffRampStaticConfig{
+ CommitStore: commitStore.Address(),
+ ChainSelector: destChain.Selector,
+ SourceChainSelector: sourceChain.Selector,
+ OnRamp: onRamp.Address(),
+ PrevOffRamp: common.HexToAddress(""),
+ RmnProxy: destChainState.RMNProxy.Address(), // RMN, formerly ARM
+ TokenAdminRegistry: destChainState.TokenAdminRegistry.Address(),
+ },
+ cfg.OffRampRateLimiterCfg,
+ )
+ return deployment.ContractDeploy[*evm_2_evm_offramp.EVM2EVMOffRamp]{
+ Address: offRampAddress, Contract: offRampC, Tx: tx2,
+ Tv: deployment.NewTypeAndVersion(changeset.OffRamp, deployment.Version1_5_0), Err: err2,
+ }
+ })
+ if err != nil {
+ e.Logger.Errorw("Failed to deploy EVM2EVMOffRamp", "chain", sourceChain.String(), "err", err)
+ return err
+ }
+ offRamp = offRampC.Contract
+ } else {
+ e.Logger.Infow("EVM2EVMOffRamp already exists",
+ "source chain", sourceChain.String(), "destination chain", destChain.String(),
+ "address", offRamp.Address().String())
+ }
+
+ // Apply Router updates
+ tx, err = sourceChainState.Router.ApplyRampUpdates(sourceChain.DeployerKey,
+ []router.RouterOnRamp{{DestChainSelector: destChain.Selector, OnRamp: onRamp.Address()}}, nil, nil)
+ if err != nil {
+ return fmt.Errorf("failed to apply router updates for source chain %s: %w", sourceChain.String(), deployment.MaybeDataErr(err))
+ }
+ _, err = sourceChain.Confirm(tx)
+ if err != nil {
+ return fmt.Errorf("failed to confirm router updates tx %s for source chain %s: %w", tx.Hash().String(), sourceChain.String(), deployment.MaybeDataErr(err))
+ }
+
+ tx, err = destChainState.Router.ApplyRampUpdates(destChain.DeployerKey,
+ nil,
+ nil,
+ []router.RouterOffRamp{{SourceChainSelector: sourceChain.Selector, OffRamp: offRamp.Address()}},
+ )
+ if err != nil {
+ return fmt.Errorf("failed to apply router updates for destination chain %s: %w", destChain.String(), deployment.MaybeDataErr(err))
+ }
+ _, err = destChain.Confirm(tx)
+ if err != nil {
+ return fmt.Errorf("failed to confirm router updates tx %s for destination chain %s: %w", tx.Hash().String(), destChain.String(), deployment.MaybeDataErr(err))
+ }
+
+ // price registry updates
+ _, err = destChainState.PriceRegistry.ApplyPriceUpdatersUpdates(
+ destChain.DeployerKey,
+ []common.Address{commitStore.Address()},
+ []common.Address{},
+ )
+ if err != nil {
+ return fmt.Errorf("failed to apply price registry updates for destination chain %s: %w", destChain.String(), deployment.MaybeDataErr(err))
+ }
+ _, err = destChain.Confirm(tx)
+ if err != nil {
+ return fmt.Errorf("failed to confirm price registry updates tx %s for destination chain %s: %w", tx.Hash().String(), destChain.String(), deployment.MaybeDataErr(err))
+ }
+ return nil
+}
+
+func arePrerequisitesMet(chainState changeset.CCIPChainState, chain deployment.Chain) error {
+ if chainState.Router == nil {
+ return fmt.Errorf("router not found for chain %s", chain.String())
+ }
+ if chainState.PriceRegistry == nil {
+ return fmt.Errorf("price registry not found for chain %s", chain.String())
+ }
+ if chainState.RMN == nil && chainState.MockRMN == nil {
+ return fmt.Errorf("neither RMN nor mockRMN found for chain %s", chain.String())
+ }
+ if chainState.Weth9 == nil {
+ return fmt.Errorf("WETH9 not found for chain %s", chain.String())
+ }
+ if chainState.LinkToken == nil {
+ return fmt.Errorf("LINK token not found for chain %s", chain.String())
+ }
+ if chainState.TokenAdminRegistry == nil {
+ return fmt.Errorf("token admin registry not found for chain %s", chain.String())
+ }
+ if chainState.RMNProxy == nil {
+ return fmt.Errorf("RMNProxy not found for chain %s", chain.String())
+ }
+ return nil
+}
diff --git a/deployment/ccip/changeset/v1_5/cs_ocr2_config.go b/deployment/ccip/changeset/v1_5/cs_ocr2_config.go
new file mode 100644
index 00000000000..497bcb53ad8
--- /dev/null
+++ b/deployment/ccip/changeset/v1_5/cs_ocr2_config.go
@@ -0,0 +1,329 @@
+package v1_5
+
+import (
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/pkg/errors"
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/config"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers"
+)
+
+type FinalOCR2Config struct {
+ Signers []common.Address
+ Transmitters []common.Address
+ F uint8
+ OnchainConfig []byte
+ OffchainConfigVersion uint64
+ OffchainConfig []byte
+}
+
+type CommitOCR2ConfigParams struct {
+ DestinationChainSelector uint64
+ SourceChainSelector uint64
+ OCR2ConfigParams confighelper.PublicConfig
+ GasPriceHeartBeat config.Duration
+ DAGasPriceDeviationPPB uint32
+ ExecGasPriceDeviationPPB uint32
+ TokenPriceHeartBeat config.Duration
+ TokenPriceDeviationPPB uint32
+ InflightCacheExpiry config.Duration
+ PriceReportingDisabled bool
+}
+
+func (c *CommitOCR2ConfigParams) PopulateOffChainAndOnChainCfg(priceReg common.Address) error {
+ var err error
+ c.OCR2ConfigParams.ReportingPluginConfig, err = testhelpers.NewCommitOffchainConfig(
+ c.GasPriceHeartBeat,
+ c.DAGasPriceDeviationPPB,
+ c.ExecGasPriceDeviationPPB,
+ c.TokenPriceHeartBeat,
+ c.TokenPriceDeviationPPB,
+ c.InflightCacheExpiry,
+ c.PriceReportingDisabled,
+ ).Encode()
+ if err != nil {
+ return errors.Wrapf(err, "failed to encode offchain config for source chain %d and destination chain %d",
+ c.SourceChainSelector, c.DestinationChainSelector)
+ }
+ c.OCR2ConfigParams.OnchainConfig, err = abihelpers.EncodeAbiStruct(testhelpers.NewCommitOnchainConfig(priceReg))
+ if err != nil {
+ return fmt.Errorf("failed to encode onchain config for source chain %d and destination chain %d: %w",
+ c.SourceChainSelector, c.DestinationChainSelector, err)
+ }
+ return nil
+}
+
+func (c *CommitOCR2ConfigParams) Validate(state changeset.CCIPOnChainState) error {
+ if err := deployment.IsValidChainSelector(c.DestinationChainSelector); err != nil {
+ return fmt.Errorf("invalid DestinationChainSelector: %w", err)
+ }
+ if err := deployment.IsValidChainSelector(c.SourceChainSelector); err != nil {
+ return fmt.Errorf("invalid SourceChainSelector: %w", err)
+ }
+
+ chain, exists := state.Chains[c.DestinationChainSelector]
+ if !exists {
+ return fmt.Errorf("chain %d does not exist in state", c.DestinationChainSelector)
+ }
+ if chain.CommitStore == nil {
+ return fmt.Errorf("chain %d does not have a commit store", c.DestinationChainSelector)
+ }
+ _, exists = chain.CommitStore[c.SourceChainSelector]
+ if !exists {
+ return fmt.Errorf("chain %d does not have a commit store for source chain %d", c.DestinationChainSelector, c.SourceChainSelector)
+ }
+ if chain.PriceRegistry == nil {
+ return fmt.Errorf("chain %d does not have a price registry", c.DestinationChainSelector)
+ }
+ return nil
+}
+
+type ExecuteOCR2ConfigParams struct {
+ DestinationChainSelector uint64
+ SourceChainSelector uint64
+ DestOptimisticConfirmations uint32
+ BatchGasLimit uint32
+ RelativeBoostPerWaitHour float64
+ InflightCacheExpiry config.Duration
+ RootSnoozeTime config.Duration
+ BatchingStrategyID uint32
+ MessageVisibilityInterval config.Duration
+ ExecOnchainConfig evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig
+ OCR2ConfigParams confighelper.PublicConfig
+}
+
+func (e *ExecuteOCR2ConfigParams) PopulateOffChainAndOnChainCfg(router, priceReg common.Address) error {
+ var err error
+ e.OCR2ConfigParams.ReportingPluginConfig, err = testhelpers.NewExecOffchainConfig(
+ e.DestOptimisticConfirmations,
+ e.BatchGasLimit,
+ e.RelativeBoostPerWaitHour,
+ e.InflightCacheExpiry,
+ e.RootSnoozeTime,
+ e.BatchingStrategyID,
+ ).Encode()
+ if err != nil {
+ return fmt.Errorf("failed to encode offchain config for exec plugin, source chain %d dest chain %d :%w",
+ e.SourceChainSelector, e.DestinationChainSelector, err)
+ }
+ e.OCR2ConfigParams.OnchainConfig, err = abihelpers.EncodeAbiStruct(testhelpers.NewExecOnchainConfig(
+ e.ExecOnchainConfig.PermissionLessExecutionThresholdSeconds,
+ router,
+ priceReg,
+ e.ExecOnchainConfig.MaxNumberOfTokensPerMsg,
+ e.ExecOnchainConfig.MaxDataBytes,
+ ))
+ if err != nil {
+ return fmt.Errorf("failed to encode onchain config for exec plugin, source chain %d dest chain %d :%w",
+ e.SourceChainSelector, e.DestinationChainSelector, err)
+ }
+ return nil
+}
+
+func (e *ExecuteOCR2ConfigParams) Validate(state changeset.CCIPOnChainState) error {
+ if err := deployment.IsValidChainSelector(e.SourceChainSelector); err != nil {
+ return fmt.Errorf("invalid SourceChainSelector: %w", err)
+ }
+ if err := deployment.IsValidChainSelector(e.DestinationChainSelector); err != nil {
+ return fmt.Errorf("invalid DestinationChainSelector: %w", err)
+ }
+ chain, exists := state.Chains[e.DestinationChainSelector]
+ if !exists {
+ return fmt.Errorf("chain %d does not exist in state", e.DestinationChainSelector)
+ }
+ if chain.EVM2EVMOffRamp == nil {
+ return fmt.Errorf("chain %d does not have an EVM2EVMOffRamp", e.DestinationChainSelector)
+ }
+ _, exists = chain.EVM2EVMOffRamp[e.SourceChainSelector]
+ if !exists {
+ return fmt.Errorf("chain %d does not have an EVM2EVMOffRamp for source chain %d", e.DestinationChainSelector, e.SourceChainSelector)
+ }
+ if chain.PriceRegistry == nil {
+ return fmt.Errorf("chain %d does not have a price registry", e.DestinationChainSelector)
+ }
+ if chain.Router == nil {
+ return fmt.Errorf("chain %d does not have a router", e.DestinationChainSelector)
+ }
+ return nil
+}
+
+type OCR2Config struct {
+ CommitConfigs []CommitOCR2ConfigParams
+ ExecConfigs []ExecuteOCR2ConfigParams
+}
+
+func (o OCR2Config) Validate(state changeset.CCIPOnChainState) error {
+ for _, c := range o.CommitConfigs {
+ if err := c.Validate(state); err != nil {
+ return err
+ }
+ }
+ for _, e := range o.ExecConfigs {
+ if err := e.Validate(state); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// SetOCR2ConfigForTest sets the OCR2 config on the chain for commit and offramp
+// This is currently not suitable for prod environments it's only for testing
+func SetOCR2ConfigForTest(env deployment.Environment, c OCR2Config) (deployment.ChangesetOutput, error) {
+ state, err := changeset.LoadOnchainState(env)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to load CCIP onchain state: %w", err)
+ }
+ if err := c.Validate(state); err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("invalid OCR2 config: %w", err)
+ }
+ for _, commit := range c.CommitConfigs {
+ if err := commit.PopulateOffChainAndOnChainCfg(state.Chains[commit.DestinationChainSelector].PriceRegistry.Address()); err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to populate offchain and onchain config for commit: %w", err)
+ }
+ finalCfg, err := deriveOCR2Config(env, commit.DestinationChainSelector, commit.OCR2ConfigParams)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to derive OCR2 config for commit: %w", err)
+ }
+ commitStore := state.Chains[commit.DestinationChainSelector].CommitStore[commit.SourceChainSelector]
+ chain := env.Chains[commit.DestinationChainSelector]
+ tx, err := commitStore.SetOCR2Config(
+ chain.DeployerKey,
+ finalCfg.Signers,
+ finalCfg.Transmitters,
+ finalCfg.F,
+ finalCfg.OnchainConfig,
+ finalCfg.OffchainConfigVersion,
+ finalCfg.OffchainConfig,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to set OCR2 config for commit store %s on chain %s: %w",
+ commitStore.Address().String(), chain.String(), deployment.MaybeDataErr(err))
+ }
+ _, err = chain.Confirm(tx)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm OCR2 for commit store %s config on chain %s: %w",
+ commitStore.Address().String(), chain.String(), err)
+ }
+ }
+ for _, exec := range c.ExecConfigs {
+ if err := exec.PopulateOffChainAndOnChainCfg(
+ state.Chains[exec.DestinationChainSelector].Router.Address(),
+ state.Chains[exec.DestinationChainSelector].PriceRegistry.Address()); err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to populate offchain and onchain config for offramp: %w", err)
+ }
+ finalCfg, err := deriveOCR2Config(env, exec.DestinationChainSelector, exec.OCR2ConfigParams)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to derive OCR2 config for offramp: %w", err)
+ }
+ offRamp := state.Chains[exec.DestinationChainSelector].EVM2EVMOffRamp[exec.SourceChainSelector]
+ chain := env.Chains[exec.DestinationChainSelector]
+ tx, err := offRamp.SetOCR2Config(
+ chain.DeployerKey,
+ finalCfg.Signers,
+ finalCfg.Transmitters,
+ finalCfg.F,
+ finalCfg.OnchainConfig,
+ finalCfg.OffchainConfigVersion,
+ finalCfg.OffchainConfig,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to set OCR2 config for offramp %s on chain %s: %w",
+ offRamp.Address().String(), chain.String(), err)
+ }
+ _, err = chain.Confirm(tx)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm OCR2 for offramp %s config on chain %s: %w",
+ offRamp.Address().String(), chain.String(), err)
+ }
+ }
+ return deployment.ChangesetOutput{}, nil
+}
+
+func deriveOCR2Config(
+ env deployment.Environment,
+ chainSel uint64,
+ ocrParams confighelper.PublicConfig,
+) (FinalOCR2Config, error) {
+ nodeInfo, err := deployment.NodeInfo(env.NodeIDs, env.Offchain)
+ if err != nil {
+ return FinalOCR2Config{}, fmt.Errorf("failed to get node info: %w", err)
+ }
+ nodes := nodeInfo.NonBootstraps()
+ // Get OCR3 Config from helper
+ var schedule []int
+ var oracles []confighelper.OracleIdentityExtra
+ for _, node := range nodes {
+ schedule = append(schedule, 1)
+ cfg, exists := node.OCRConfigForChainSelector(chainSel)
+ if !exists {
+ return FinalOCR2Config{}, fmt.Errorf("no OCR config for chain %d", chainSel)
+ }
+ oracles = append(oracles, confighelper.OracleIdentityExtra{
+ OracleIdentity: confighelper.OracleIdentity{
+ OnchainPublicKey: cfg.OnchainPublicKey,
+ TransmitAccount: cfg.TransmitAccount,
+ OffchainPublicKey: cfg.OffchainPublicKey,
+ PeerID: cfg.PeerID.Raw(),
+ },
+ ConfigEncryptionPublicKey: cfg.ConfigEncryptionPublicKey,
+ })
+ }
+
+ signers, transmitters, threshold, onchainConfig, offchainConfigVersion, offchainConfig, err := confighelper.ContractSetConfigArgsForTests(
+ ocrParams.DeltaProgress,
+ ocrParams.DeltaResend,
+ ocrParams.DeltaRound,
+ ocrParams.DeltaGrace,
+ ocrParams.DeltaStage,
+ ocrParams.RMax,
+ schedule,
+ oracles,
+ ocrParams.ReportingPluginConfig,
+ nil,
+ ocrParams.MaxDurationQuery,
+ ocrParams.MaxDurationObservation,
+ ocrParams.MaxDurationReport,
+ ocrParams.MaxDurationShouldAcceptFinalizedReport,
+ ocrParams.MaxDurationShouldTransmitAcceptedReport,
+ int(nodes.DefaultF()),
+ ocrParams.OnchainConfig,
+ )
+ if err != nil {
+ return FinalOCR2Config{}, fmt.Errorf("failed to derive OCR2 config: %w", err)
+ }
+ var signersAddresses []common.Address
+ for _, signer := range signers {
+ if len(signer) != 20 {
+ return FinalOCR2Config{}, fmt.Errorf("address is not 20 bytes %s", signer)
+ }
+ signersAddresses = append(signersAddresses, common.BytesToAddress(signer))
+ }
+ var transmittersAddresses []common.Address
+ for _, transmitter := range transmitters {
+ bytes, err := hexutil.Decode(string(transmitter))
+ if err != nil {
+ return FinalOCR2Config{}, errors.Wrap(err, fmt.Sprintf("given address is not valid %s", transmitter))
+ }
+ if len(bytes) != 20 {
+ return FinalOCR2Config{}, errors.Errorf("address is not 20 bytes %s", transmitter)
+ }
+ transmittersAddresses = append(transmittersAddresses, common.BytesToAddress(bytes))
+ }
+ return FinalOCR2Config{
+ Signers: signersAddresses,
+ Transmitters: transmittersAddresses,
+ F: threshold,
+ OnchainConfig: onchainConfig,
+ OffchainConfigVersion: offchainConfigVersion,
+ OffchainConfig: offchainConfig,
+ }, nil
+}
diff --git a/deployment/ccip/changeset/v1_5/e2e_test.go b/deployment/ccip/changeset/v1_5/e2e_test.go
new file mode 100644
index 00000000000..11bb566c641
--- /dev/null
+++ b/deployment/ccip/changeset/v1_5/e2e_test.go
@@ -0,0 +1,56 @@
+package v1_5
+
+import (
+ "context"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/common"
+ chainselectors "github.com/smartcontractkit/chain-selectors"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
+)
+
+// This test only works if the destination chain id is 1337
+// Otherwise it shows error for offchain and onchain config digest mismatch
+func TestE2ELegacy(t *testing.T) {
+ e := changeset.NewMemoryEnvironment(
+ t,
+ changeset.WithLegacyDeployment(),
+ changeset.WithChains(3),
+ changeset.WithChainIds([]uint64{chainselectors.GETH_TESTNET.EvmChainID}))
+ state, err := changeset.LoadOnchainState(e.Env)
+ require.NoError(t, err)
+ allChains := e.Env.AllChainSelectorsExcluding([]uint64{chainselectors.GETH_TESTNET.Selector})
+ require.Contains(t, e.Env.AllChainSelectors(), chainselectors.GETH_TESTNET.Selector)
+ require.Len(t, allChains, 2)
+ src, dest := allChains[1], chainselectors.GETH_TESTNET.Selector
+ srcChain := e.Env.Chains[src]
+ destChain := e.Env.Chains[dest]
+ pairs := []changeset.SourceDestPair{
+ {SourceChainSelector: src, DestChainSelector: dest},
+ }
+ e.Env = AddLanes(t, e.Env, state, pairs)
+ // reload state after adding lanes
+ state, err = changeset.LoadOnchainState(e.Env)
+ require.NoError(t, err)
+ sentEvent, err := SendRequest(t, e.Env, state,
+ changeset.WithSourceChain(src),
+ changeset.WithDestChain(dest),
+ changeset.WithTestRouter(false),
+ changeset.WithEvm2AnyMessage(router.ClientEVM2AnyMessage{
+ Receiver: common.LeftPadBytes(state.Chains[dest].Receiver.Address().Bytes(), 32),
+ Data: []byte("hello"),
+ TokenAmounts: nil,
+ FeeToken: common.HexToAddress("0x0"),
+ ExtraArgs: nil,
+ }),
+ )
+ require.NoError(t, err)
+ require.NotNil(t, sentEvent)
+ destStartBlock, err := destChain.Client.HeaderByNumber(context.Background(), nil)
+ require.NoError(t, err)
+ WaitForCommit(t, srcChain, destChain, state.Chains[dest].CommitStore[src], sentEvent.Message.SequenceNumber)
+ WaitForExecute(t, srcChain, destChain, state.Chains[dest].EVM2EVMOffRamp[src], []uint64{sentEvent.Message.SequenceNumber}, destStartBlock.Number.Uint64())
+}
diff --git a/deployment/ccip/changeset/v1_5/test_helpers.go b/deployment/ccip/changeset/v1_5/test_helpers.go
new file mode 100644
index 00000000000..e1a03539a77
--- /dev/null
+++ b/deployment/ccip/changeset/v1_5/test_helpers.go
@@ -0,0 +1,384 @@
+package v1_5
+
+import (
+ "context"
+ "fmt"
+ "math/big"
+ "net/http"
+ "net/http/httptest"
+ "strconv"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/config"
+ cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
+ commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/environment/memory"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers"
+)
+
+func AddLanes(t *testing.T, e deployment.Environment, state changeset.CCIPOnChainState, pairs []changeset.SourceDestPair) deployment.Environment {
+ addLanesCfg, commitOCR2Configs, execOCR2Configs, jobspecs := LaneConfigsForChains(t, e, state, pairs)
+ var err error
+ e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(DeployLanes),
+ Config: DeployLanesConfig{
+ Configs: addLanesCfg,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(SetOCR2ConfigForTest),
+ Config: OCR2Config{
+ CommitConfigs: commitOCR2Configs,
+ ExecConfigs: execOCR2Configs,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(JobSpecsForLanes),
+ Config: JobSpecsForLanesConfig{
+ Configs: jobspecs,
+ },
+ },
+ })
+ require.NoError(t, err)
+ return e
+}
+
+func LaneConfigsForChains(t *testing.T, env deployment.Environment, state changeset.CCIPOnChainState, pairs []changeset.SourceDestPair) (
+ []DeployLaneConfig,
+ []CommitOCR2ConfigParams,
+ []ExecuteOCR2ConfigParams,
+ []JobSpecInput,
+) {
+ var addLanesCfg []DeployLaneConfig
+ var commitOCR2Configs []CommitOCR2ConfigParams
+ var execOCR2Configs []ExecuteOCR2ConfigParams
+ var jobSpecs []JobSpecInput
+ for _, pair := range pairs {
+ dest := pair.DestChainSelector
+ src := pair.SourceChainSelector
+ sourceChainState := state.Chains[src]
+ destChainState := state.Chains[dest]
+ require.NotNil(t, sourceChainState.LinkToken)
+ require.NotNil(t, sourceChainState.RMNProxy)
+ require.NotNil(t, sourceChainState.TokenAdminRegistry)
+ require.NotNil(t, sourceChainState.Router)
+ require.NotNil(t, sourceChainState.PriceRegistry)
+ require.NotNil(t, sourceChainState.Weth9)
+ require.NotNil(t, destChainState.LinkToken)
+ require.NotNil(t, destChainState.RMNProxy)
+ require.NotNil(t, destChainState.TokenAdminRegistry)
+ tokenPrice, _, _ := CreatePricesPipeline(t, state, src, dest)
+ block, err := env.Chains[dest].Client.HeaderByNumber(context.Background(), nil)
+ require.NoError(t, err)
+ destEVMChainIdStr, err := chain_selectors.GetChainIDFromSelector(dest)
+ require.NoError(t, err)
+ destEVMChainId, err := strconv.ParseUint(destEVMChainIdStr, 10, 64)
+ require.NoError(t, err)
+ jobSpecs = append(jobSpecs, JobSpecInput{
+ SourceChainSelector: src,
+ DestinationChainSelector: dest,
+ DestEVMChainID: destEVMChainId,
+ TokenPricesUSDPipeline: tokenPrice,
+ DestinationStartBlock: block.Number.Uint64(),
+ })
+ addLanesCfg = append(addLanesCfg, DeployLaneConfig{
+ SourceChainSelector: src,
+ DestinationChainSelector: dest,
+ OnRampStaticCfg: evm_2_evm_onramp.EVM2EVMOnRampStaticConfig{
+ LinkToken: sourceChainState.LinkToken.Address(),
+ ChainSelector: src,
+ DestChainSelector: dest,
+ DefaultTxGasLimit: 200_000,
+ MaxNopFeesJuels: big.NewInt(0).Mul(big.NewInt(100_000_000), big.NewInt(1e18)),
+ PrevOnRamp: common.Address{},
+ RmnProxy: sourceChainState.RMNProxy.Address(),
+ TokenAdminRegistry: sourceChainState.TokenAdminRegistry.Address(),
+ },
+ OnRampDynamicCfg: evm_2_evm_onramp.EVM2EVMOnRampDynamicConfig{
+ Router: sourceChainState.Router.Address(),
+ MaxNumberOfTokensPerMsg: 5,
+ DestGasOverhead: 350_000,
+ DestGasPerPayloadByte: 16,
+ DestDataAvailabilityOverheadGas: 33_596,
+ DestGasPerDataAvailabilityByte: 16,
+ DestDataAvailabilityMultiplierBps: 6840,
+ PriceRegistry: sourceChainState.PriceRegistry.Address(),
+ MaxDataBytes: 1e5,
+ MaxPerMsgGasLimit: 4_000_000,
+ DefaultTokenFeeUSDCents: 50,
+ DefaultTokenDestGasOverhead: 125_000,
+ },
+ OnRampFeeTokenArgs: []evm_2_evm_onramp.EVM2EVMOnRampFeeTokenConfigArgs{
+ {
+ Token: sourceChainState.LinkToken.Address(),
+ NetworkFeeUSDCents: 1_00,
+ GasMultiplierWeiPerEth: 1e18,
+ PremiumMultiplierWeiPerEth: 9e17,
+ Enabled: true,
+ },
+ {
+ Token: sourceChainState.Weth9.Address(),
+ NetworkFeeUSDCents: 1_00,
+ GasMultiplierWeiPerEth: 1e18,
+ PremiumMultiplierWeiPerEth: 1e18,
+ Enabled: true,
+ },
+ },
+ OnRampTransferTokenCfgs: []evm_2_evm_onramp.EVM2EVMOnRampTokenTransferFeeConfigArgs{
+ {
+ Token: sourceChainState.LinkToken.Address(),
+ MinFeeUSDCents: 50, // $0.5
+ MaxFeeUSDCents: 1_000_000_00, // $ 1 million
+ DeciBps: 5_0, // 5 bps
+ DestGasOverhead: 350_000,
+ DestBytesOverhead: 32,
+ AggregateRateLimitEnabled: true,
+ },
+ },
+ OnRampNopsAndWeight: []evm_2_evm_onramp.EVM2EVMOnRampNopAndWeight{},
+ OnRampRateLimiterCfg: evm_2_evm_onramp.RateLimiterConfig{
+ IsEnabled: true,
+ Capacity: testhelpers.LinkUSDValue(100),
+ Rate: testhelpers.LinkUSDValue(1),
+ },
+ OffRampRateLimiterCfg: evm_2_evm_offramp.RateLimiterConfig{
+ IsEnabled: true,
+ Capacity: testhelpers.LinkUSDValue(100),
+ Rate: testhelpers.LinkUSDValue(1),
+ },
+ InitialTokenPrices: []price_registry_1_2_0.InternalTokenPriceUpdate{
+ {
+ SourceToken: sourceChainState.LinkToken.Address(),
+ UsdPerToken: new(big.Int).Mul(big.NewInt(1e18), big.NewInt(20)),
+ },
+ {
+ SourceToken: sourceChainState.Weth9.Address(),
+ UsdPerToken: new(big.Int).Mul(big.NewInt(1e18), big.NewInt(2000)),
+ },
+ },
+ GasPriceUpdates: []price_registry_1_2_0.InternalGasPriceUpdate{
+ {
+ DestChainSelector: dest,
+ UsdPerUnitGas: big.NewInt(20000e9),
+ },
+ },
+ })
+ commitOCR2Configs = append(commitOCR2Configs, CommitOCR2ConfigParams{
+ SourceChainSelector: src,
+ DestinationChainSelector: dest,
+ OCR2ConfigParams: DefaultOCRParams(),
+ GasPriceHeartBeat: *config.MustNewDuration(10 * time.Second),
+ DAGasPriceDeviationPPB: 1,
+ ExecGasPriceDeviationPPB: 1,
+ TokenPriceHeartBeat: *config.MustNewDuration(10 * time.Second),
+ TokenPriceDeviationPPB: 1,
+ InflightCacheExpiry: *config.MustNewDuration(5 * time.Second),
+ PriceReportingDisabled: false,
+ })
+ execOCR2Configs = append(execOCR2Configs, ExecuteOCR2ConfigParams{
+ DestinationChainSelector: dest,
+ SourceChainSelector: src,
+ DestOptimisticConfirmations: 1,
+ BatchGasLimit: 5_000_000,
+ RelativeBoostPerWaitHour: 0.07,
+ InflightCacheExpiry: *config.MustNewDuration(1 * time.Minute),
+ RootSnoozeTime: *config.MustNewDuration(1 * time.Minute),
+ BatchingStrategyID: 0,
+ MessageVisibilityInterval: config.Duration{},
+ ExecOnchainConfig: evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig{
+ PermissionLessExecutionThresholdSeconds: uint32(24 * time.Hour.Seconds()),
+ MaxDataBytes: 1e5,
+ MaxNumberOfTokensPerMsg: 5,
+ },
+ OCR2ConfigParams: DefaultOCRParams(),
+ })
+ }
+ return addLanesCfg, commitOCR2Configs, execOCR2Configs, jobSpecs
+}
+
+func CreatePricesPipeline(t *testing.T, state changeset.CCIPOnChainState, source, dest uint64) (string, *httptest.Server, *httptest.Server) {
+ sourceRouter := state.Chains[source].Router
+ destRouter := state.Chains[dest].Router
+ destLink := state.Chains[dest].LinkToken
+ linkUSD := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
+ _, err := w.Write([]byte(`{"UsdPerLink": "8000000000000000000"}`))
+ require.NoError(t, err)
+ }))
+ t.Cleanup(linkUSD.Close)
+
+ ethUSD := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
+ _, err := w.Write([]byte(`{"UsdPerETH": "1700000000000000000000"}`))
+ require.NoError(t, err)
+ }))
+ t.Cleanup(ethUSD.Close)
+
+ sourceWrappedNative, err := sourceRouter.GetWrappedNative(nil)
+ require.NoError(t, err)
+ destWrappedNative, err := destRouter.GetWrappedNative(nil)
+ require.NoError(t, err)
+ tokenPricesUSDPipeline := fmt.Sprintf(`
+// Price 1
+link [type=http method=GET url="%s"];
+link_parse [type=jsonparse path="UsdPerLink"];
+link->link_parse;
+eth [type=http method=GET url="%s"];
+eth_parse [type=jsonparse path="UsdPerETH"];
+eth->eth_parse;
+merge [type=merge left="{}" right="{\\\"%s\\\":$(link_parse), \\\"%s\\\":$(eth_parse), \\\"%s\\\":$(eth_parse)}"];`,
+ linkUSD.URL, ethUSD.URL, destLink.Address(), sourceWrappedNative, destWrappedNative)
+
+ return tokenPricesUSDPipeline, linkUSD, ethUSD
+}
+
+func DefaultOCRParams() confighelper.PublicConfig {
+ return confighelper.PublicConfig{
+ DeltaProgress: 2 * time.Second,
+ DeltaResend: 1 * time.Second,
+ DeltaRound: 1 * time.Second,
+ DeltaGrace: 500 * time.Millisecond,
+ DeltaStage: 2 * time.Second,
+ RMax: 3,
+ MaxDurationInitialization: nil,
+ MaxDurationQuery: 50 * time.Millisecond,
+ MaxDurationObservation: 1 * time.Second,
+ MaxDurationReport: 100 * time.Millisecond,
+ MaxDurationShouldAcceptFinalizedReport: 100 * time.Millisecond,
+ MaxDurationShouldTransmitAcceptedReport: 100 * time.Millisecond,
+ }
+}
+
+func SendRequest(
+ t *testing.T,
+ e deployment.Environment,
+ state changeset.CCIPOnChainState,
+ opts ...changeset.SendReqOpts,
+) (*evm_2_evm_onramp.EVM2EVMOnRampCCIPSendRequested, error) {
+ cfg := &changeset.CCIPSendReqConfig{}
+ for _, opt := range opts {
+ opt(cfg)
+ }
+ // Set default sender if not provided
+ if cfg.Sender == nil {
+ cfg.Sender = e.Chains[cfg.SourceChain].DeployerKey
+ }
+ t.Logf("Sending CCIP request from chain selector %d to chain selector %d from sender %s",
+ cfg.SourceChain, cfg.DestChain, cfg.Sender.From.String())
+ tx, blockNum, err := changeset.CCIPSendRequest(e, state, cfg)
+ if err != nil {
+ return nil, err
+ }
+
+ onRamp := state.Chains[cfg.SourceChain].EVM2EVMOnRamp[cfg.DestChain]
+
+ it, err := onRamp.FilterCCIPSendRequested(&bind.FilterOpts{
+ Start: blockNum,
+ End: &blockNum,
+ Context: context.Background(),
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ require.True(t, it.Next())
+ t.Logf("CCIP message (id %x) sent from chain selector %d to chain selector %d tx %s seqNum %d sender %s",
+ it.Event.Message.MessageId[:],
+ cfg.SourceChain,
+ cfg.DestChain,
+ tx.Hash().String(),
+ it.Event.Message.SequenceNumber,
+ it.Event.Message.Sender.String(),
+ )
+ return it.Event, nil
+}
+
+func WaitForCommit(
+ t *testing.T,
+ src deployment.Chain,
+ dest deployment.Chain,
+ commitStore *commit_store.CommitStore,
+ seqNr uint64,
+) {
+ timer := time.NewTimer(5 * time.Minute)
+ defer timer.Stop()
+ ticker := time.NewTicker(2 * time.Second)
+ defer ticker.Stop()
+ for {
+ select {
+ case <-ticker.C:
+ if backend, ok := src.Client.(*memory.Backend); ok {
+ backend.Commit()
+ }
+ if backend, ok := dest.Client.(*memory.Backend); ok {
+ backend.Commit()
+ }
+ minSeqNr, err := commitStore.GetExpectedNextSequenceNumber(nil)
+ require.NoError(t, err)
+ t.Logf("Waiting for commit for sequence number %d, current min sequence number %d", seqNr, minSeqNr)
+ if minSeqNr > seqNr {
+ t.Logf("Commit for sequence number %d found", seqNr)
+ return
+ }
+ case <-timer.C:
+ t.Fatalf("timed out waiting for commit for sequence number %d for commit store %s ", seqNr, commitStore.Address().String())
+ return
+ }
+ }
+}
+
+func WaitForExecute(
+ t *testing.T,
+ src deployment.Chain,
+ dest deployment.Chain,
+ offRamp *evm_2_evm_offramp.EVM2EVMOffRamp,
+ seqNrs []uint64,
+ blockNum uint64,
+) {
+ timer := time.NewTimer(5 * time.Minute)
+ defer timer.Stop()
+ ticker := time.NewTicker(2 * time.Second)
+ defer ticker.Stop()
+ for {
+ select {
+ case <-ticker.C:
+ if backend, ok := src.Client.(*memory.Backend); ok {
+ backend.Commit()
+ }
+ if backend, ok := dest.Client.(*memory.Backend); ok {
+ backend.Commit()
+ }
+ t.Logf("Waiting for execute for sequence numbers %v", seqNrs)
+ it, err := offRamp.FilterExecutionStateChanged(
+ &bind.FilterOpts{
+ Start: blockNum,
+ }, seqNrs, [][32]byte{})
+ require.NoError(t, err)
+ for it.Next() {
+ t.Logf("Execution state changed for sequence number=%d current state=%d", it.Event.SequenceNumber, it.Event.State)
+ if cciptypes.MessageExecutionState(it.Event.State) == cciptypes.ExecutionStateSuccess {
+ t.Logf("Execution for sequence number %d found", it.Event.SequenceNumber)
+ return
+ }
+ t.Logf("Execution for sequence number %d resulted in status %d", it.Event.SequenceNumber, it.Event.State)
+ t.Fail()
+ }
+ case <-timer.C:
+ t.Fatalf("timed out waiting for execute for sequence numbers %v for offramp %s ", seqNrs, offRamp.Address().String())
+ return
+ }
+ }
+}
diff --git a/deployment/ccip/changeset/view_test.go b/deployment/ccip/changeset/view_test.go
index 11430bfbddf..35193979849 100644
--- a/deployment/ccip/changeset/view_test.go
+++ b/deployment/ccip/changeset/view_test.go
@@ -7,6 +7,7 @@ import (
)
func TestSmokeView(t *testing.T) {
+ t.Parallel()
tenv := NewMemoryEnvironment(t, WithChains(3))
_, err := ViewCCIP(tenv.Env)
require.NoError(t, err)
diff --git a/deployment/ccip/view/v1_0/rmn_proxy_contract.go b/deployment/ccip/view/v1_0/rmn_proxy_contract.go
index 6c628281399..818b9fcac93 100644
--- a/deployment/ccip/view/v1_0/rmn_proxy_contract.go
+++ b/deployment/ccip/view/v1_0/rmn_proxy_contract.go
@@ -14,7 +14,7 @@ type RMNProxyView struct {
RMN common.Address `json:"rmn"`
}
-func GenerateRMNProxyView(r *rmn_proxy_contract.RMNProxyContract) (RMNProxyView, error) {
+func GenerateRMNProxyView(r *rmn_proxy_contract.RMNProxy) (RMNProxyView, error) {
if r == nil {
return RMNProxyView{}, fmt.Errorf("cannot generate view for nil RMNProxy")
}
diff --git a/deployment/ccip/view/v1_6/ccip_home.go b/deployment/ccip/view/v1_6/ccip_home.go
index ac1e23179c4..b188c32c079 100644
--- a/deployment/ccip/view/v1_6/ccip_home.go
+++ b/deployment/ccip/view/v1_6/ccip_home.go
@@ -8,7 +8,7 @@ import (
"github.com/smartcontractkit/chainlink/deployment/common/view/types"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
// https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ccip/libraries/Internal.sol#L190
diff --git a/deployment/ccip/view/v1_6/ccip_home_test.go b/deployment/ccip/view/v1_6/ccip_home_test.go
index 26f6f50aed5..8ea79e8eac3 100644
--- a/deployment/ccip/view/v1_6/ccip_home_test.go
+++ b/deployment/ccip/view/v1_6/ccip_home_test.go
@@ -11,7 +11,7 @@ import (
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/logger"
)
diff --git a/deployment/ccip/view/v1_6/rmnhome.go b/deployment/ccip/view/v1_6/rmnhome.go
new file mode 100644
index 00000000000..82d39074d6f
--- /dev/null
+++ b/deployment/ccip/view/v1_6/rmnhome.go
@@ -0,0 +1,214 @@
+package v1_6
+
+import (
+ "encoding/hex"
+ "encoding/json"
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/smartcontractkit/chainlink/deployment/common/view/types"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home"
+)
+
+type RMNHomeView struct {
+ types.ContractMetaData
+ CandidateConfig *RMNHomeVersionedConfig `json:"candidateConfig,omitempty"`
+ ActiveConfig *RMNHomeVersionedConfig `json:"activeConfig,omitempty"`
+}
+
+type RMNHomeVersionedConfig struct {
+ Version uint32 `json:"version"`
+ StaticConfig RMNHomeStaticConfig `json:"staticConfig"`
+ DynamicConfig RMNHomeDynamicConfig `json:"dynamicConfig"`
+ Digest [32]byte `json:"digest"`
+}
+
+func decodeHexString(hexStr string, expectedLength int) ([]byte, error) {
+ bytes, err := hex.DecodeString(hexStr)
+ if err != nil {
+ return nil, err
+ }
+ if len(bytes) != expectedLength {
+ return nil, fmt.Errorf("invalid length: expected %d, got %d", expectedLength, len(bytes))
+ }
+ return bytes, nil
+}
+
+func (c RMNHomeVersionedConfig) MarshalJSON() ([]byte, error) {
+ type Alias RMNHomeVersionedConfig
+ return json.Marshal(&struct {
+ Digest string `json:"digest"`
+ *Alias
+ }{
+ Digest: hex.EncodeToString(c.Digest[:]),
+ Alias: (*Alias)(&c),
+ })
+}
+
+func (c *RMNHomeVersionedConfig) UnmarshalJSON(data []byte) error {
+ type Alias RMNHomeVersionedConfig
+ aux := &struct {
+ Digest string `json:"digest"`
+ *Alias
+ }{
+ Alias: (*Alias)(c),
+ }
+
+ if err := json.Unmarshal(data, &aux); err != nil {
+ return err
+ }
+
+ digestBytes, err := decodeHexString(aux.Digest, 32)
+ if err != nil {
+ return err
+ }
+ copy(c.Digest[:], digestBytes)
+ return nil
+}
+
+type RMNHomeStaticConfig struct {
+ Nodes []RMNHomeNode `json:"nodes"`
+}
+
+type RMNHomeDynamicConfig struct {
+ SourceChains []RMNHomeSourceChain `json:"sourceChains"`
+}
+
+type RMNHomeSourceChain struct {
+ ChainSelector uint64 `json:"selector"`
+ F uint64 `json:"f"`
+ ObserverNodesBitmap *big.Int `json:"observerNodesBitmap"`
+}
+
+type RMNHomeNode struct {
+ PeerId [32]byte `json:"peerId"`
+ OffchainPublicKey [32]byte `json:"offchainPublicKey"`
+}
+
+func (n RMNHomeNode) MarshalJSON() ([]byte, error) {
+ type Alias RMNHomeNode
+ return json.Marshal(&struct {
+ PeerId string `json:"peerId"`
+ OffchainPublicKey string `json:"offchainPublicKey"`
+ *Alias
+ }{
+ PeerId: hex.EncodeToString(n.PeerId[:]),
+ OffchainPublicKey: hex.EncodeToString(n.OffchainPublicKey[:]),
+ Alias: (*Alias)(&n),
+ })
+}
+
+func (n *RMNHomeNode) UnmarshalJSON(data []byte) error {
+ type Alias RMNHomeNode
+ aux := &struct {
+ PeerId string `json:"peerId"`
+ OffchainPublicKey string `json:"offchainPublicKey"`
+ *Alias
+ }{
+ Alias: (*Alias)(n),
+ }
+ if err := json.Unmarshal(data, &aux); err != nil {
+ return err
+ }
+
+ peerIdBytes, err := decodeHexString(aux.PeerId, 32)
+ if err != nil {
+ return err
+ }
+ copy(n.PeerId[:], peerIdBytes)
+
+ offchainPublicKeyBytes, err := decodeHexString(aux.OffchainPublicKey, 32)
+ if err != nil {
+ return err
+ }
+ copy(n.OffchainPublicKey[:], offchainPublicKeyBytes)
+
+ return nil
+}
+
+type DigestFunc func(*bind.CallOpts) ([32]byte, error)
+
+func mapNodes(nodes []rmn_home.RMNHomeNode) []RMNHomeNode {
+ result := make([]RMNHomeNode, len(nodes))
+ for i, node := range nodes {
+ result[i] = RMNHomeNode{
+ PeerId: node.PeerId,
+ OffchainPublicKey: node.OffchainPublicKey,
+ }
+ }
+ return result
+}
+
+func mapSourceChains(chains []rmn_home.RMNHomeSourceChain) []RMNHomeSourceChain {
+ result := make([]RMNHomeSourceChain, len(chains))
+ for i, chain := range chains {
+ result[i] = RMNHomeSourceChain{
+ ChainSelector: chain.ChainSelector,
+ F: chain.F,
+ ObserverNodesBitmap: chain.ObserverNodesBitmap,
+ }
+ }
+ return result
+}
+
+func generateRmnHomeVersionedConfig(reader *rmn_home.RMNHome, digestFunc DigestFunc) (*RMNHomeVersionedConfig, error) {
+ address := reader.Address()
+ digest, err := digestFunc(nil)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get digest for contract %s: %w", address, err)
+ }
+
+ if digest == [32]byte{} {
+ return nil, nil
+ }
+
+ config, err := reader.GetConfig(nil, digest)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get config for contract %s: %w", address, err)
+ }
+
+ staticConfig := RMNHomeStaticConfig{
+ Nodes: mapNodes(config.VersionedConfig.StaticConfig.Nodes),
+ }
+
+ dynamicConfig := RMNHomeDynamicConfig{
+ SourceChains: mapSourceChains(config.VersionedConfig.DynamicConfig.SourceChains),
+ }
+
+ return &RMNHomeVersionedConfig{
+ Version: config.VersionedConfig.Version,
+ Digest: config.VersionedConfig.ConfigDigest,
+ StaticConfig: staticConfig,
+ DynamicConfig: dynamicConfig,
+ }, nil
+}
+
+func GenerateRMNHomeView(rmnReader *rmn_home.RMNHome) (RMNHomeView, error) {
+ if rmnReader == nil {
+ return RMNHomeView{}, nil
+ }
+
+ address := rmnReader.Address()
+
+ activeConfig, err := generateRmnHomeVersionedConfig(rmnReader, rmnReader.GetActiveDigest)
+ if err != nil {
+ return RMNHomeView{}, fmt.Errorf("failed to generate active config for contract %s: %w", address, err)
+ }
+
+ candidateConfig, err := generateRmnHomeVersionedConfig(rmnReader, rmnReader.GetCandidateDigest)
+ if err != nil {
+ return RMNHomeView{}, fmt.Errorf("failed to generate candidate config for contract %s: %w", address, err)
+ }
+
+ contractMetaData, err := types.NewContractMetaData(rmnReader, rmnReader.Address())
+ if err != nil {
+ return RMNHomeView{}, fmt.Errorf("failed to create contract metadata for contract %s: %w", address, err)
+ }
+
+ return RMNHomeView{
+ ContractMetaData: contractMetaData,
+ CandidateConfig: candidateConfig,
+ ActiveConfig: activeConfig,
+ }, nil
+}
diff --git a/deployment/ccip/view/view.go b/deployment/ccip/view/view.go
index 77781a8a31a..8f698ba2277 100644
--- a/deployment/ccip/view/view.go
+++ b/deployment/ccip/view/view.go
@@ -19,10 +19,16 @@ type ChainView struct {
// v1.5
TokenAdminRegistry map[string]v1_5.TokenAdminRegistryView `json:"tokenAdminRegistry,omitempty"`
CommitStore map[string]v1_5.CommitStoreView `json:"commitStore,omitempty"`
+ PriceRegistry map[string]v1_2.PriceRegistryView `json:"priceRegistry,omitempty"`
+ EVM2EVMOnRamp map[string]v1_5.OnRampView `json:"evm2evmOnRamp,omitempty"`
+ EVM2EVMOffRamp map[string]v1_5.OffRampView `json:"evm2evmOffRamp,omitempty"`
+ RMN map[string]v1_5.RMNView `json:"rmn,omitempty"`
+
// v1.6
FeeQuoter map[string]v1_6.FeeQuoterView `json:"feeQuoter,omitempty"`
NonceManager map[string]v1_6.NonceManagerView `json:"nonceManager,omitempty"`
- RMN map[string]v1_6.RMNRemoteView `json:"rmn,omitempty"`
+ RMNRemote map[string]v1_6.RMNRemoteView `json:"rmnRemote,omitempty"`
+ RMNHome map[string]v1_6.RMNHomeView `json:"rmnHome,omitempty"`
OnRamp map[string]v1_6.OnRampView `json:"onRamp,omitempty"`
OffRamp map[string]v1_6.OffRampView `json:"offRamp,omitempty"`
// TODO: Perhaps restrict to one CCIPHome/CR? Shouldn't
@@ -39,14 +45,19 @@ func NewChain() ChainView {
// v1.0
RMNProxy: make(map[string]v1_0.RMNProxyView),
// v1.2
- Router: make(map[string]v1_2.RouterView),
+ Router: make(map[string]v1_2.RouterView),
+ PriceRegistry: make(map[string]v1_2.PriceRegistryView),
// v1.5
TokenAdminRegistry: make(map[string]v1_5.TokenAdminRegistryView),
CommitStore: make(map[string]v1_5.CommitStoreView),
+ EVM2EVMOnRamp: make(map[string]v1_5.OnRampView),
+ EVM2EVMOffRamp: make(map[string]v1_5.OffRampView),
+ RMN: make(map[string]v1_5.RMNView),
// v1.6
FeeQuoter: make(map[string]v1_6.FeeQuoterView),
NonceManager: make(map[string]v1_6.NonceManagerView),
- RMN: make(map[string]v1_6.RMNRemoteView),
+ RMNRemote: make(map[string]v1_6.RMNRemoteView),
+ RMNHome: make(map[string]v1_6.RMNHomeView),
OnRamp: make(map[string]v1_6.OnRampView),
OffRamp: make(map[string]v1_6.OffRampView),
CapabilityRegistry: make(map[string]common_v1_0.CapabilityRegistryView),
diff --git a/deployment/common/changeset/deploy_link_token.go b/deployment/common/changeset/deploy_link_token.go
index 292c07c93df..c115a7ee083 100644
--- a/deployment/common/changeset/deploy_link_token.go
+++ b/deployment/common/changeset/deploy_link_token.go
@@ -12,7 +12,7 @@ import (
var _ deployment.ChangeSet[[]uint64] = DeployLinkToken
-// DeployLinkToken deploys a link token contract to the chain identified by the chainSelector.
+// DeployLinkToken deploys a link token contract to the chain identified by the ChainSelector.
func DeployLinkToken(e deployment.Environment, chains []uint64) (deployment.ChangesetOutput, error) {
for _, chain := range chains {
_, ok := e.Chains[chain]
diff --git a/deployment/common/changeset/deploy_link_token_test.go b/deployment/common/changeset/deploy_link_token_test.go
index a61743e9bf4..bc472d2a247 100644
--- a/deployment/common/changeset/deploy_link_token_test.go
+++ b/deployment/common/changeset/deploy_link_token_test.go
@@ -27,7 +27,7 @@ func TestDeployLinkToken(t *testing.T) {
require.NoError(t, err)
addrs, err := e.ExistingAddresses.AddressesForChain(chain1)
require.NoError(t, err)
- state, err := changeset.MaybeLoadLinkTokenState(e.Chains[chain1], addrs)
+ state, err := changeset.MaybeLoadLinkTokenChainState(e.Chains[chain1], addrs)
require.NoError(t, err)
// View itself already unit tested
_, err = state.GenerateLinkView()
diff --git a/deployment/common/changeset/deploy_mcms_with_timelock.go b/deployment/common/changeset/deploy_mcms_with_timelock.go
index c36e1f1575b..06f9aba6164 100644
--- a/deployment/common/changeset/deploy_mcms_with_timelock.go
+++ b/deployment/common/changeset/deploy_mcms_with_timelock.go
@@ -1,6 +1,12 @@
package changeset
import (
+ "context"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/common/changeset/internal"
"github.com/smartcontractkit/chainlink/deployment/common/types"
@@ -18,3 +24,16 @@ func DeployMCMSWithTimelock(e deployment.Environment, cfgByChain map[uint64]type
}
return deployment.ChangesetOutput{AddressBook: newAddresses}, nil
}
+
+func ValidateOwnership(ctx context.Context, mcms bool, deployerKey, timelock common.Address, contract Ownable) error {
+ owner, err := contract.Owner(&bind.CallOpts{Context: ctx})
+ if err != nil {
+ return fmt.Errorf("failed to get owner: %w", err)
+ }
+ if mcms && owner != timelock {
+ return fmt.Errorf("%s not owned by deployer key", contract.Address())
+ } else if !mcms && owner != deployerKey {
+ return fmt.Errorf("%s not owned by deployer key", contract.Address())
+ }
+ return nil
+}
diff --git a/deployment/common/changeset/example/add_mint_burners_link.go b/deployment/common/changeset/example/add_mint_burners_link.go
new file mode 100644
index 00000000000..7322f99dd60
--- /dev/null
+++ b/deployment/common/changeset/example/add_mint_burners_link.go
@@ -0,0 +1,70 @@
+package example
+
+import (
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+)
+
+type AddMintersBurnersLinkConfig struct {
+ ChainSelector uint64
+ Minters []common.Address
+ Burners []common.Address
+}
+
+var _ deployment.ChangeSet[*AddMintersBurnersLinkConfig] = AddMintersBurnersLink
+
+// AddMintersBurnersLink grants the minter / burner role to the provided addresses.
+func AddMintersBurnersLink(e deployment.Environment, cfg *AddMintersBurnersLinkConfig) (deployment.ChangesetOutput, error) {
+
+ chain := e.Chains[cfg.ChainSelector]
+ addresses, err := e.ExistingAddresses.AddressesForChain(cfg.ChainSelector)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addresses)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ for _, minter := range cfg.Minters {
+ // check if minter is already a minter
+ isMinter, err := linkState.LinkToken.IsMinter(&bind.CallOpts{Context: e.GetContext()}, minter)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if isMinter {
+ continue
+ }
+ tx, err := linkState.LinkToken.GrantMintRole(chain.DeployerKey, minter)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ }
+ for _, burner := range cfg.Burners {
+ // check if burner is already a burner
+ isBurner, err := linkState.LinkToken.IsBurner(&bind.CallOpts{Context: e.GetContext()}, burner)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if isBurner {
+ continue
+ }
+ tx, err := linkState.LinkToken.GrantBurnRole(chain.DeployerKey, burner)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ }
+ return deployment.ChangesetOutput{}, nil
+
+}
diff --git a/deployment/common/changeset/example/add_mint_burners_link_test.go b/deployment/common/changeset/example/add_mint_burners_link_test.go
new file mode 100644
index 00000000000..4dbfddc0b30
--- /dev/null
+++ b/deployment/common/changeset/example/add_mint_burners_link_test.go
@@ -0,0 +1,50 @@
+package example_test
+
+import (
+ "context"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset/example"
+)
+
+// TestAddMintersBurnersLink tests the AddMintersBurnersLink changeset
+func TestAddMintersBurnersLink(t *testing.T) {
+ t.Parallel()
+ ctx := context.Background()
+ // Deploy Link Token and Timelock contracts and add addresses to environment
+ env := setupLinkTransferTestEnv(t)
+
+ chainSelector := env.AllChainSelectors()[0]
+ chain := env.Chains[chainSelector]
+ addrs, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ require.NoError(t, err)
+ require.Len(t, addrs, 6)
+
+ mcmsState, err := changeset.MaybeLoadMCMSWithTimelockChainState(chain, addrs)
+ require.NoError(t, err)
+ linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addrs)
+ require.NoError(t, err)
+
+ timelockAddress := mcmsState.Timelock.Address()
+
+ // Mint some funds
+ _, err = example.AddMintersBurnersLink(env, &example.AddMintersBurnersLinkConfig{
+ ChainSelector: chainSelector,
+ Minters: []common.Address{timelockAddress},
+ Burners: []common.Address{timelockAddress},
+ })
+ require.NoError(t, err)
+
+ // check timelock balance
+ isMinter, err := linkState.LinkToken.IsMinter(&bind.CallOpts{Context: ctx}, timelockAddress)
+ require.NoError(t, err)
+ require.True(t, isMinter)
+ isBurner, err := linkState.LinkToken.IsBurner(&bind.CallOpts{Context: ctx}, timelockAddress)
+ require.NoError(t, err)
+ require.True(t, isBurner)
+}
diff --git a/deployment/common/changeset/example/link_transfer.go b/deployment/common/changeset/example/link_transfer.go
new file mode 100644
index 00000000000..2e3be48a4d1
--- /dev/null
+++ b/deployment/common/changeset/example/link_transfer.go
@@ -0,0 +1,239 @@
+package example
+
+import (
+ "errors"
+ "fmt"
+ "math/big"
+ "time"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ ethTypes "github.com/ethereum/go-ethereum/core/types"
+ owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
+
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ "github.com/smartcontractkit/chainlink/deployment/common/types"
+)
+
+const MaxTimelockDelay = 24 * 7 * time.Hour
+
+type TransferConfig struct {
+ To common.Address
+ Value *big.Int
+}
+
+type MCMSConfig struct {
+ MinDelay time.Duration // delay for timelock worker to execute the transfers.
+ OverrideRoot bool
+}
+
+type LinkTransferConfig struct {
+ Transfers map[uint64][]TransferConfig
+ From common.Address
+ McmsConfig *MCMSConfig
+}
+
+var _ deployment.ChangeSet[*LinkTransferConfig] = LinkTransfer
+
+func getDeployer(e deployment.Environment, chain uint64, mcmConfig *MCMSConfig) *bind.TransactOpts {
+ if mcmConfig == nil {
+ return e.Chains[chain].DeployerKey
+ }
+
+ return deployment.SimTransactOpts()
+}
+
+// Validate checks that the LinkTransferConfig is valid.
+func (cfg LinkTransferConfig) Validate(e deployment.Environment) error {
+ ctx := e.GetContext()
+ // Check that Transfers map has at least one chainSel
+ if len(cfg.Transfers) == 0 {
+ return errors.New("transfers map must have at least one chainSel")
+ }
+
+ // Check transfers config values.
+ for chainSel, transfers := range cfg.Transfers {
+ selector, err := chain_selectors.GetSelectorFamily(chainSel)
+ if err != nil {
+ return fmt.Errorf("invalid chain selector: %w", err)
+ }
+ if selector != chain_selectors.FamilyEVM {
+ return fmt.Errorf("chain selector %d is not an EVM chain", chainSel)
+ }
+ chain, ok := e.Chains[chainSel]
+ if !ok {
+ return fmt.Errorf("chain with selector %d not found", chainSel)
+ }
+ addrs, err := e.ExistingAddresses.AddressesForChain(chainSel)
+ if err != nil {
+ return fmt.Errorf("error getting addresses for chain %d: %w", chainSel, err)
+ }
+ if len(transfers) == 0 {
+ return fmt.Errorf("transfers for chainSel %d must have at least one LinkTransfer", chainSel)
+ }
+ totalAmount := big.NewInt(0)
+ linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addrs)
+ if err != nil {
+ return fmt.Errorf("error loading link token state during validation: %w", err)
+ }
+ for _, transfer := range transfers {
+ if transfer.To == (common.Address{}) {
+ return errors.New("'to' address for transfers must be set")
+ }
+ if transfer.Value == nil {
+ return errors.New("value for transfers must be set")
+ }
+ if transfer.Value.Cmp(big.NewInt(0)) == 0 {
+ return errors.New("value for transfers must be non-zero")
+ }
+ if transfer.Value.Cmp(big.NewInt(0)) == -1 {
+ return errors.New("value for transfers must be positive")
+ }
+ totalAmount.Add(totalAmount, transfer.Value)
+ }
+ // check that from address has enough funds for the transfers
+ balance, err := linkState.LinkToken.BalanceOf(&bind.CallOpts{Context: ctx}, cfg.From)
+ if balance.Cmp(totalAmount) < 0 {
+ return fmt.Errorf("sender does not have enough funds for transfers for chain selector %d, required: %s, available: %s", chainSel, totalAmount.String(), balance.String())
+ }
+ }
+
+ if cfg.McmsConfig == nil {
+ return nil
+ }
+
+ // Upper bound for min delay (7 days)
+ if cfg.McmsConfig.MinDelay > MaxTimelockDelay {
+ return errors.New("minDelay must be less than 7 days")
+ }
+
+ return nil
+}
+
+// initStatePerChain initializes the state for each chain selector on the provided config
+func initStatePerChain(cfg *LinkTransferConfig, e deployment.Environment) (
+ linkStatePerChain map[uint64]*changeset.LinkTokenState,
+ mcmsStatePerChain map[uint64]*changeset.MCMSWithTimelockState,
+ err error) {
+ linkStatePerChain = map[uint64]*changeset.LinkTokenState{}
+ mcmsStatePerChain = map[uint64]*changeset.MCMSWithTimelockState{}
+ // Load state for each chain
+ chainSelectors := []uint64{}
+ for chainSelector := range cfg.Transfers {
+ chainSelectors = append(chainSelectors, chainSelector)
+ }
+ linkStatePerChain, err = changeset.MaybeLoadLinkTokenState(e, chainSelectors)
+ if err != nil {
+ return nil, nil, err
+ }
+ mcmsStatePerChain, err = changeset.MaybeLoadMCMSWithTimelockState(e, chainSelectors)
+ if err != nil {
+ return nil, nil, err
+
+ }
+ return linkStatePerChain, mcmsStatePerChain, nil
+}
+
+// transferOrBuildTx transfers the LINK tokens or builds the tx for the MCMS proposal
+func transferOrBuildTx(
+ e deployment.Environment,
+ linkState *changeset.LinkTokenState,
+ transfer TransferConfig,
+ opts *bind.TransactOpts,
+ chain deployment.Chain,
+ mcmsConfig *MCMSConfig) (*ethTypes.Transaction, error) {
+ tx, err := linkState.LinkToken.Transfer(opts, transfer.To, transfer.Value)
+ if err != nil {
+ return nil, fmt.Errorf("error packing transfer tx data: %w", err)
+ }
+ // only wait for tx if we are not using MCMS
+ if mcmsConfig == nil {
+ if _, err := deployment.ConfirmIfNoError(chain, tx, err); err != nil {
+ e.Logger.Errorw("Failed to confirm transfer tx", "chain", chain.String(), "err", err)
+ return nil, err
+ }
+ }
+ return tx, nil
+
+}
+
+// LinkTransfer takes the given link transfers and executes them or creates an MCMS proposal for them.
+func LinkTransfer(e deployment.Environment, cfg *LinkTransferConfig) (deployment.ChangesetOutput, error) {
+
+ err := cfg.Validate(e)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("invalid LinkTransferConfig: %w", err)
+ }
+ chainSelectors := []uint64{}
+ for chainSelector := range cfg.Transfers {
+ chainSelectors = append(chainSelectors, chainSelector)
+ }
+ mcmsPerChain := map[uint64]*owner_helpers.ManyChainMultiSig{}
+
+ timelockAddresses := map[uint64]common.Address{}
+ // Initialize state for each chain
+ linkStatePerChain, mcmsStatePerChain, err := initStatePerChain(cfg, e)
+
+ allBatches := []timelock.BatchChainOperation{}
+ for chainSelector := range cfg.Transfers {
+ chainID := mcms.ChainIdentifier(chainSelector)
+ chain := e.Chains[chainSelector]
+ linkAddress := linkStatePerChain[chainSelector].LinkToken.Address()
+ mcmsState := mcmsStatePerChain[chainSelector]
+ linkState := linkStatePerChain[chainSelector]
+
+ timelockAddress := mcmsState.Timelock.Address()
+
+ mcmsPerChain[uint64(chainID)] = mcmsState.ProposerMcm
+
+ timelockAddresses[chainSelector] = timelockAddress
+ batch := timelock.BatchChainOperation{
+ ChainIdentifier: chainID,
+ Batch: []mcms.Operation{},
+ }
+
+ opts := getDeployer(e, chainSelector, cfg.McmsConfig)
+ totalAmount := big.NewInt(0)
+ for _, transfer := range cfg.Transfers[chainSelector] {
+ tx, err := transferOrBuildTx(e, linkState, transfer, opts, chain, cfg.McmsConfig)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ op := mcms.Operation{
+ To: linkAddress,
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ ContractType: string(types.LinkToken),
+ }
+ batch.Batch = append(batch.Batch, op)
+ totalAmount.Add(totalAmount, transfer.Value)
+ }
+
+ allBatches = append(allBatches, batch)
+ }
+
+ if cfg.McmsConfig != nil {
+ proposal, err := proposalutils.BuildProposalFromBatches(
+ timelockAddresses,
+ mcmsPerChain,
+ allBatches,
+ "LINK Value transfer proposal",
+ cfg.McmsConfig.MinDelay,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ return deployment.ChangesetOutput{
+ Proposals: []timelock.MCMSWithTimelockProposal{*proposal},
+ }, nil
+ }
+
+ return deployment.ChangesetOutput{}, nil
+}
diff --git a/deployment/common/changeset/example/link_transfer_test.go b/deployment/common/changeset/example/link_transfer_test.go
new file mode 100644
index 00000000000..eecfbd37c95
--- /dev/null
+++ b/deployment/common/changeset/example/link_transfer_test.go
@@ -0,0 +1,373 @@
+package example_test
+
+import (
+ "context"
+ "math/big"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
+
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset/example"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+
+ "github.com/stretchr/testify/require"
+ "go.uber.org/zap/zapcore"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/types"
+ "github.com/smartcontractkit/chainlink/deployment/environment/memory"
+)
+
+// setupLinkTransferContracts deploys all required contracts for the link transfer tests and returns the updated env.
+func setupLinkTransferTestEnv(t *testing.T) deployment.Environment {
+
+ lggr := logger.TestLogger(t)
+ cfg := memory.MemoryEnvironmentConfig{
+ Nodes: 1,
+ Chains: 2,
+ }
+ env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg)
+ chainSelector := env.AllChainSelectors()[0]
+ config := proposalutils.SingleGroupMCMS(t)
+
+ // Deploy MCMS and Timelock
+ env, err := changeset.ApplyChangesets(t, env, nil, []changeset.ChangesetApplication{
+ {
+ Changeset: changeset.WrapChangeSet(changeset.DeployLinkToken),
+ Config: []uint64{chainSelector},
+ },
+ {
+ Changeset: changeset.WrapChangeSet(changeset.DeployMCMSWithTimelock),
+ Config: map[uint64]types.MCMSWithTimelockConfig{
+ chainSelector: {
+ Canceller: config,
+ Bypasser: config,
+ Proposer: config,
+ TimelockMinDelay: big.NewInt(0),
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+ return env
+}
+
+// TestLinkTransferMCMS tests the LinkTransfer changeset by sending LINK from a timelock contract
+// to the deployer key via mcms proposal.
+func TestLinkTransferMCMS(t *testing.T) {
+ t.Parallel()
+ ctx := context.Background()
+
+ env := setupLinkTransferTestEnv(t)
+ chainSelector := env.AllChainSelectors()[0]
+ chain := env.Chains[chainSelector]
+ addrs, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ require.NoError(t, err)
+ require.Len(t, addrs, 6)
+
+ mcmsState, err := changeset.MaybeLoadMCMSWithTimelockChainState(chain, addrs)
+ require.NoError(t, err)
+ linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addrs)
+ require.NoError(t, err)
+ timelockAddress := mcmsState.Timelock.Address()
+
+ // Mint some funds
+ // grant minter permissions
+ tx, err := linkState.LinkToken.GrantMintRole(chain.DeployerKey, chain.DeployerKey.From)
+ require.NoError(t, err)
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ require.NoError(t, err)
+
+ tx, err = linkState.LinkToken.Mint(chain.DeployerKey, timelockAddress, big.NewInt(750))
+ require.NoError(t, err)
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ require.NoError(t, err)
+
+ timelocks := map[uint64]*proposalutils.TimelockExecutionContracts{
+ chainSelector: {
+ Timelock: mcmsState.Timelock,
+ CallProxy: mcmsState.CallProxy,
+ },
+ }
+ // Apply the changeset
+ _, err = changeset.ApplyChangesets(t, env, timelocks, []changeset.ChangesetApplication{
+ // the changeset produces proposals, ApplyChangesets will sign & execute them.
+ // in practice, signing and executing are separated processes.
+ {
+ Changeset: changeset.WrapChangeSet(example.LinkTransfer),
+ Config: &example.LinkTransferConfig{
+ From: timelockAddress,
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {
+ {
+ To: chain.DeployerKey.From,
+ Value: big.NewInt(500),
+ },
+ },
+ },
+ McmsConfig: &example.MCMSConfig{
+ MinDelay: 0,
+ OverrideRoot: true,
+ },
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // Check new balances
+ endBalance, err := linkState.LinkToken.BalanceOf(&bind.CallOpts{Context: ctx}, chain.DeployerKey.From)
+ require.NoError(t, err)
+ expectedBalance := big.NewInt(500)
+ require.Equal(t, expectedBalance, endBalance)
+
+ // check timelock balance
+ endBalance, err = linkState.LinkToken.BalanceOf(&bind.CallOpts{Context: ctx}, timelockAddress)
+ require.NoError(t, err)
+ expectedBalance = big.NewInt(250)
+ require.Equal(t, expectedBalance, endBalance)
+}
+
+// TestLinkTransfer tests the LinkTransfer changeset by sending LINK from a timelock contract to the deployer key.
+func TestLinkTransfer(t *testing.T) {
+ t.Parallel()
+ ctx := context.Background()
+
+ env := setupLinkTransferTestEnv(t)
+ chainSelector := env.AllChainSelectors()[0]
+ chain := env.Chains[chainSelector]
+ addrs, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ require.NoError(t, err)
+ require.Len(t, addrs, 6)
+
+ mcmsState, err := changeset.MaybeLoadMCMSWithTimelockChainState(chain, addrs)
+ require.NoError(t, err)
+ linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addrs)
+ require.NoError(t, err)
+ timelockAddress := mcmsState.Timelock.Address()
+
+ // Mint some funds
+ // grant minter permissions
+ tx, err := linkState.LinkToken.GrantMintRole(chain.DeployerKey, chain.DeployerKey.From)
+ require.NoError(t, err)
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ require.NoError(t, err)
+
+ tx, err = linkState.LinkToken.Mint(chain.DeployerKey, chain.DeployerKey.From, big.NewInt(750))
+ require.NoError(t, err)
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ require.NoError(t, err)
+
+ timelocks := map[uint64]*proposalutils.TimelockExecutionContracts{
+ chainSelector: {
+ Timelock: mcmsState.Timelock,
+ CallProxy: mcmsState.CallProxy,
+ },
+ }
+
+ // Apply the changeset
+ _, err = changeset.ApplyChangesets(t, env, timelocks, []changeset.ChangesetApplication{
+ // the changeset produces proposals, ApplyChangesets will sign & execute them.
+ // in practice, signing and executing are separated processes.
+ {
+ Changeset: changeset.WrapChangeSet(example.LinkTransfer),
+ Config: &example.LinkTransferConfig{
+ From: chain.DeployerKey.From,
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {
+ {
+ To: timelockAddress,
+ Value: big.NewInt(500),
+ },
+ },
+ },
+ // No MCMSConfig here means we'll execute the txs directly.
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // Check new balances
+ endBalance, err := linkState.LinkToken.BalanceOf(&bind.CallOpts{Context: ctx}, chain.DeployerKey.From)
+ require.NoError(t, err)
+ expectedBalance := big.NewInt(250)
+ require.Equal(t, expectedBalance, endBalance)
+
+ // check timelock balance
+ endBalance, err = linkState.LinkToken.BalanceOf(&bind.CallOpts{Context: ctx}, timelockAddress)
+ require.NoError(t, err)
+ expectedBalance = big.NewInt(500)
+ require.Equal(t, expectedBalance, endBalance)
+}
+
+func TestValidate(t *testing.T) {
+ env := setupLinkTransferTestEnv(t)
+ chainSelector := env.AllChainSelectors()[0]
+ chain := env.Chains[chainSelector]
+ addrs, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ require.NoError(t, err)
+ require.Len(t, addrs, 6)
+ mcmsState, err := changeset.MaybeLoadMCMSWithTimelockChainState(chain, addrs)
+ require.NoError(t, err)
+ linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addrs)
+ require.NoError(t, err)
+ tx, err := linkState.LinkToken.GrantMintRole(chain.DeployerKey, chain.DeployerKey.From)
+ require.NoError(t, err)
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ require.NoError(t, err)
+ tx, err = linkState.LinkToken.Mint(chain.DeployerKey, chain.DeployerKey.From, big.NewInt(750))
+ require.NoError(t, err)
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+
+ require.NoError(t, err)
+ tests := []struct {
+ name string
+ cfg example.LinkTransferConfig
+ errorMsg string
+ }{
+ {
+ name: "valid config",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {{To: mcmsState.Timelock.Address(), Value: big.NewInt(100)}}},
+ From: chain.DeployerKey.From,
+ McmsConfig: &example.MCMSConfig{
+ MinDelay: time.Hour,
+ },
+ },
+ },
+ {
+ name: "valid non mcms config",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {{To: mcmsState.Timelock.Address(), Value: big.NewInt(100)}}},
+ From: chain.DeployerKey.From,
+ },
+ },
+ {
+ name: "insufficient funds",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {
+ {To: chain.DeployerKey.From, Value: big.NewInt(100)},
+ {To: chain.DeployerKey.From, Value: big.NewInt(500)},
+ {To: chain.DeployerKey.From, Value: big.NewInt(1250)},
+ },
+ },
+ From: mcmsState.Timelock.Address(),
+ McmsConfig: &example.MCMSConfig{
+ MinDelay: time.Hour,
+ },
+ },
+ errorMsg: "sender does not have enough funds for transfers for chain selector 909606746561742123, required: 1850, available: 0",
+ },
+ {
+ name: "invalid config: empty transfers",
+ cfg: example.LinkTransferConfig{Transfers: map[uint64][]example.TransferConfig{}},
+ errorMsg: "transfers map must have at least one chainSel",
+ },
+ {
+ name: "invalid chain selector",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ 1: {{To: common.Address{}, Value: big.NewInt(100)}}},
+ },
+ errorMsg: "invalid chain selector: unknown chain selector 1",
+ },
+ {
+ name: "chain selector not found",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chain_selectors.ETHEREUM_TESTNET_GOERLI_ARBITRUM_1.Selector: {{To: common.Address{}, Value: big.NewInt(100)}}},
+ },
+ errorMsg: "chain with selector 6101244977088475029 not found",
+ },
+ {
+ name: "empty transfer list",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {},
+ },
+ },
+ errorMsg: "transfers for chainSel 909606746561742123 must have at least one LinkTransfer",
+ },
+ {
+ name: "empty value",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {
+ {To: chain.DeployerKey.From, Value: nil},
+ },
+ },
+ },
+ errorMsg: "value for transfers must be set",
+ },
+ {
+ name: "zero value",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {
+ {To: chain.DeployerKey.From, Value: big.NewInt(0)},
+ },
+ },
+ },
+ errorMsg: "value for transfers must be non-zero",
+ },
+ {
+ name: "negative value",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {
+ {To: chain.DeployerKey.From, Value: big.NewInt(-5)},
+ },
+ },
+ },
+ errorMsg: "value for transfers must be positive",
+ },
+ {
+ name: "non-evm-chain",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chain_selectors.APTOS_MAINNET.Selector: {{To: mcmsState.Timelock.Address(), Value: big.NewInt(100)}}},
+ From: chain.DeployerKey.From,
+ },
+ errorMsg: "chain selector 4741433654826277614 is not an EVM chain",
+ },
+ {
+ name: "delay greater than max allowed",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {{To: mcmsState.Timelock.Address(), Value: big.NewInt(100)}}},
+ From: chain.DeployerKey.From,
+ McmsConfig: &example.MCMSConfig{
+ MinDelay: time.Hour * 24 * 10,
+ },
+ },
+ errorMsg: "minDelay must be less than 7 days",
+ },
+ {
+ name: "invalid config: transfer to address missing",
+ cfg: example.LinkTransferConfig{
+ Transfers: map[uint64][]example.TransferConfig{
+ chainSelector: {{To: common.Address{}, Value: big.NewInt(100)}}},
+ },
+ errorMsg: "'to' address for transfers must be set",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ err := tt.cfg.Validate(env)
+ if tt.errorMsg != "" {
+ require.Error(t, err)
+ require.Contains(t, err.Error(), tt.errorMsg)
+ } else {
+ require.NoError(t, err)
+ }
+ })
+ }
+}
diff --git a/deployment/common/changeset/example/mint_link.go b/deployment/common/changeset/example/mint_link.go
new file mode 100644
index 00000000000..dc50f8a1a27
--- /dev/null
+++ b/deployment/common/changeset/example/mint_link.go
@@ -0,0 +1,43 @@
+package example
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/common"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+)
+
+type MintLinkConfig struct {
+ Amount *big.Int
+ ChainSelector uint64
+ To common.Address
+}
+
+var _ deployment.ChangeSet[*MintLinkConfig] = MintLink
+
+// MintLink mints LINK to the provided contract.
+func MintLink(e deployment.Environment, cfg *MintLinkConfig) (deployment.ChangesetOutput, error) {
+
+ chain := e.Chains[cfg.ChainSelector]
+ addresses, err := e.ExistingAddresses.AddressesForChain(cfg.ChainSelector)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addresses)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ tx, err := linkState.LinkToken.Mint(chain.DeployerKey, cfg.To, cfg.Amount)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ return deployment.ChangesetOutput{}, nil
+
+}
diff --git a/deployment/common/changeset/example/mint_link_test.go b/deployment/common/changeset/example/mint_link_test.go
new file mode 100644
index 00000000000..1c60c3221de
--- /dev/null
+++ b/deployment/common/changeset/example/mint_link_test.go
@@ -0,0 +1,58 @@
+package example_test
+
+import (
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/changeset/example"
+)
+
+// TestMintLink tests the MintLink changeset
+func TestMintLink(t *testing.T) {
+ t.Parallel()
+ env := setupLinkTransferTestEnv(t)
+ ctx := env.GetContext()
+ chainSelector := env.AllChainSelectors()[0]
+ chain := env.Chains[chainSelector]
+
+ addrs, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ require.NoError(t, err)
+ require.Len(t, addrs, 6)
+
+ mcmsState, err := changeset.MaybeLoadMCMSWithTimelockChainState(chain, addrs)
+ require.NoError(t, err)
+ linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addrs)
+ require.NoError(t, err)
+
+ _, err = changeset.ApplyChangesets(t, env, nil, []changeset.ChangesetApplication{
+ {
+ Changeset: changeset.WrapChangeSet(example.AddMintersBurnersLink),
+ Config: &example.AddMintersBurnersLinkConfig{
+ ChainSelector: chainSelector,
+ Minters: []common.Address{chain.DeployerKey.From},
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ timelockAddress := mcmsState.Timelock.Address()
+
+ // Mint some funds
+ _, err = example.MintLink(env, &example.MintLinkConfig{
+ ChainSelector: chainSelector,
+ To: timelockAddress,
+ Amount: big.NewInt(7568),
+ })
+ require.NoError(t, err)
+
+ // check timelock balance
+ endBalance, err := linkState.LinkToken.BalanceOf(&bind.CallOpts{Context: ctx}, timelockAddress)
+ require.NoError(t, err)
+ expectedBalance := big.NewInt(7568)
+ require.Equal(t, expectedBalance, endBalance)
+}
diff --git a/deployment/common/changeset/internal/mcms_test.go b/deployment/common/changeset/internal/mcms_test.go
index 10fb1d980de..92822422daa 100644
--- a/deployment/common/changeset/internal/mcms_test.go
+++ b/deployment/common/changeset/internal/mcms_test.go
@@ -2,7 +2,6 @@ package internal_test
import (
"encoding/json"
- "math/big"
"testing"
chainsel "github.com/smartcontractkit/chain-selectors"
@@ -11,6 +10,7 @@ import (
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/common/changeset"
"github.com/smartcontractkit/chainlink/deployment/common/changeset/internal"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/common/types"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
"github.com/smartcontractkit/chainlink/v2/core/logger"
@@ -18,34 +18,29 @@ import (
func TestDeployMCMSWithConfig(t *testing.T) {
lggr := logger.TestLogger(t)
- chains := memory.NewMemoryChainsWithChainIDs(t, []uint64{
+ chains, _ := memory.NewMemoryChainsWithChainIDs(t, []uint64{
chainsel.TEST_90000001.EvmChainID,
- })
+ }, 1)
ab := deployment.NewMemoryAddressBook()
_, err := internal.DeployMCMSWithConfig(types.ProposerManyChainMultisig,
- lggr, chains[chainsel.TEST_90000001.Selector], ab, changeset.SingleGroupMCMS(t))
+ lggr, chains[chainsel.TEST_90000001.Selector], ab, proposalutils.SingleGroupMCMS(t))
require.NoError(t, err)
}
func TestDeployMCMSWithTimelockContracts(t *testing.T) {
lggr := logger.TestLogger(t)
- chains := memory.NewMemoryChainsWithChainIDs(t, []uint64{
+ chains, _ := memory.NewMemoryChainsWithChainIDs(t, []uint64{
chainsel.TEST_90000001.EvmChainID,
- })
+ }, 1)
ab := deployment.NewMemoryAddressBook()
_, err := internal.DeployMCMSWithTimelockContracts(lggr,
chains[chainsel.TEST_90000001.Selector],
- ab, types.MCMSWithTimelockConfig{
- Canceller: changeset.SingleGroupMCMS(t),
- Bypasser: changeset.SingleGroupMCMS(t),
- Proposer: changeset.SingleGroupMCMS(t),
- TimelockMinDelay: big.NewInt(0),
- })
+ ab, proposalutils.SingleGroupTimelockConfig(t))
require.NoError(t, err)
addresses, err := ab.AddressesForChain(chainsel.TEST_90000001.Selector)
require.NoError(t, err)
require.Len(t, addresses, 5)
- mcmsState, err := changeset.MaybeLoadMCMSWithTimelockState(chains[chainsel.TEST_90000001.Selector], addresses)
+ mcmsState, err := changeset.MaybeLoadMCMSWithTimelockChainState(chains[chainsel.TEST_90000001.Selector], addresses)
require.NoError(t, err)
v, err := mcmsState.GenerateMCMSWithTimelockView()
b, err := json.MarshalIndent(v, "", " ")
diff --git a/deployment/common/changeset/set_config_mcms.go b/deployment/common/changeset/set_config_mcms.go
new file mode 100644
index 00000000000..3ba5d2db4b6
--- /dev/null
+++ b/deployment/common/changeset/set_config_mcms.go
@@ -0,0 +1,209 @@
+package changeset
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "math/big"
+ "time"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/config"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
+)
+
+type ConfigPerRole struct {
+ Proposer config.Config
+ Canceller config.Config
+ Bypasser config.Config
+}
+type TimelockConfig struct {
+ MinDelay time.Duration // delay for timelock worker to execute the transfers.
+}
+
+type MCMSConfig struct {
+ ConfigsPerChain map[uint64]ConfigPerRole
+ ProposalConfig *TimelockConfig
+}
+
+var _ deployment.ChangeSet[MCMSConfig] = SetConfigMCMS
+
+// Validate checks that the MCMSConfig is valid
+func (cfg MCMSConfig) Validate(e deployment.Environment, selectors []uint64) error {
+ if len(cfg.ConfigsPerChain) == 0 {
+ return errors.New("no chain configs provided")
+ }
+ // configs should have at least one chain
+ state, err := MaybeLoadMCMSWithTimelockState(e, selectors)
+ if err != nil {
+ return err
+ }
+ for chainSelector, c := range cfg.ConfigsPerChain {
+ family, err := chain_selectors.GetSelectorFamily(chainSelector)
+ if err != nil {
+ return err
+ }
+ if family != chain_selectors.FamilyEVM {
+ return fmt.Errorf("chain selector: %d is not an ethereum chain", chainSelector)
+ }
+ _, ok := e.Chains[chainSelector]
+ if !ok {
+ return fmt.Errorf("chain selector: %d not found in environment", chainSelector)
+ }
+ _, ok = state[chainSelector]
+ if !ok {
+ return fmt.Errorf("chain selector: %d not found for MCMS state", chainSelector)
+ }
+ if err := c.Proposer.Validate(); err != nil {
+ return err
+ }
+ if err := c.Canceller.Validate(); err != nil {
+ return err
+ }
+ if err := c.Bypasser.Validate(); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// setConfigOrTxData executes set config tx or gets the tx data for the MCMS proposal
+func setConfigOrTxData(ctx context.Context, lggr logger.Logger, chain deployment.Chain, cfg config.Config, contract *gethwrappers.ManyChainMultiSig, useMCMS bool) (*types.Transaction, error) {
+ groupQuorums, groupParents, signerAddresses, signerGroups := cfg.ExtractSetConfigInputs()
+ opts := deployment.SimTransactOpts()
+ if !useMCMS {
+ opts = chain.DeployerKey
+ }
+ opts.Context = ctx
+ tx, err := contract.SetConfig(opts, signerAddresses, signerGroups, groupQuorums, groupParents, false)
+ if err != nil {
+ return nil, err
+ }
+ if !useMCMS {
+ _, err = deployment.ConfirmIfNoError(chain, tx, err)
+ if err != nil {
+ return nil, err
+ }
+ lggr.Infow("SetConfigMCMS tx confirmed", "txHash", tx.Hash().Hex())
+ }
+ return tx, nil
+}
+
+type setConfigTxs struct {
+ proposerTx *types.Transaction
+ cancellerTx *types.Transaction
+ bypasserTx *types.Transaction
+}
+
+// setConfigPerRole sets the configuration for each of the MCMS contract roles on the mcmsState.
+func setConfigPerRole(ctx context.Context, lggr logger.Logger, chain deployment.Chain, cfg ConfigPerRole, mcmsState *MCMSWithTimelockState, useMCMS bool) (setConfigTxs, error) {
+ // Proposer set config
+ proposerTx, err := setConfigOrTxData(ctx, lggr, chain, cfg.Proposer, mcmsState.ProposerMcm, useMCMS)
+ if err != nil {
+ return setConfigTxs{}, err
+ }
+ // Canceller set config
+ cancellerTx, err := setConfigOrTxData(ctx, lggr, chain, cfg.Canceller, mcmsState.CancellerMcm, useMCMS)
+ if err != nil {
+ return setConfigTxs{}, err
+ }
+ // Bypasser set config
+ bypasserTx, err := setConfigOrTxData(ctx, lggr, chain, cfg.Bypasser, mcmsState.BypasserMcm, useMCMS)
+ if err != nil {
+ return setConfigTxs{}, err
+ }
+
+ return setConfigTxs{
+ proposerTx: proposerTx,
+ cancellerTx: cancellerTx,
+ bypasserTx: bypasserTx,
+ }, nil
+}
+
+func addTxsToProposalBatch(setConfigTxsChain setConfigTxs, chainSelector uint64, state MCMSWithTimelockState) timelock.BatchChainOperation {
+ result := timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(chainSelector),
+ Batch: []mcms.Operation{},
+ }
+ result.Batch = append(result.Batch, mcms.Operation{
+ To: state.ProposerMcm.Address(),
+ Data: setConfigTxsChain.proposerTx.Data(),
+ Value: big.NewInt(0),
+ ContractType: string(commontypes.ProposerManyChainMultisig),
+ })
+ result.Batch = append(result.Batch, mcms.Operation{
+ To: state.CancellerMcm.Address(),
+ Data: setConfigTxsChain.cancellerTx.Data(),
+ Value: big.NewInt(0),
+ ContractType: string(commontypes.CancellerManyChainMultisig),
+ })
+ result.Batch = append(result.Batch, mcms.Operation{
+ To: state.BypasserMcm.Address(),
+ Data: setConfigTxsChain.bypasserTx.Data(),
+ Value: big.NewInt(0),
+ ContractType: string(commontypes.BypasserManyChainMultisig),
+ })
+ return result
+}
+
+// SetConfigMCMS sets the configuration of the MCMS contract on the chain identified by the chainSelector.
+func SetConfigMCMS(e deployment.Environment, cfg MCMSConfig) (deployment.ChangesetOutput, error) {
+ selectors := []uint64{}
+ lggr := e.Logger
+ ctx := e.GetContext()
+ for chainSelector := range cfg.ConfigsPerChain {
+ selectors = append(selectors, chainSelector)
+ }
+ useMCMS := cfg.ProposalConfig != nil
+ err := cfg.Validate(e, selectors)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ batches := []timelock.BatchChainOperation{}
+ timelocksPerChain := map[uint64]common.Address{}
+ proposerMcmsPerChain := map[uint64]*gethwrappers.ManyChainMultiSig{}
+
+ mcmsStatePerChain, err := MaybeLoadMCMSWithTimelockState(e, selectors)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ for chainSelector, c := range cfg.ConfigsPerChain {
+ chain := e.Chains[chainSelector]
+ state := mcmsStatePerChain[chainSelector]
+ timelocksPerChain[chainSelector] = state.Timelock.Address()
+ proposerMcmsPerChain[chainSelector] = state.ProposerMcm
+ setConfigTxsChain, err := setConfigPerRole(ctx, lggr, chain, c, state, useMCMS)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if useMCMS {
+ batch := addTxsToProposalBatch(setConfigTxsChain, chainSelector, *state)
+ batches = append(batches, batch)
+ }
+
+ }
+
+ if useMCMS {
+ // Create MCMS with timelock proposal
+ proposal, err := proposalutils.BuildProposalFromBatches(timelocksPerChain, proposerMcmsPerChain, batches, "Set config proposal", cfg.ProposalConfig.MinDelay)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal from batch: %w", err)
+ }
+ lggr.Infow("SetConfigMCMS proposal created", "proposal", proposal)
+ return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{*proposal}}, nil
+ }
+
+ return deployment.ChangesetOutput{}, nil
+}
diff --git a/deployment/common/changeset/set_config_mcms_test.go b/deployment/common/changeset/set_config_mcms_test.go
new file mode 100644
index 00000000000..7220bdd755a
--- /dev/null
+++ b/deployment/common/changeset/set_config_mcms_test.go
@@ -0,0 +1,313 @@
+package changeset_test
+
+import (
+ "testing"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/config"
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
+ commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+
+ "github.com/stretchr/testify/require"
+ "go.uber.org/zap/zapcore"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+
+ "github.com/smartcontractkit/chainlink/deployment/common/types"
+ "github.com/smartcontractkit/chainlink/deployment/environment/memory"
+)
+
+// setupSetConfigTestEnv deploys all required contracts for the setConfig MCMS contract call.
+func setupSetConfigTestEnv(t *testing.T) deployment.Environment {
+
+ lggr := logger.TestLogger(t)
+ cfg := memory.MemoryEnvironmentConfig{
+ Nodes: 1,
+ Chains: 2,
+ }
+ env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg)
+ chainSelector := env.AllChainSelectors()[0]
+
+ config := proposalutils.SingleGroupTimelockConfig(t)
+ // Deploy MCMS and Timelock
+ env, err := commonchangeset.ApplyChangesets(t, env, nil, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken),
+ Config: []uint64{chainSelector},
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock),
+ Config: map[uint64]types.MCMSWithTimelockConfig{
+ chainSelector: config,
+ },
+ },
+ })
+ require.NoError(t, err)
+ return env
+}
+
+// TestSetConfigMCMSVariants tests the SetConfigMCMS changeset variants.
+func TestSetConfigMCMSVariants(t *testing.T) {
+
+ // Add the timelock as a signer to check state changes
+ for _, tc := range []struct {
+ name string
+ changeSets func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication
+ }{
+ {
+ name: "MCMS disabled",
+ changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication {
+
+ return []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.SetConfigMCMS),
+ Config: commonchangeset.MCMSConfig{
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ chainSel: {
+ Proposer: cfgProp,
+ Canceller: cfgCancel,
+ Bypasser: cfgBypass,
+ },
+ },
+ },
+ },
+ }
+ },
+ },
+ {
+ name: "MCMS enabled",
+ changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication {
+ return []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock),
+ Config: commonchangeset.TransferToMCMSWithTimelockConfig{
+ ContractsByChain: map[uint64][]common.Address{
+ chainSel: {mcmsState.ProposerMcm.Address(), mcmsState.BypasserMcm.Address(), mcmsState.CancellerMcm.Address()},
+ },
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.SetConfigMCMS),
+ Config: commonchangeset.MCMSConfig{
+ ProposalConfig: &commonchangeset.TimelockConfig{
+ MinDelay: 0,
+ },
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ chainSel: {
+ Proposer: cfgProp,
+ Canceller: cfgCancel,
+ Bypasser: cfgBypass,
+ },
+ },
+ },
+ },
+ }
+ },
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ ctx := tests.Context(t)
+
+ env := setupSetConfigTestEnv(t)
+ chainSelector := env.AllChainSelectors()[0]
+ chain := env.Chains[chainSelector]
+ addrs, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ require.NoError(t, err)
+ require.Len(t, addrs, 6)
+
+ mcmsState, err := commonchangeset.MaybeLoadMCMSWithTimelockChainState(chain, addrs)
+ require.NoError(t, err)
+ timelockAddress := mcmsState.Timelock.Address()
+ cfgProposer := proposalutils.SingleGroupMCMS(t)
+ cfgProposer.Signers = append(cfgProposer.Signers, timelockAddress)
+ cfgProposer.Quorum = 2 // quorum should change to 2 out of 2 signers
+ timelockMap := map[uint64]*proposalutils.TimelockExecutionContracts{
+ chainSelector: {
+ Timelock: mcmsState.Timelock,
+ CallProxy: mcmsState.CallProxy,
+ },
+ }
+ cfgCanceller := proposalutils.SingleGroupMCMS(t)
+ cfgBypasser := proposalutils.SingleGroupMCMS(t)
+ cfgBypasser.Signers = append(cfgBypasser.Signers, timelockAddress)
+ cfgBypasser.Signers = append(cfgBypasser.Signers, mcmsState.ProposerMcm.Address())
+ cfgBypasser.Quorum = 3 // quorum should change to 3 out of 3 signers
+
+ // Set config on all 3 MCMS contracts
+ changesetsToApply := tc.changeSets(mcmsState, chainSelector, cfgProposer, cfgCanceller, cfgBypasser)
+ _, err = commonchangeset.ApplyChangesets(t, env, timelockMap, changesetsToApply)
+ require.NoError(t, err)
+
+ // Check new State
+ expected := cfgProposer.ToRawConfig()
+ opts := &bind.CallOpts{Context: ctx}
+ newConf, err := mcmsState.ProposerMcm.GetConfig(opts)
+ require.NoError(t, err)
+ require.Equal(t, expected, newConf)
+
+ expected = cfgBypasser.ToRawConfig()
+ newConf, err = mcmsState.BypasserMcm.GetConfig(opts)
+ require.NoError(t, err)
+ require.Equal(t, expected, newConf)
+
+ expected = cfgCanceller.ToRawConfig()
+ newConf, err = mcmsState.CancellerMcm.GetConfig(opts)
+ require.NoError(t, err)
+ require.Equal(t, expected, newConf)
+ })
+ }
+}
+
+func TestValidate(t *testing.T) {
+ env := setupSetConfigTestEnv(t)
+
+ chainSelector := env.AllChainSelectors()[0]
+ chain := env.Chains[chainSelector]
+ addrs, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ require.NoError(t, err)
+ require.Len(t, addrs, 6)
+ mcmsState, err := commonchangeset.MaybeLoadMCMSWithTimelockChainState(chain, addrs)
+ require.NoError(t, err)
+ cfg := proposalutils.SingleGroupMCMS(t)
+ timelockAddress := mcmsState.Timelock.Address()
+ // Add the timelock as a signer to check state changes
+ cfg.Signers = append(cfg.Signers, timelockAddress)
+ cfg.Quorum = 2 // quorum
+
+ cfgInvalid := proposalutils.SingleGroupMCMS(t)
+ cfgInvalid.Quorum = 0
+ require.NoError(t, err)
+ tests := []struct {
+ name string
+ cfg commonchangeset.MCMSConfig
+ errorMsg string
+ }{
+ {
+ name: "valid config",
+ cfg: commonchangeset.MCMSConfig{
+ ProposalConfig: &commonchangeset.TimelockConfig{
+ MinDelay: 0,
+ },
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ chainSelector: {
+ Proposer: cfg,
+ Canceller: cfg,
+ Bypasser: cfg,
+ },
+ },
+ },
+ },
+ {
+ name: "valid non mcms config",
+ cfg: commonchangeset.MCMSConfig{
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ chainSelector: {
+ Proposer: cfg,
+ Canceller: cfg,
+ Bypasser: cfg,
+ },
+ },
+ },
+ },
+ {
+ name: "no chain configurations",
+ cfg: commonchangeset.MCMSConfig{
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{},
+ },
+ errorMsg: "no chain configs provided",
+ },
+ {
+ name: "non evm chain",
+ cfg: commonchangeset.MCMSConfig{
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ chain_selectors.APTOS_MAINNET.Selector: {
+ Proposer: cfg,
+ Canceller: cfg,
+ Bypasser: cfg,
+ },
+ },
+ },
+ errorMsg: "chain selector: 4741433654826277614 is not an ethereum chain",
+ },
+ {
+ name: "chain selector not found in environment",
+ cfg: commonchangeset.MCMSConfig{
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ 123: {
+ Proposer: cfg,
+ Canceller: cfg,
+ Bypasser: cfg,
+ },
+ },
+ },
+ errorMsg: "unknown chain selector 123",
+ },
+ {
+ name: "invalid proposer config",
+ cfg: commonchangeset.MCMSConfig{
+ ProposalConfig: &commonchangeset.TimelockConfig{
+ MinDelay: 0,
+ },
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ chainSelector: {
+ Proposer: cfgInvalid,
+ Canceller: cfg,
+ Bypasser: cfg,
+ },
+ },
+ },
+ errorMsg: "invalid MCMS config: Quorum must be greater than 0",
+ },
+ {
+ name: "invalid canceller config",
+ cfg: commonchangeset.MCMSConfig{
+ ProposalConfig: &commonchangeset.TimelockConfig{
+ MinDelay: 0,
+ },
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ chainSelector: {
+ Proposer: cfg,
+ Canceller: cfgInvalid,
+ Bypasser: cfg,
+ },
+ },
+ },
+ errorMsg: "invalid MCMS config: Quorum must be greater than 0",
+ },
+ {
+ name: "invalid bypasser config",
+ cfg: commonchangeset.MCMSConfig{
+ ProposalConfig: &commonchangeset.TimelockConfig{
+ MinDelay: 0,
+ },
+ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{
+ chainSelector: {
+ Proposer: cfg,
+ Canceller: cfg,
+ Bypasser: cfgInvalid,
+ },
+ },
+ },
+ errorMsg: "invalid MCMS config: Quorum must be greater than 0",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ selectors := []uint64{chainSelector}
+
+ err := tt.cfg.Validate(env, selectors)
+ if tt.errorMsg != "" {
+ require.Error(t, err)
+ require.Contains(t, err.Error(), tt.errorMsg)
+ } else {
+ require.NoError(t, err)
+ }
+ })
+ }
+}
diff --git a/deployment/common/changeset/state.go b/deployment/common/changeset/state.go
index a580c13b40b..0db34abad71 100644
--- a/deployment/common/changeset/state.go
+++ b/deployment/common/changeset/state.go
@@ -8,6 +8,7 @@ import (
owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
"github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/common/types"
"github.com/smartcontractkit/chainlink/deployment/common/view/v1_0"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface"
@@ -19,32 +20,7 @@ import (
// It is public for use in product specific packages.
// Either all fields are nil or all fields are non-nil.
type MCMSWithTimelockState struct {
- CancellerMcm *owner_helpers.ManyChainMultiSig
- BypasserMcm *owner_helpers.ManyChainMultiSig
- ProposerMcm *owner_helpers.ManyChainMultiSig
- Timelock *owner_helpers.RBACTimelock
- CallProxy *owner_helpers.CallProxy
-}
-
-// Validate checks that all fields are non-nil, ensuring it's ready
-// for use generating views or interactions.
-func (state MCMSWithTimelockState) Validate() error {
- if state.Timelock == nil {
- return errors.New("timelock not found")
- }
- if state.CancellerMcm == nil {
- return errors.New("canceller not found")
- }
- if state.ProposerMcm == nil {
- return errors.New("proposer not found")
- }
- if state.BypasserMcm == nil {
- return errors.New("bypasser not found")
- }
- if state.CallProxy == nil {
- return errors.New("call proxy not found")
- }
- return nil
+ *proposalutils.MCMSWithTimelockContracts
}
func (state MCMSWithTimelockState) GenerateMCMSWithTimelockView() (v1_0.MCMSWithTimelockView, error) {
@@ -80,15 +56,38 @@ func (state MCMSWithTimelockState) GenerateMCMSWithTimelockView() (v1_0.MCMSWith
}, nil
}
-// MaybeLoadMCMSWithTimelockState looks for the addresses corresponding to
+// MaybeLoadMCMSWithTimelockState loads the MCMSWithTimelockState state for each chain in the given environment.
+func MaybeLoadMCMSWithTimelockState(env deployment.Environment, chainSelectors []uint64) (map[uint64]*MCMSWithTimelockState, error) {
+ result := map[uint64]*MCMSWithTimelockState{}
+ for _, chainSelector := range chainSelectors {
+ chain, ok := env.Chains[chainSelector]
+ if !ok {
+ return nil, fmt.Errorf("chain %d not found", chainSelector)
+ }
+ addressesChain, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ if err != nil {
+ return nil, err
+ }
+ state, err := MaybeLoadMCMSWithTimelockChainState(chain, addressesChain)
+ if err != nil {
+ return nil, err
+ }
+ result[chainSelector] = state
+ }
+ return result, nil
+}
+
+// MaybeLoadMCMSWithTimelockChainState looks for the addresses corresponding to
// contracts deployed with DeployMCMSWithTimelock and loads them into a
// MCMSWithTimelockState struct. If none of the contracts are found, the state struct will be nil.
// An error indicates:
// - Found but was unable to load a contract
// - It only found part of the bundle of contracts
// - If found more than one instance of a contract (we expect one bundle in the given addresses)
-func MaybeLoadMCMSWithTimelockState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*MCMSWithTimelockState, error) {
- state := MCMSWithTimelockState{}
+func MaybeLoadMCMSWithTimelockChainState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*MCMSWithTimelockState, error) {
+ state := MCMSWithTimelockState{
+ MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{},
+ }
// We expect one of each contract on the chain.
timelock := deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0)
callProxy := deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0)
@@ -153,7 +152,28 @@ func (s LinkTokenState) GenerateLinkView() (v1_0.LinkTokenView, error) {
return v1_0.GenerateLinkTokenView(s.LinkToken)
}
-func MaybeLoadLinkTokenState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*LinkTokenState, error) {
+// MaybeLoadLinkTokenState loads the LinkTokenState state for each chain in the given environment.
+func MaybeLoadLinkTokenState(env deployment.Environment, chainSelectors []uint64) (map[uint64]*LinkTokenState, error) {
+ result := map[uint64]*LinkTokenState{}
+ for _, chainSelector := range chainSelectors {
+ chain, ok := env.Chains[chainSelector]
+ if !ok {
+ return nil, fmt.Errorf("chain %d not found", chainSelector)
+ }
+ addressesChain, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ if err != nil {
+ return nil, err
+ }
+ state, err := MaybeLoadLinkTokenChainState(chain, addressesChain)
+ if err != nil {
+ return nil, err
+ }
+ result[chainSelector] = state
+ }
+ return result, nil
+}
+
+func MaybeLoadLinkTokenChainState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*LinkTokenState, error) {
state := LinkTokenState{}
linkToken := deployment.NewTypeAndVersion(types.LinkToken, deployment.Version1_0_0)
// Perhaps revisit if we have a use case for multiple.
diff --git a/deployment/common/changeset/test_helpers.go b/deployment/common/changeset/test_helpers.go
index 8fce5ea79f2..e92b36e5b55 100644
--- a/deployment/common/changeset/test_helpers.go
+++ b/deployment/common/changeset/test_helpers.go
@@ -9,6 +9,7 @@ import (
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
"github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
)
type ChangesetApplication struct {
@@ -32,7 +33,7 @@ func WrapChangeSet[C any](fn deployment.ChangeSet[C]) func(e deployment.Environm
}
// ApplyChangesets applies the changeset applications to the environment and returns the updated environment.
-func ApplyChangesets(t *testing.T, e deployment.Environment, timelockContractsPerChain map[uint64]*TimelockExecutionContracts, changesetApplications []ChangesetApplication) (deployment.Environment, error) {
+func ApplyChangesets(t *testing.T, e deployment.Environment, timelockContractsPerChain map[uint64]*proposalutils.TimelockExecutionContracts, changesetApplications []ChangesetApplication) (deployment.Environment, error) {
currentEnv := e
for i, csa := range changesetApplications {
out, err := csa.Changeset(currentEnv, csa.Config)
@@ -72,14 +73,14 @@ func ApplyChangesets(t *testing.T, e deployment.Environment, timelockContractsPe
chains.Add(uint64(op.ChainIdentifier))
}
- signed := SignProposal(t, e, &prop)
+ signed := proposalutils.SignProposal(t, e, &prop)
for _, sel := range chains.ToSlice() {
timelockContracts, ok := timelockContractsPerChain[sel]
if !ok || timelockContracts == nil {
return deployment.Environment{}, fmt.Errorf("timelock contracts not found for chain %d", sel)
}
- ExecuteProposal(t, e, signed, timelockContracts, sel)
+ proposalutils.ExecuteProposal(t, e, signed, timelockContracts, sel)
}
}
}
@@ -91,6 +92,7 @@ func ApplyChangesets(t *testing.T, e deployment.Environment, timelockContractsPe
NodeIDs: e.NodeIDs,
Offchain: e.Offchain,
OCRSecrets: e.OCRSecrets,
+ GetContext: e.GetContext,
}
}
return currentEnv, nil
diff --git a/deployment/common/changeset/transfer_to_mcms_with_timelock.go b/deployment/common/changeset/transfer_to_mcms_with_timelock.go
index e48d29af92b..45efccefd2e 100644
--- a/deployment/common/changeset/transfer_to_mcms_with_timelock.go
+++ b/deployment/common/changeset/transfer_to_mcms_with_timelock.go
@@ -1,6 +1,7 @@
package changeset
import (
+ "encoding/binary"
"fmt"
"math/big"
"time"
@@ -142,3 +143,132 @@ func TransferToMCMSWithTimelock(
return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{*proposal}}, nil
}
+
+var _ deployment.ChangeSet[TransferToDeployerConfig] = TransferToDeployer
+
+type TransferToDeployerConfig struct {
+ ContractAddress common.Address
+ ChainSel uint64
+}
+
+// TransferToDeployer relies on the deployer key
+// still being a timelock admin and transfers the ownership of a contract
+// back to the deployer key. It's effectively the rollback function of transferring
+// to the timelock.
+func TransferToDeployer(e deployment.Environment, cfg TransferToDeployerConfig) (deployment.ChangesetOutput, error) {
+ owner, ownable, err := LoadOwnableContract(cfg.ContractAddress, e.Chains[cfg.ChainSel].Client)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ if owner == e.Chains[cfg.ChainSel].DeployerKey.From {
+ e.Logger.Infof("Contract %s already owned by deployer", cfg.ContractAddress)
+ return deployment.ChangesetOutput{}, nil
+ }
+ tx, err := ownable.TransferOwnership(deployment.SimTransactOpts(), e.Chains[cfg.ChainSel].DeployerKey.From)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ addrs, err := e.ExistingAddresses.AddressesForChain(cfg.ChainSel)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ tls, err := MaybeLoadMCMSWithTimelockChainState(e.Chains[cfg.ChainSel], addrs)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ calls := []owner_helpers.RBACTimelockCall{
+ {
+ Target: ownable.Address(),
+ Data: tx.Data(),
+ Value: big.NewInt(0),
+ },
+ }
+ var salt [32]byte
+ binary.BigEndian.PutUint32(salt[:], uint32(time.Now().Unix()))
+ tx, err = tls.Timelock.ScheduleBatch(e.Chains[cfg.ChainSel].DeployerKey, calls, [32]byte{}, salt, big.NewInt(0))
+ if _, err = deployment.ConfirmIfNoError(e.Chains[cfg.ChainSel], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("scheduled transfer ownership batch with tx %s", tx.Hash().Hex())
+ timelockExecutorProxy, err := owner_helpers.NewRBACTimelock(tls.CallProxy.Address(), e.Chains[cfg.ChainSel].Client)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("error creating timelock executor proxy: %w", err)
+ }
+ tx, err = timelockExecutorProxy.ExecuteBatch(
+ e.Chains[cfg.ChainSel].DeployerKey, calls, [32]byte{}, salt)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("error executing batch: %w", err)
+ }
+ if _, err = deployment.ConfirmIfNoError(e.Chains[cfg.ChainSel], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("executed transfer ownership to deployer key with tx %s", tx.Hash().Hex())
+
+ tx, err = ownable.AcceptOwnership(e.Chains[cfg.ChainSel].DeployerKey)
+ if _, err = deployment.ConfirmIfNoError(e.Chains[cfg.ChainSel], tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("deployer key accepted ownership tx %s", tx.Hash().Hex())
+ return deployment.ChangesetOutput{}, nil
+}
+
+var _ deployment.ChangeSet[RenounceTimelockDeployerConfig] = RenounceTimelockDeployer
+
+type RenounceTimelockDeployerConfig struct {
+ ChainSel uint64
+}
+
+func (cfg RenounceTimelockDeployerConfig) Validate(e deployment.Environment) error {
+ if err := deployment.IsValidChainSelector(cfg.ChainSel); err != nil {
+ return fmt.Errorf("invalid chain selector: %w", err)
+ }
+
+ _, ok := e.Chains[cfg.ChainSel]
+ if !ok {
+ return fmt.Errorf("chain selector: %d not found in environment", cfg.ChainSel)
+ }
+
+ // MCMS should already exists
+ state, err := MaybeLoadMCMSWithTimelockState(e, []uint64{cfg.ChainSel})
+ if err != nil {
+ return err
+ }
+
+ contract, ok := state[cfg.ChainSel]
+ if !ok {
+ return fmt.Errorf("mcms contracts not found on chain %d", cfg.ChainSel)
+ }
+ if contract.Timelock == nil {
+ return fmt.Errorf("timelock not found on chain %d", cfg.ChainSel)
+ }
+
+ return nil
+}
+
+// RenounceTimelockDeployer revokes the deployer key from administering the contract.
+func RenounceTimelockDeployer(e deployment.Environment, cfg RenounceTimelockDeployerConfig) (deployment.ChangesetOutput, error) {
+ if err := cfg.Validate(e); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ contracts, err := MaybeLoadMCMSWithTimelockState(e, []uint64{cfg.ChainSel})
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ tl := contracts[cfg.ChainSel].Timelock
+ admin, err := tl.ADMINROLE(&bind.CallOpts{Context: e.GetContext()})
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to get admin role: %w", err)
+ }
+
+ chain := e.Chains[cfg.ChainSel]
+ tx, err := tl.RenounceRole(chain.DeployerKey, admin, chain.DeployerKey.From)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to revoke deployer key: %w", err)
+ }
+ if _, err := deployment.ConfirmIfNoError(chain, tx, err); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+ e.Logger.Infof("revoked deployer key from owning contract %s", tl.Address().Hex())
+ return deployment.ChangesetOutput{}, nil
+}
diff --git a/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go b/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go
index 6c68924b35e..c8c0f462811 100644
--- a/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go
+++ b/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go
@@ -1,13 +1,16 @@
package changeset
import (
+ "math/big"
"testing"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
"github.com/stretchr/testify/require"
- "math/big"
-
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/common/types"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
"github.com/smartcontractkit/chainlink/v2/core/logger"
@@ -28,23 +31,18 @@ func TestTransferToMCMSWithTimelock(t *testing.T) {
{
Changeset: WrapChangeSet(DeployMCMSWithTimelock),
Config: map[uint64]types.MCMSWithTimelockConfig{
- chain1: {
- Canceller: SingleGroupMCMS(t),
- Bypasser: SingleGroupMCMS(t),
- Proposer: SingleGroupMCMS(t),
- TimelockMinDelay: big.NewInt(0),
- },
+ chain1: proposalutils.SingleGroupTimelockConfig(t),
},
},
})
require.NoError(t, err)
addrs, err := e.ExistingAddresses.AddressesForChain(chain1)
require.NoError(t, err)
- state, err := MaybeLoadMCMSWithTimelockState(e.Chains[chain1], addrs)
+ state, err := MaybeLoadMCMSWithTimelockChainState(e.Chains[chain1], addrs)
require.NoError(t, err)
- link, err := MaybeLoadLinkTokenState(e.Chains[chain1], addrs)
+ link, err := MaybeLoadLinkTokenChainState(e.Chains[chain1], addrs)
require.NoError(t, err)
- e, err = ApplyChangesets(t, e, map[uint64]*TimelockExecutionContracts{
+ e, err = ApplyChangesets(t, e, map[uint64]*proposalutils.TimelockExecutionContracts{
chain1: {
Timelock: state.Timelock,
CallProxy: state.CallProxy,
@@ -62,9 +60,156 @@ func TestTransferToMCMSWithTimelock(t *testing.T) {
})
require.NoError(t, err)
// We expect now that the link token is owned by the MCMS timelock.
- link, err = MaybeLoadLinkTokenState(e.Chains[chain1], addrs)
+ link, err = MaybeLoadLinkTokenChainState(e.Chains[chain1], addrs)
require.NoError(t, err)
o, err := link.LinkToken.Owner(nil)
require.NoError(t, err)
require.Equal(t, state.Timelock.Address(), o)
+
+ // Try a rollback to the deployer.
+ e, err = ApplyChangesets(t, e, nil, []ChangesetApplication{
+ {
+ Changeset: WrapChangeSet(TransferToDeployer),
+ Config: TransferToDeployerConfig{
+ ContractAddress: link.LinkToken.Address(),
+ ChainSel: chain1,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ o, err = link.LinkToken.Owner(nil)
+ require.NoError(t, err)
+ require.Equal(t, e.Chains[chain1].DeployerKey.From, o)
+}
+
+func TestRenounceTimelockDeployerConfigValidate(t *testing.T) {
+ t.Parallel()
+ lggr := logger.TestLogger(t)
+ e := memory.NewMemoryEnvironment(t, lggr, 0, memory.MemoryEnvironmentConfig{
+ Chains: 1,
+ Nodes: 1,
+ })
+ chain1 := e.AllChainSelectors()[0]
+ e, err := ApplyChangesets(t, e, nil, []ChangesetApplication{
+ {
+ Changeset: WrapChangeSet(DeployMCMSWithTimelock),
+ Config: map[uint64]types.MCMSWithTimelockConfig{
+ chain1: proposalutils.SingleGroupTimelockConfig(t),
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ envWithNoMCMS := memory.NewMemoryEnvironment(t, lggr, 0, memory.MemoryEnvironmentConfig{
+ Chains: 1,
+ Nodes: 1,
+ })
+ chain2 := envWithNoMCMS.AllChainSelectors()[0]
+
+ for _, test := range []struct {
+ name string
+ config RenounceTimelockDeployerConfig
+ env deployment.Environment
+ err string
+ }{
+ {
+ name: "valid config",
+ env: e,
+ config: RenounceTimelockDeployerConfig{
+ ChainSel: chain1,
+ },
+ },
+ {
+ name: "invalid chain selector",
+ env: e,
+ config: RenounceTimelockDeployerConfig{
+ ChainSel: 0,
+ },
+ err: "invalid chain selector: chain selector must be set",
+ },
+ {
+ name: "chain does not exists on env",
+ env: e,
+ config: RenounceTimelockDeployerConfig{
+ ChainSel: chain_selectors.ETHEREUM_TESTNET_SEPOLIA.Selector,
+ },
+ err: "chain selector: 16015286601757825753 not found in environment",
+ },
+ {
+ name: "no MCMS deployed",
+ env: envWithNoMCMS,
+ config: RenounceTimelockDeployerConfig{
+ ChainSel: chain2,
+ },
+ // chain does not match any existing addresses
+ err: "chain selector 909606746561742123: chain not found",
+ },
+ } {
+ t.Run(test.name, func(t *testing.T) {
+ t.Parallel()
+ err := test.config.Validate(test.env)
+ if test.err != "" {
+ require.EqualError(t, err, test.err)
+ } else {
+ require.NoError(t, err)
+ }
+ })
+ }
+}
+
+func TestRenounceTimelockDeployer(t *testing.T) {
+ lggr := logger.TestLogger(t)
+ e := memory.NewMemoryEnvironment(t, lggr, 0, memory.MemoryEnvironmentConfig{
+ Chains: 1,
+ Nodes: 1,
+ })
+ chain1 := e.AllChainSelectors()[0]
+ e, err := ApplyChangesets(t, e, nil, []ChangesetApplication{
+ {
+ Changeset: WrapChangeSet(DeployMCMSWithTimelock),
+ Config: map[uint64]types.MCMSWithTimelockConfig{
+ chain1: proposalutils.SingleGroupTimelockConfig(t),
+ },
+ },
+ })
+ require.NoError(t, err)
+ addrs, err := e.ExistingAddresses.AddressesForChain(chain1)
+ require.NoError(t, err)
+
+ state, err := MaybeLoadMCMSWithTimelockChainState(e.Chains[chain1], addrs)
+ require.NoError(t, err)
+
+ tl := state.Timelock
+ require.NotNil(t, tl)
+
+ adminRole, err := tl.ADMINROLE(nil)
+ require.NoError(t, err)
+
+ r, err := tl.GetRoleMemberCount(&bind.CallOpts{}, adminRole)
+ require.NoError(t, err)
+ require.Equal(t, int64(2), r.Int64())
+
+ // Revoke Deployer
+ e, err = ApplyChangesets(t, e, nil, []ChangesetApplication{
+ {
+ Changeset: WrapChangeSet(RenounceTimelockDeployer),
+ Config: RenounceTimelockDeployerConfig{
+ ChainSel: chain1,
+ },
+ },
+ })
+ require.NoError(t, err)
+
+ // Check that the deployer is no longer an admin
+ r, err = tl.GetRoleMemberCount(&bind.CallOpts{}, adminRole)
+ require.NoError(t, err)
+ require.Equal(t, int64(1), r.Int64())
+
+ // Retrieve the admin address
+ admin, err := tl.GetRoleMember(&bind.CallOpts{}, adminRole, big.NewInt(0))
+ require.NoError(t, err)
+
+ // Check that the admin is the timelock
+ require.Equal(t, tl.Address(), admin)
}
diff --git a/deployment/common/proposalutils/mcms_helpers.go b/deployment/common/proposalutils/mcms_helpers.go
new file mode 100644
index 00000000000..51a720a4389
--- /dev/null
+++ b/deployment/common/proposalutils/mcms_helpers.go
@@ -0,0 +1,275 @@
+package proposalutils
+
+import (
+ "bytes"
+ "encoding/json"
+ "errors"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/types"
+)
+
+// TimelockExecutionContracts is a helper struct for executing timelock proposals. it contains
+// the timelock and call proxy contracts.
+type TimelockExecutionContracts struct {
+ Timelock *owner_helpers.RBACTimelock
+ CallProxy *owner_helpers.CallProxy
+}
+
+// NewTimelockExecutionContracts creates a new TimelockExecutionContracts struct.
+// If there are multiple timelocks or call proxy on the chain, an error is returned.
+// If there is a missing timelocks or call proxy on the chain, an error is returned.
+func NewTimelockExecutionContracts(env deployment.Environment, chainSelector uint64) (*TimelockExecutionContracts, error) {
+ addrTypeVer, err := env.ExistingAddresses.AddressesForChain(chainSelector)
+ if err != nil {
+ return nil, fmt.Errorf("error getting addresses for chain: %w", err)
+ }
+ var timelock *owner_helpers.RBACTimelock
+ var callProxy *owner_helpers.CallProxy
+ for addr, tv := range addrTypeVer {
+ if tv.Type == types.RBACTimelock {
+ if timelock != nil {
+ return nil, fmt.Errorf("multiple timelocks found on chain %d", chainSelector)
+ }
+ var err error
+ timelock, err = owner_helpers.NewRBACTimelock(common.HexToAddress(addr), env.Chains[chainSelector].Client)
+ if err != nil {
+ return nil, fmt.Errorf("error creating timelock: %w", err)
+ }
+ }
+ if tv.Type == types.CallProxy {
+ if callProxy != nil {
+ return nil, fmt.Errorf("multiple call proxies found on chain %d", chainSelector)
+ }
+ var err error
+ callProxy, err = owner_helpers.NewCallProxy(common.HexToAddress(addr), env.Chains[chainSelector].Client)
+ if err != nil {
+ return nil, fmt.Errorf("error creating call proxy: %w", err)
+ }
+ }
+ }
+ if timelock == nil || callProxy == nil {
+ return nil, fmt.Errorf("missing timelock (%T) or call proxy(%T) on chain %d", timelock == nil, callProxy == nil, chainSelector)
+ }
+ return &TimelockExecutionContracts{
+ Timelock: timelock,
+ CallProxy: callProxy,
+ }, nil
+}
+
+type RunTimelockExecutorConfig struct {
+ Executor *mcms.Executor
+ TimelockContracts *TimelockExecutionContracts
+ ChainSelector uint64
+ // BlockStart is optional. It filter the timelock scheduled events.
+ // If not provided, the executor assumes that the operations have not been executed yet
+ // executes all the operations for the given chain.
+ BlockStart *uint64
+ BlockEnd *uint64
+}
+
+func (cfg RunTimelockExecutorConfig) Validate() error {
+ if cfg.Executor == nil {
+ return fmt.Errorf("executor is nil")
+ }
+ if cfg.TimelockContracts == nil {
+ return fmt.Errorf("timelock contracts is nil")
+ }
+ if cfg.ChainSelector == 0 {
+ return fmt.Errorf("chain selector is 0")
+ }
+ if cfg.BlockStart != nil && cfg.BlockEnd == nil {
+ if *cfg.BlockStart > *cfg.BlockEnd {
+ return fmt.Errorf("block start is greater than block end")
+ }
+ }
+ if cfg.BlockStart == nil && cfg.BlockEnd != nil {
+ return fmt.Errorf("block start must not be nil when block end is not nil")
+ }
+
+ if len(cfg.Executor.Operations[mcms.ChainIdentifier(cfg.ChainSelector)]) == 0 {
+ return fmt.Errorf("no operations for chain %d", cfg.ChainSelector)
+ }
+ return nil
+}
+
+// RunTimelockExecutor runs the scheduled operations for the given chain.
+// If the block start is not provided, it assumes that the operations have not been scheduled yet
+// and executes all the operations for the given chain.
+// It is an error if there are no operations for the given chain.
+func RunTimelockExecutor(env deployment.Environment, cfg RunTimelockExecutorConfig) error {
+ // TODO: This sort of helper probably should move to the MCMS lib.
+ // Execute all the transactions in the proposal which are for this chain.
+ if err := cfg.Validate(); err != nil {
+ return fmt.Errorf("error validating config: %w", err)
+ }
+ for _, chainOp := range cfg.Executor.Operations[mcms.ChainIdentifier(cfg.ChainSelector)] {
+ for idx, op := range cfg.Executor.ChainAgnosticOps {
+ start := cfg.BlockStart
+ end := cfg.BlockEnd
+ if bytes.Equal(op.Data, chainOp.Data) && op.To == chainOp.To {
+ if start == nil {
+ opTx, err2 := cfg.Executor.ExecuteOnChain(env.Chains[cfg.ChainSelector].Client, env.Chains[cfg.ChainSelector].DeployerKey, idx)
+ if err2 != nil {
+ return fmt.Errorf("error executing on chain: %w", err2)
+ }
+ block, err2 := env.Chains[cfg.ChainSelector].Confirm(opTx)
+ if err2 != nil {
+ return fmt.Errorf("error confirming on chain: %w", err2)
+ }
+ start = &block
+ end = &block
+ }
+
+ it, err2 := cfg.TimelockContracts.Timelock.FilterCallScheduled(&bind.FilterOpts{
+ Start: *start,
+ End: end,
+ Context: env.GetContext(),
+ }, nil, nil)
+ if err2 != nil {
+ return fmt.Errorf("error filtering call scheduled: %w", err2)
+ }
+ var calls []owner_helpers.RBACTimelockCall
+ var pred, salt [32]byte
+ for it.Next() {
+ // Note these are the same for the whole batch, can overwrite
+ pred = it.Event.Predecessor
+ salt = it.Event.Salt
+ verboseDebug(env.Logger, it.Event)
+ env.Logger.Info("scheduled", "event", it.Event)
+ calls = append(calls, owner_helpers.RBACTimelockCall{
+ Target: it.Event.Target,
+ Data: it.Event.Data,
+ Value: it.Event.Value,
+ })
+ }
+ if len(calls) == 0 {
+ return fmt.Errorf("no calls found for chain %d in blocks [%d, %d]", cfg.ChainSelector, *start, *end)
+ }
+ timelockExecutorProxy, err := owner_helpers.NewRBACTimelock(cfg.TimelockContracts.CallProxy.Address(), env.Chains[cfg.ChainSelector].Client)
+ if err != nil {
+ return fmt.Errorf("error creating timelock executor proxy: %w", err)
+ }
+ tx, err := timelockExecutorProxy.ExecuteBatch(
+ env.Chains[cfg.ChainSelector].DeployerKey, calls, pred, salt)
+ if err != nil {
+ return fmt.Errorf("error executing batch: %w", err)
+ }
+ _, err = env.Chains[cfg.ChainSelector].Confirm(tx)
+ if err != nil {
+ return fmt.Errorf("error confirming batch: %w", err)
+ }
+ }
+ }
+ }
+ return nil
+}
+
+func verboseDebug(lggr logger.Logger, event *owner_helpers.RBACTimelockCallScheduled) {
+ b, err := json.Marshal(event)
+ if err != nil {
+ panic(err)
+ }
+ lggr.Debug("scheduled", "event", string(b))
+}
+
+// MCMSWithTimelockContracts holds the Go bindings
+// for a MCMSWithTimelock contract deployment.
+// It is public for use in product specific packages.
+// Either all fields are nil or all fields are non-nil.
+type MCMSWithTimelockContracts struct {
+ CancellerMcm *owner_helpers.ManyChainMultiSig
+ BypasserMcm *owner_helpers.ManyChainMultiSig
+ ProposerMcm *owner_helpers.ManyChainMultiSig
+ Timelock *owner_helpers.RBACTimelock
+ CallProxy *owner_helpers.CallProxy
+}
+
+// Validate checks that all fields are non-nil, ensuring it's ready
+// for use generating views or interactions.
+func (state MCMSWithTimelockContracts) Validate() error {
+ if state.Timelock == nil {
+ return errors.New("timelock not found")
+ }
+ if state.CancellerMcm == nil {
+ return errors.New("canceller not found")
+ }
+ if state.ProposerMcm == nil {
+ return errors.New("proposer not found")
+ }
+ if state.BypasserMcm == nil {
+ return errors.New("bypasser not found")
+ }
+ if state.CallProxy == nil {
+ return errors.New("call proxy not found")
+ }
+ return nil
+}
+
+// MaybeLoadMCMSWithTimelockContracts looks for the addresses corresponding to
+// contracts deployed with DeployMCMSWithTimelock and loads them into a
+// MCMSWithTimelockState struct. If none of the contracts are found, the state struct will be nil.
+// An error indicates:
+// - Found but was unable to load a contract
+// - It only found part of the bundle of contracts
+// - If found more than one instance of a contract (we expect one bundle in the given addresses)
+func MaybeLoadMCMSWithTimelockContracts(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*MCMSWithTimelockContracts, error) {
+ state := MCMSWithTimelockContracts{}
+ // We expect one of each contract on the chain.
+ timelock := deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0)
+ callProxy := deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0)
+ proposer := deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0)
+ canceller := deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0)
+ bypasser := deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0)
+
+ // Ensure we either have the bundle or not.
+ _, err := deployment.AddressesContainBundle(addresses,
+ map[deployment.TypeAndVersion]struct{}{
+ timelock: {}, proposer: {}, canceller: {}, bypasser: {}, callProxy: {},
+ })
+ if err != nil {
+ return nil, fmt.Errorf("unable to check MCMS contracts on chain %s error: %w", chain.Name(), err)
+ }
+
+ for address, tvStr := range addresses {
+ switch tvStr {
+ case timelock:
+ tl, err := owner_helpers.NewRBACTimelock(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return nil, err
+ }
+ state.Timelock = tl
+ case callProxy:
+ cp, err := owner_helpers.NewCallProxy(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return nil, err
+ }
+ state.CallProxy = cp
+ case proposer:
+ mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return nil, err
+ }
+ state.ProposerMcm = mcms
+ case bypasser:
+ mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return nil, err
+ }
+ state.BypasserMcm = mcms
+ case canceller:
+ mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress(address), chain.Client)
+ if err != nil {
+ return nil, err
+ }
+ state.CancellerMcm = mcms
+ }
+ }
+ return &state, nil
+}
diff --git a/deployment/common/changeset/mcms_test_helpers.go b/deployment/common/proposalutils/mcms_test_helpers.go
similarity index 54%
rename from deployment/common/changeset/mcms_test_helpers.go
rename to deployment/common/proposalutils/mcms_test_helpers.go
index ffa99114d74..610fe84f34c 100644
--- a/deployment/common/changeset/mcms_test_helpers.go
+++ b/deployment/common/proposalutils/mcms_test_helpers.go
@@ -1,22 +1,21 @@
-package changeset
+package proposalutils
import (
- "bytes"
- "context"
"crypto/ecdsa"
+ "math/big"
"testing"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/config"
- owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink/deployment"
+ commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
+ // "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
)
var (
@@ -25,13 +24,6 @@ var (
TestXXXMCMSSigner *ecdsa.PrivateKey
)
-// TimelockExecutionContracts is a helper struct for executing timelock proposals. it contains
-// the timelock and call proxy contracts.
-type TimelockExecutionContracts struct {
- Timelock *owner_helpers.RBACTimelock
- CallProxy *owner_helpers.CallProxy
-}
-
func init() {
key, err := crypto.GenerateKey()
if err != nil {
@@ -79,45 +71,22 @@ func ExecuteProposal(t *testing.T, env deployment.Environment, executor *mcms.Ex
if err2 != nil {
require.NoError(t, deployment.MaybeDataErr(err2))
}
+
_, err2 = env.Chains[sel].Confirm(tx)
require.NoError(t, err2)
+ cfg := RunTimelockExecutorConfig{
+ Executor: executor,
+ TimelockContracts: timelockContracts,
+ ChainSelector: sel,
+ }
+ require.NoError(t, RunTimelockExecutor(env, cfg))
+}
- // TODO: This sort of helper probably should move to the MCMS lib.
- // Execute all the transactions in the proposal which are for this chain.
- for _, chainOp := range executor.Operations[mcms.ChainIdentifier(sel)] {
- for idx, op := range executor.ChainAgnosticOps {
- if bytes.Equal(op.Data, chainOp.Data) && op.To == chainOp.To {
- opTx, err3 := executor.ExecuteOnChain(env.Chains[sel].Client, env.Chains[sel].DeployerKey, idx)
- require.NoError(t, err3)
- block, err3 := env.Chains[sel].Confirm(opTx)
- require.NoError(t, err3)
- t.Log("executed", chainOp)
- it, err3 := timelockContracts.Timelock.FilterCallScheduled(&bind.FilterOpts{
- Start: block,
- End: &block,
- Context: context.Background(),
- }, nil, nil)
- require.NoError(t, err3)
- var calls []owner_helpers.RBACTimelockCall
- var pred, salt [32]byte
- for it.Next() {
- // Note these are the same for the whole batch, can overwrite
- pred = it.Event.Predecessor
- salt = it.Event.Salt
- t.Log("scheduled", it.Event)
- calls = append(calls, owner_helpers.RBACTimelockCall{
- Target: it.Event.Target,
- Data: it.Event.Data,
- Value: it.Event.Value,
- })
- }
- timelockExecutorProxy, err := owner_helpers.NewRBACTimelock(timelockContracts.CallProxy.Address(), env.Chains[sel].Client)
- tx, err := timelockExecutorProxy.ExecuteBatch(
- env.Chains[sel].DeployerKey, calls, pred, salt)
- require.NoError(t, err)
- _, err = env.Chains[sel].Confirm(tx)
- require.NoError(t, err)
- }
- }
+func SingleGroupTimelockConfig(t *testing.T) commontypes.MCMSWithTimelockConfig {
+ return commontypes.MCMSWithTimelockConfig{
+ Canceller: SingleGroupMCMS(t),
+ Bypasser: SingleGroupMCMS(t),
+ Proposer: SingleGroupMCMS(t),
+ TimelockMinDelay: big.NewInt(0),
}
}
diff --git a/deployment/common/proposalutils/propose.go b/deployment/common/proposalutils/propose.go
index f525c0b6643..baf506cb2f8 100644
--- a/deployment/common/proposalutils/propose.go
+++ b/deployment/common/proposalutils/propose.go
@@ -11,7 +11,12 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
)
-func buildProposalMetadata(
+const (
+ DefaultValidUntil = 72 * time.Hour
+)
+
+
+func BuildProposalMetadata(
chainSelectors []uint64,
proposerMcmsesPerChain map[uint64]*gethwrappers.ManyChainMultiSig,
) (map[mcms.ChainIdentifier]mcms.ChainMetadata, error) {
@@ -35,7 +40,13 @@ func buildProposalMetadata(
}
// BuildProposalFromBatches Given batches of operations, we build the metadata and timelock addresses of those opartions
-// We then return a proposal that can be executed and signed
+// We then return a proposal that can be executed and signed.
+// You can specify multiple batches for the same chain, but the only
+// usecase to do that would be you have a batch that can't fit in a single
+// transaction due to gas or calldata constraints of the chain.
+// The batches are specified separately because we eventually intend
+// to support user-specified cross chain ordering of batch execution by the tooling itself.
+// TODO: Can/should merge timelocks and proposers into a single map for the chain.
func BuildProposalFromBatches(
timelocksPerChain map[uint64]common.Address,
proposerMcmsesPerChain map[uint64]*gethwrappers.ManyChainMultiSig,
@@ -52,7 +63,7 @@ func BuildProposalFromBatches(
chains.Add(uint64(op.ChainIdentifier))
}
- mcmsMd, err := buildProposalMetadata(chains.ToSlice(), proposerMcmsesPerChain)
+ mcmsMd, err := BuildProposalMetadata(chains.ToSlice(), proposerMcmsesPerChain)
if err != nil {
return nil, err
}
@@ -61,10 +72,10 @@ func BuildProposalFromBatches(
for chainId, tl := range timelocksPerChain {
tlsPerChainId[mcms.ChainIdentifier(chainId)] = tl
}
-
+ validUntil := time.Now().Unix() + int64(DefaultValidUntil.Seconds())
return timelock.NewMCMSWithTimelockProposal(
"1",
- 2004259681, // TODO: should be parameterized and based on current block timestamp.
+ uint32(validUntil),
[]mcms.Signature{},
false,
mcmsMd,
diff --git a/deployment/common/view/v1_0/capreg.go b/deployment/common/view/v1_0/capreg.go
index 3274cc4e97f..1d3ea485cf1 100644
--- a/deployment/common/view/v1_0/capreg.go
+++ b/deployment/common/view/v1_0/capreg.go
@@ -11,7 +11,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/smartcontractkit/chainlink/deployment/common/view/types"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
diff --git a/deployment/common/view/v1_0/capreg_test.go b/deployment/common/view/v1_0/capreg_test.go
index 2f58034a619..15fe23be00e 100644
--- a/deployment/common/view/v1_0/capreg_test.go
+++ b/deployment/common/view/v1_0/capreg_test.go
@@ -7,7 +7,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/smartcontractkit/chainlink/deployment/common/view/types"
- cr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ cr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
func TestCapRegView_Denormalize(t *testing.T) {
diff --git a/deployment/environment.go b/deployment/environment.go
index 3d120adbbf1..bfbeac2f0c4 100644
--- a/deployment/environment.go
+++ b/deployment/environment.go
@@ -74,6 +74,9 @@ func (c Chain) Name() string {
// we should never get here, if the selector is invalid it should not be in the environment
panic(err)
}
+ if chainInfo.ChainName == "" {
+ return fmt.Sprintf("%d", c.Selector)
+ }
return chainInfo.ChainName
}
@@ -95,6 +98,7 @@ type Environment struct {
Logger logger.Logger
ExistingAddresses AddressBook
Chains map[uint64]Chain
+ SolChains map[uint64]SolChain
NodeIDs []string
Offchain OffchainClient
GetContext func() context.Context
@@ -180,7 +184,7 @@ func MaybeDataErr(err error) error {
var d rpc.DataError
ok := errors.As(err, &d)
if ok {
- return d
+ return fmt.Errorf("%s: %v", d.Error(), d.ErrorData())
}
return err
}
@@ -331,7 +335,6 @@ func NodeInfo(nodeIDs []string, oc NodeChainConfigsLister) (Nodes, error) {
Enabled: 1,
Ids: nodeIDs,
}
-
}
nodesFromJD, err := oc.ListNodes(context.Background(), &nodev1.ListNodesRequest{
Filter: filter,
diff --git a/deployment/environment/clo/don_nodeset.go b/deployment/environment/clo/don_nodeset.go
deleted file mode 100644
index c4cfa212c0b..00000000000
--- a/deployment/environment/clo/don_nodeset.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package clo
-
-import (
- "strings"
-
- "github.com/smartcontractkit/chainlink/deployment/environment/clo/models"
-)
-
-// CapabilityNodeSets groups nodes by a given filter function, resulting in a map of don name to nodes.
-func CapabilityNodeSets(nops []*models.NodeOperator, donFilters map[string]FilterFuncT[*models.Node]) map[string][]*models.NodeOperator {
- // first drop bootstraps if they exist because they do not serve capabilities
- nonBootstrapNops := FilterNopNodes(nops, func(n *models.Node) bool {
- for _, chain := range n.ChainConfigs {
- if chain.Ocr2Config.IsBootstrap {
- return false
- }
- }
- return true
- })
- // apply given filters to non-bootstrap nodes
- out := make(map[string][]*models.NodeOperator)
- for name, f := range donFilters {
- out[name] = FilterNopNodes(nonBootstrapNops, f)
- }
- return out
-}
-
-// FilterNopNodes filters the nodes of each nop by the provided filter function.
-// if a nop has no nodes after filtering, it is not included in the output.
-func FilterNopNodes(nops []*models.NodeOperator, f FilterFuncT[*models.Node]) []*models.NodeOperator {
- var out []*models.NodeOperator
- for _, nop := range nops {
- var res []*models.Node
- for _, n := range nop.Nodes {
- node := n
- if f(n) {
- res = append(res, node)
- }
- }
- if len(res) > 0 {
- filterNop := *nop
- filterNop.Nodes = res
- out = append(out, &filterNop)
- }
- }
- return out
-}
-
-type FilterFuncT[T any] func(n T) bool
-
-func ProductFilterGenerator(p models.ProductType) FilterFuncT[*models.Node] {
- return func(n *models.Node) bool {
- for _, prod := range n.SupportedProducts {
- if prod == p {
- return true
- }
- }
- return false
- }
-}
-
-// this could be generalized to a regex filter
-func NodeNameFilterGenerator(contains string) FilterFuncT[*models.Node] {
- return func(n *models.Node) bool {
- return strings.Contains(n.Name, contains)
- }
-}
diff --git a/deployment/environment/clo/don_nodeset_test.go b/deployment/environment/clo/don_nodeset_test.go
deleted file mode 100644
index fab9a81690b..00000000000
--- a/deployment/environment/clo/don_nodeset_test.go
+++ /dev/null
@@ -1,104 +0,0 @@
-package clo_test
-
-import (
- "encoding/json"
- "os"
- "path/filepath"
- "sort"
- "strings"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/test-go/testify/require"
-
- "github.com/smartcontractkit/chainlink/deployment/environment/clo"
- "github.com/smartcontractkit/chainlink/deployment/environment/clo/models"
-)
-
-// this is hacky, but there is no first class concept of a chain writer node in CLO
-// in prod, probably better to make an explicit list of pubkeys if we can't add a category or product type
-// sufficient for testing
-var (
- writerFilter = func(n *models.Node) bool {
- return strings.Contains(n.Name, "Prod Keystone Cap One") && !strings.Contains(n.Name, "Boot")
- }
-
- assetFilter = func(n *models.Node) bool {
- return strings.Contains(n.Name, "Prod Keystone Asset") && !strings.Contains(n.Name, "Bootstrap")
- }
-
- wfFilter = func(n *models.Node) bool {
- return strings.Contains(n.Name, "Prod Keystone One") && !strings.Contains(n.Name, "Boot")
- }
-)
-
-func TestGenerateNopNodesData(t *testing.T) {
- t.Skipf("this test is for generating test data only")
- // use for generating keystone deployment test data
- // `./bin/fmscli --config ~/.fmsclient/prod.yaml login`
- // `./bin/fmscli --config ~/.fmsclient/prod.yaml get nodeOperators > /tmp/all-clo-nops.json`
-
- regenerateFromCLO := false
- if regenerateFromCLO {
- path := "/tmp/all-clo-nops.json"
- f, err := os.ReadFile(path)
- require.NoError(t, err)
- type cloData struct {
- Nops []*models.NodeOperator `json:"nodeOperators"`
- }
- var d cloData
- require.NoError(t, json.Unmarshal(f, &d))
- require.NotEmpty(t, d.Nops)
- allNops := d.Nops
- sort.Slice(allNops, func(i, j int) bool {
- return allNops[i].ID < allNops[j].ID
- })
-
- ksFilter := func(n *models.Node) bool {
- return writerFilter(n) || assetFilter(n) || wfFilter(n)
- }
- ksNops := clo.FilterNopNodes(allNops, ksFilter)
- require.NotEmpty(t, ksNops)
- b, err := json.MarshalIndent(ksNops, "", " ")
- require.NoError(t, err)
- require.NoError(t, os.WriteFile("testdata/keystone_nops.json", b, 0644)) //nolint:gosec
- }
- keystoneNops := loadTestNops(t, "testdata/keystone_nops.json")
-
- m := clo.CapabilityNodeSets(keystoneNops, map[string]clo.FilterFuncT[*models.Node]{
- "workflow": wfFilter,
- "chainWriter": writerFilter,
- "asset": assetFilter,
- })
- assert.Len(t, m, 3)
- assert.Len(t, m["workflow"], 10)
- assert.Len(t, m["chainWriter"], 10)
- assert.Len(t, m["asset"], 16)
-
- // can be used to derive the test data for the keystone deployment
- updateTestData := true
- if updateTestData {
- d := "/tmp" // change this to the path where you want to write the test, "../deployment/keystone/testdata"
- b, err := json.MarshalIndent(m["workflow"], "", " ")
- require.NoError(t, err)
- require.NoError(t, os.WriteFile(filepath.Join(d, "workflow_nodes.json"), b, 0600))
-
- b, err = json.MarshalIndent(m["chainWriter"], "", " ")
- require.NoError(t, err)
- require.NoError(t, os.WriteFile(filepath.Join(d, "chain_writer_nodes.json"), b, 0600))
- b, err = json.MarshalIndent(m["asset"], "", " ")
- require.NoError(t, err)
- require.NoError(t, os.WriteFile(filepath.Join(d, "asset_nodes.json"), b, 0600))
- }
-}
-
-func loadTestNops(t *testing.T, path string) []*models.NodeOperator {
- f, err := os.ReadFile(path)
- require.NoError(t, err)
- var nodes []*models.NodeOperator
- require.NoError(t, json.Unmarshal(f, &nodes))
- sort.Slice(nodes, func(i, j int) bool {
- return nodes[i].ID < nodes[j].ID
- })
- return nodes
-}
diff --git a/deployment/environment/clo/models/models.go b/deployment/environment/clo/models/models.go
deleted file mode 100644
index 1d33cff84d5..00000000000
--- a/deployment/environment/clo/models/models.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// TODO: KS-455: Refactor this package to use chainlink-common
-// Fork from: https://github.com/smartcontractkit/feeds-manager/tree/develop/api/models
-// until it can be refactored in cahinlink-common.
-
-// Package models provides generated go types that reflect the GraphQL types
-// defined in the API schemas.
-//
-// To maintain compatibility with the default JSON interfaces, any necessary model
-// overrides can be defined this package.
-package models
-
-import "go/types"
-
-// Generic Error model to override existing GQL Error types and allow unmarshaling of GQL Error unions
-type Error struct {
- Typename string `json:"__typename,omitempty"`
- Message string `json:"message,omitempty"`
- Path *[]string `json:"path,omitempty"`
-}
-
-func (e *Error) Underlying() types.Type { return e }
-func (e *Error) String() string { return "Error" }
-
-// Unmarshal GQL Time fields into go strings because by default, time.Time results in zero-value
-// timestamps being present in the CLI output, e.g. "createdAt": "0001-01-01T00:00:00Z".
-// This is because the default JSON interfaces don't recognize it as an empty value for Time.time
-// and fail to omit it when using `json:"omitempty"` tags.
-type Time string
diff --git a/deployment/environment/clo/models/models_gen.go b/deployment/environment/clo/models/models_gen.go
deleted file mode 100644
index 8d8f57c3b56..00000000000
--- a/deployment/environment/clo/models/models_gen.go
+++ /dev/null
@@ -1,3653 +0,0 @@
-// Forked from https://github.com/smartcontractkit/feeds-manager/blob/afc24439ee1dffd3781b53c9419ccd1eb44f4163/api/models/models_gen.go#L1
-// TODO: KS-455: Refactor this package to use chainlink-common
-// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.
-
-package models
-
-import (
- "fmt"
- "io"
- "strconv"
-)
-
-type AggregatorConfig interface {
- IsAggregatorConfig()
-}
-
-type AggregatorSpecConfig interface {
- IsAggregatorSpecConfig()
-}
-
-type JobConfig interface {
- IsJobConfig()
-}
-
-type Action struct {
- Name string `json:"name,omitempty"`
- ActionType ActionType `json:"actionType,omitempty"`
- Run *ActionRun `json:"run,omitempty"`
- Tasks []*Task `json:"tasks,omitempty"`
-}
-
-type ActionRun struct {
- ID string `json:"id,omitempty"`
- Network *Network `json:"network,omitempty"`
- ActionType ActionType `json:"actionType,omitempty"`
- Status ActionRunStatus `json:"status,omitempty"`
- Tasks []*Task `json:"tasks,omitempty"`
- TaskRuns []*TaskRun `json:"taskRuns,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type ActivateBootstrapNodeInput struct {
- ID string `json:"id,omitempty"`
- ContractType ContractType `json:"contractType,omitempty"`
-}
-
-type ActivateBootstrapNodePayload struct {
- Node *Node `json:"node,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AddAggregatorInput struct {
- Name string `json:"name,omitempty"`
- Template string `json:"template,omitempty"`
- CategoryID string `json:"categoryID,omitempty"`
-}
-
-type AddChainInput struct {
- NetworkID string `json:"networkID,omitempty"`
- Template string `json:"template,omitempty"`
- // The Display String lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only.
- DisplayName *string `json:"displayName,omitempty"`
-}
-
-type AddChainPayload struct {
- Errors []Error `json:"errors,omitempty"`
- Chain *CCIPChain `json:"chain,omitempty"`
-}
-
-type AddChainTestContractsInput struct {
- ChainID string `json:"chainID,omitempty"`
-}
-
-type AddChainTestContractsPayload struct {
- Chain *CCIPChain `json:"chain,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AddFeedAggregatorInput struct {
- FeedID string `json:"feedID,omitempty"`
- Aggregator *AddAggregatorInput `json:"aggregator,omitempty"`
-}
-
-type AddFeedAggregatorPayload struct {
- Aggregator *Aggregator `json:"aggregator,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AddFeedInput struct {
- Name string `json:"name,omitempty"`
- NetworkID string `json:"networkID,omitempty"`
- Proxy *AddProxyInput `json:"proxy,omitempty"`
- Aggregator *AddAggregatorInput `json:"aggregator,omitempty"`
-}
-
-type AddFeedPayload struct {
- Feed *Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AddLaneInput struct {
- ChainAid string `json:"chainAID,omitempty"`
- ChainBid string `json:"chainBID,omitempty"`
- Template string `json:"template,omitempty"`
- // The Display String lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only.
- DisplayName *string `json:"displayName,omitempty"`
-}
-
-type AddLanePayload struct {
- Errors []Error `json:"errors,omitempty"`
- Lane *CCIPLane `json:"lane,omitempty"`
-}
-
-type AddLaneUpgradeInput struct {
- LaneID string `json:"laneID,omitempty"`
- Template string `json:"template,omitempty"`
-}
-
-type AddLaneUpgradePayload struct {
- Lane *CCIPLane `json:"lane,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AddMercuryV03NetworkStackInput struct {
- NetworkID string `json:"networkID,omitempty"`
- MercuryServerURL string `json:"mercuryServerURL,omitempty"`
- MercuryServerPubKey string `json:"mercuryServerPubKey,omitempty"`
- ReadAccessController *ReadAccessController `json:"readAccessController,omitempty"`
- NativeSurcharge *string `json:"nativeSurcharge,omitempty"`
- Servers *string `json:"servers,omitempty"`
-}
-
-type AddMercuryV03NetworkStackPayload struct {
- NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AddProxyInput struct {
- AccessControllerAddress *string `json:"accessControllerAddress,omitempty"`
-}
-
-type AddStorageContractInput struct {
- NetworkID string `json:"networkID,omitempty"`
- Template string `json:"template,omitempty"`
- DisplayName *string `json:"displayName,omitempty"`
-}
-
-type AddStorageContractPayload struct {
- StorageContract *StorageContract `json:"storageContract,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AddTokenInput struct {
- Template string `json:"template,omitempty"`
-}
-
-type AddTokenPayload struct {
- Token *CCIPToken `json:"token,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AddTokenPoolInput struct {
- ID string `json:"id,omitempty"`
- Template string `json:"template,omitempty"`
-}
-
-type AddTokenPoolPayload struct {
- Errors []Error `json:"errors,omitempty"`
- Chain *CCIPChain `json:"chain,omitempty"`
-}
-
-type AddVerificationProviderInput struct {
- FeedID string `json:"feedID,omitempty"`
- NetworkStackID string `json:"networkStackID,omitempty"`
-}
-
-type AddVerificationProviderPayload struct {
- Feed *MercuryV03Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type Aggregator struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- ContractAddress *string `json:"contractAddress,omitempty"`
- ContractType ContractType `json:"contractType,omitempty"`
- DeploymentStatus DeploymentStatus `json:"deploymentStatus,omitempty"`
- OwnerAddress *string `json:"ownerAddress,omitempty"`
- OwnerAddressType *ContractOwnerType `json:"ownerAddressType,omitempty"`
- PendingOwnerAddress *string `json:"pendingOwnerAddress,omitempty"`
- PendingOwnerType *ContractOwnerType `json:"pendingOwnerType,omitempty"`
- TransferOwnershipStatus TransferOwnershipStatus `json:"transferOwnershipStatus,omitempty"`
- Don *Don `json:"don,omitempty"`
- BootstrapMultiaddrs []string `json:"bootstrapMultiaddrs,omitempty"`
- SpecConfig AggregatorSpecConfig `json:"specConfig,omitempty"`
- Config AggregatorConfig `json:"config,omitempty"`
- Feed *Feed `json:"feed,omitempty"`
- Network *Network `json:"network,omitempty"`
- Category *Category `json:"category,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type AggregatorBilling struct {
- MaximumGasPrice string `json:"maximumGasPrice,omitempty"`
- ReasonableGasPrice string `json:"reasonableGasPrice,omitempty"`
- MicroLinkPerEth string `json:"microLinkPerEth,omitempty"`
- LinkGweiPerObservation string `json:"linkGweiPerObservation,omitempty"`
- LinkGewiPerTransmission string `json:"linkGewiPerTransmission,omitempty"`
-}
-
-type AggregatorConfigOcr1 struct {
- Description string `json:"description,omitempty"`
- ReasonableGasPrice string `json:"reasonableGasPrice,omitempty"`
- MaximumGasPrice string `json:"maximumGasPrice,omitempty"`
- MicroLinkPerEth string `json:"microLinkPerEth,omitempty"`
- LinkGweiPerObservation string `json:"linkGweiPerObservation,omitempty"`
- LinkGweiPerTransmission string `json:"linkGweiPerTransmission,omitempty"`
- MinimumAnswer string `json:"minimumAnswer,omitempty"`
- MaximumAnswer string `json:"maximumAnswer,omitempty"`
- Decimals string `json:"decimals,omitempty"`
- DeltaProgress string `json:"deltaProgress,omitempty"`
- DeltaResend string `json:"deltaResend,omitempty"`
- DeltaRound string `json:"deltaRound,omitempty"`
- DeltaGrace string `json:"deltaGrace,omitempty"`
- DeltaC string `json:"deltaC,omitempty"`
- AlphaPpb string `json:"alphaPPB,omitempty"`
- DeltaStage string `json:"deltaStage,omitempty"`
- RMax string `json:"rMax,omitempty"`
- S []int `json:"s,omitempty"`
- F string `json:"f,omitempty"`
-}
-
-func (AggregatorConfigOcr1) IsAggregatorConfig() {}
-
-type AggregatorConfigOcr2 struct {
- MinimumAnswer string `json:"minimumAnswer,omitempty"`
- MaximumAnswer string `json:"maximumAnswer,omitempty"`
- Description string `json:"description,omitempty"`
- Decimals string `json:"decimals,omitempty"`
- DeltaGrace string `json:"deltaGrace,omitempty"`
- DeltaProgress string `json:"deltaProgress,omitempty"`
- DeltaResend string `json:"deltaResend,omitempty"`
- DeltaRound string `json:"deltaRound,omitempty"`
- DeltaStage string `json:"deltaStage,omitempty"`
- F string `json:"f,omitempty"`
- MaxDurationObservation string `json:"maxDurationObservation,omitempty"`
- MaxDurationQuery string `json:"maxDurationQuery,omitempty"`
- MaxDurationReport string `json:"maxDurationReport,omitempty"`
- MaxDurationShouldAcceptFinalizedReport string `json:"maxDurationShouldAcceptFinalizedReport,omitempty"`
- MaxDurationShouldTransmitAcceptedReport string `json:"maxDurationShouldTransmitAcceptedReport,omitempty"`
- RMax string `json:"rMax,omitempty"`
- S []int `json:"s,omitempty"`
- AlphaAcceptInfinite bool `json:"alphaAcceptInfinite,omitempty"`
- AlphaAcceptPpb string `json:"alphaAcceptPPB,omitempty"`
- AlphaReportInfinite bool `json:"alphaReportInfinite,omitempty"`
- AlphaReportPpb string `json:"alphaReportPPB,omitempty"`
- DeltaC string `json:"deltaC,omitempty"`
- ObservationPaymentGjuels string `json:"observationPaymentGjuels,omitempty"`
- TransmissionPaymentGjuels string `json:"transmissionPaymentGjuels,omitempty"`
- MaximumGasPriceGwei *string `json:"maximumGasPriceGwei,omitempty"`
- ReasonableGasPriceGwei *string `json:"reasonableGasPriceGwei,omitempty"`
- AccountingGas *string `json:"accountingGas,omitempty"`
-}
-
-func (AggregatorConfigOcr2) IsAggregatorConfig() {}
-
-type AggregatorOnChainConfig struct {
- ConfigCount string `json:"configCount,omitempty"`
- BlockNumber string `json:"blockNumber,omitempty"`
- ConfigDigest []string `json:"configDigest,omitempty"`
-}
-
-type AggregatorOnChainState struct {
- Billing *AggregatorBilling `json:"billing,omitempty"`
- Config *AggregatorOnChainConfig `json:"config,omitempty"`
- OwnerAddress string `json:"ownerAddress,omitempty"`
-}
-
-type AggregatorProxy struct {
- ID string `json:"id,omitempty"`
- ContractAddress *string `json:"contractAddress,omitempty"`
- TransferOwnershipStatus TransferOwnershipStatus `json:"transferOwnershipStatus,omitempty"`
- OwnerAddress *string `json:"ownerAddress,omitempty"`
- OwnerAddressType *ContractOwnerType `json:"ownerAddressType,omitempty"`
- PendingOwnerAddress *string `json:"pendingOwnerAddress,omitempty"`
- PendingOwnerType *ContractOwnerType `json:"pendingOwnerType,omitempty"`
- Aggregator *Aggregator `json:"aggregator,omitempty"`
- AccessControllerAddress *string `json:"accessControllerAddress,omitempty"`
- Feed *Feed `json:"feed,omitempty"`
- Network *Network `json:"network,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type ArchiveChainPayload struct {
- Chain *CCIPChain `json:"chain,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ArchiveContractInput struct {
- ChainID string `json:"chainID,omitempty"`
- ContractID string `json:"contractID,omitempty"`
-}
-
-type ArchiveContractPayload struct {
- Contract *Contract `json:"contract,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ArchiveFeedPayload struct {
- Feed *MercuryV03Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ArchiveLanePayload struct {
- Lane *CCIPLane `json:"lane,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ArchiveNetworkInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type ArchiveNetworkPayload struct {
- Network *Network `json:"network,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ArchiveNetworkStackPayload struct {
- NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type AssignNodeToJobInput struct {
- JobID string `json:"jobID,omitempty"`
- NodeID string `json:"nodeID,omitempty"`
-}
-
-type AssignNodeToJobPayload struct {
- Job *Job `json:"job,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type BuildInfo struct {
- Version string `json:"version,omitempty"`
-}
-
-type CCIPChain struct {
- ID string `json:"id,omitempty"`
- Network *Network `json:"network,omitempty"`
- Contracts []*Contract `json:"contracts,omitempty"`
- WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"`
- SupportedTokens []*EVMBridgedToken `json:"supportedTokens,omitempty"`
- FeeTokens []string `json:"feeTokens,omitempty"`
- WrappedNativeToken string `json:"wrappedNativeToken,omitempty"`
- ArchivedAt *Time `json:"archivedAt,omitempty"`
- // The Display String lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only.
- DisplayName *string `json:"displayName,omitempty"`
- DeployedTemplate map[string]interface{} `json:"deployedTemplate,omitempty"`
- Labels map[string]interface{} `json:"labels,omitempty"`
-}
-
-type CCIPChainBasic struct {
- ID string `json:"id,omitempty"`
- ChainID string `json:"chainID,omitempty"`
- Contracts []*ContractBasic `json:"contracts,omitempty"`
-}
-
-type CCIPChainFilter struct {
- IsArchived *bool `json:"isArchived,omitempty"`
- Selectors []*CCIPChainSelector `json:"selectors,omitempty"`
-}
-
-type CCIPChainSelector struct {
- Key string `json:"key,omitempty"`
- Op SelectorOp `json:"op,omitempty"`
- Value *string `json:"value,omitempty"`
-}
-
-type CCIPEndpoint struct {
- Chain *CCIPChain `json:"chain,omitempty"`
- Contracts []*Contract `json:"contracts,omitempty"`
-}
-
-type CCIPEndpointBasic struct {
- Chain *CCIPChainBasic `json:"chain,omitempty"`
- Contracts []*ContractBasic `json:"contracts,omitempty"`
-}
-
-type CCIPLane struct {
- ID string `json:"id,omitempty"`
- ChainA *CCIPChain `json:"chainA,omitempty"`
- ChainB *CCIPChain `json:"chainB,omitempty"`
- LegA *CCIPLaneLeg `json:"legA,omitempty"`
- LegB *CCIPLaneLeg `json:"legB,omitempty"`
- LegAProvisional *CCIPLaneLeg `json:"legAProvisional,omitempty"`
- LegBProvisional *CCIPLaneLeg `json:"legBProvisional,omitempty"`
- Dons []*Don `json:"dons,omitempty"`
- WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"`
- Status CCIPLaneLegStatus `json:"status,omitempty"`
- ArchivedAt *Time `json:"archivedAt,omitempty"`
- DisplayName *string `json:"displayName,omitempty"`
- DeployedTemplate map[string]interface{} `json:"deployedTemplate,omitempty"`
- DeployedProvisionalTemplate map[string]interface{} `json:"deployedProvisionalTemplate,omitempty"`
-}
-
-type CCIPLaneChainUpdateInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type CCIPLaneLeg struct {
- ID string `json:"id,omitempty"`
- Tag CCIPLaneLegTag `json:"tag,omitempty"`
- Source *CCIPEndpoint `json:"source,omitempty"`
- Destination *CCIPEndpoint `json:"destination,omitempty"`
- WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"`
- Dons []*Don `json:"dons,omitempty"`
- Status CCIPLaneLegStatus `json:"status,omitempty"`
- ArchivedAt *Time `json:"archivedAt,omitempty"`
- SupportedTokens []string `json:"supportedTokens,omitempty"`
-}
-
-type CCIPLaneLegBasic struct {
- ID string `json:"id,omitempty"`
- Source *CCIPEndpointBasic `json:"source,omitempty"`
- Destination *CCIPEndpointBasic `json:"destination,omitempty"`
- Dons []*DONBasic `json:"dons,omitempty"`
- Status CCIPLaneLegStatus `json:"status,omitempty"`
- SupportedTokens []string `json:"supportedTokens,omitempty"`
-}
-
-type CCIPLaneLegsFilter struct {
- ContractAddress string `json:"contractAddress,omitempty"`
- NetworkNameKey string `json:"networkNameKey,omitempty"`
-}
-
-type CCIPLanesFilter struct {
- IsArchived *bool `json:"isArchived,omitempty"`
-}
-
-type CCIPMutations struct {
- AddChain *AddChainPayload `json:"addChain,omitempty"`
- ImportChain *ImportChainPayload `json:"importChain,omitempty"`
- AddChainTestContracts *AddChainTestContractsPayload `json:"addChainTestContracts,omitempty"`
- AddTokenPool *AddTokenPoolPayload `json:"addTokenPool,omitempty"`
- ImportTokenPool *ImportTokenPoolPayload `json:"importTokenPool,omitempty"`
- AddToken *AddTokenPayload `json:"addToken,omitempty"`
- DeployContract *DeployContractPayload `json:"deployContract,omitempty"`
- DeleteContract *DeleteContractPayload `json:"deleteContract,omitempty"`
- ArchiveContract *ArchiveContractPayload `json:"archiveContract,omitempty"`
- // Deploys the contracts for a chain
- DeployChain *CcipDeployChainPayload `json:"deployChain,omitempty"`
- DeployChainTestContracts *CcipDeployChainTestContractsPayload `json:"deployChainTestContracts,omitempty"`
- DeployToken *DeployTokenPayload `json:"deployToken,omitempty"`
- DeregisterTestToken *DeregisterTestTokenPayload `json:"deregisterTestToken,omitempty"`
- AddLane *AddLanePayload `json:"addLane,omitempty"`
- ImportLane *ImportLanePayload `json:"importLane,omitempty"`
- AddLaneUpgrade *AddLaneUpgradePayload `json:"addLaneUpgrade,omitempty"`
- UpdateLane *UpdateLanePayload `json:"updateLane,omitempty"`
- ArchiveLane *ArchiveLanePayload `json:"archiveLane,omitempty"`
- ArchiveChain *ArchiveChainPayload `json:"archiveChain,omitempty"`
- CancelLaneUpgrade *CancelLaneUpgradePayload `json:"cancelLaneUpgrade,omitempty"`
- ConfirmLaneUpgrade *ConfirmLaneUpgradePayload `json:"confirmLaneUpgrade,omitempty"`
- DeployLaneLeg *CcipDeployLaneLegPayload `json:"deployLaneLeg,omitempty"`
- SetAllowListTokenPool *SetAllowListTokenPoolPayload `json:"setAllowListTokenPool,omitempty"`
- // SetConfigLaneLeg sets the on chain configuration for the Commit Store and Off Ramp contracts of the lane leg.
- //
- // The configuration values passed as arguments to the contract call are provided by the most recently inserted
- // RDD template.
- SetConfigLaneLeg *CcipSetConfigLaneLegPayload `json:"setConfigLaneLeg,omitempty"`
- TransferOwnership *TransferOwnershipPayload `json:"transferOwnership,omitempty"`
- TransferAdminRole *TransferAdminRolePayload `json:"transferAdminRole,omitempty"`
- UpdateChain *UpdateCCIPChainPayload `json:"updateChain,omitempty"`
- RemoveLiquidity *RemoveLiquidityPayload `json:"removeLiquidity,omitempty"`
- SyncChain *SyncChainPayload `json:"syncChain,omitempty"`
- SyncLane *SyncLanePayload `json:"syncLane,omitempty"`
- SyncContracts *SyncContractsPayload `json:"syncContracts,omitempty"`
-}
-
-type CCIPQueries struct {
- Chains []*CCIPChain `json:"chains,omitempty"`
- Lanes []*CCIPLane `json:"lanes,omitempty"`
- LaneLegs []*CCIPLaneLegBasic `json:"laneLegs,omitempty"`
- Chain *CCIPChain `json:"chain,omitempty"`
- Lane *CCIPLane `json:"lane,omitempty"`
- Tokens []*CCIPToken `json:"tokens,omitempty"`
- Token *CCIPToken `json:"token,omitempty"`
-}
-
-type CCIPToken struct {
- ID string `json:"id,omitempty"`
- Symbol string `json:"symbol,omitempty"`
- TokenPools []*CCIPTokenPool `json:"tokenPools,omitempty"`
-}
-
-type CCIPTokenPool struct {
- ID string `json:"id,omitempty"`
- Contract *Contract `json:"contract,omitempty"`
- Address *string `json:"address,omitempty"`
- TokenAddress string `json:"tokenAddress,omitempty"`
- TokenSymbol string `json:"tokenSymbol,omitempty"`
- Chain *CCIPChain `json:"chain,omitempty"`
- WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"`
-}
-
-type CcipDeployChainInput struct {
- ChainID string `json:"chainID,omitempty"`
-}
-
-type CcipDeployChainPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CcipDeployChainTestContractsInput struct {
- ChainID string `json:"chainID,omitempty"`
-}
-
-type CcipDeployChainTestContractsPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CcipDeployLaneLegInput struct {
- LegID string `json:"legID,omitempty"`
-}
-
-type CcipDeployLaneLegPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CcipSetConfigLaneLegInput struct {
- LegID string `json:"legID,omitempty"`
-}
-
-type CcipSetConfigLaneLegPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CSAKeypair struct {
- ID string `json:"id,omitempty"`
- PublicKey string `json:"publicKey,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type CancelLaneUpgradeInput struct {
- LaneID string `json:"laneID,omitempty"`
-}
-
-type CancelLaneUpgradePayload struct {
- Errors []Error `json:"errors,omitempty"`
- Lane *CCIPLane `json:"lane,omitempty"`
-}
-
-type Category struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Color string `json:"color,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type ConfirmLaneUpgradeInput struct {
- LaneID string `json:"laneID,omitempty"`
-}
-
-type ConfirmLaneUpgradePayload struct {
- Errors []Error `json:"errors,omitempty"`
- Lane *CCIPLane `json:"lane,omitempty"`
-}
-
-type Contract struct {
- ID string `json:"id,omitempty"`
- Network *Network `json:"network,omitempty"`
- Name string `json:"name,omitempty"`
- Version int `json:"version,omitempty"`
- Semver *string `json:"semver,omitempty"`
- Tag ContractTag `json:"tag,omitempty"`
- Address *string `json:"address,omitempty"`
- Metadata map[string]interface{} `json:"metadata,omitempty"`
- OwnerAddress *string `json:"ownerAddress,omitempty"`
- OwnerType ContractOwnerType `json:"ownerType,omitempty"`
- PendingOwnerAddress *string `json:"pendingOwnerAddress,omitempty"`
- PendingOwnerType *ContractOwnerType `json:"pendingOwnerType,omitempty"`
- TransferOwnershipStatus TransferOwnershipStatus `json:"transferOwnershipStatus,omitempty"`
- VerificationStatus VerificationStatus `json:"verificationStatus,omitempty"`
- SourceCodeHash string `json:"sourceCodeHash,omitempty"`
- DeployedAt *Time `json:"deployedAt,omitempty"`
- Imported bool `json:"imported,omitempty"`
- ArchivedAt *Time `json:"archivedAt,omitempty"`
-}
-
-type ContractBasic struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Version int `json:"version,omitempty"`
- Semver *string `json:"semver,omitempty"`
- Address *string `json:"address,omitempty"`
- Metadata map[string]interface{} `json:"metadata,omitempty"`
-}
-
-type CreateBootstrapJobInput struct {
- DonID string `json:"donID,omitempty"`
- NodeID string `json:"nodeID,omitempty"`
-}
-
-type CreateBootstrapJobPayload struct {
- Job *Job `json:"job,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateCSAKeypairPayload struct {
- CsaKeypair *CSAKeypair `json:"csaKeypair,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateCategoryInput struct {
- Name string `json:"name,omitempty"`
- Color *string `json:"color,omitempty"`
-}
-
-type CreateCategoryPayload struct {
- Category *Category `json:"category,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateJobInput struct {
- Type JobType `json:"type,omitempty"`
- Ocr2PluginType *OCR2PluginType `json:"ocr2PluginType,omitempty"`
- Config *JobConfigInput `json:"config,omitempty"`
- DonID string `json:"donID,omitempty"`
- NodeOperatorID string `json:"nodeOperatorID,omitempty"`
-}
-
-type CreateJobPayload struct {
- Job *Job `json:"job,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateMercuryNetworkStackInput struct {
- NetworkID string `json:"networkID,omitempty"`
- VerifierAddress string `json:"verifierAddress,omitempty"`
- VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"`
- ServerURL string `json:"serverURL,omitempty"`
- ServerPublicKey string `json:"serverPublicKey,omitempty"`
- Servers *string `json:"servers,omitempty"`
-}
-
-type CreateMercuryNetworkStackPayload struct {
- NetworkStack *MercuryNetworkStack `json:"networkStack,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateNetworkInput struct {
- ChainID string `json:"chainID,omitempty"`
- ChainType ChainType `json:"chainType,omitempty"`
- Name string `json:"name,omitempty"`
- NativeToken string `json:"nativeToken,omitempty"`
- NativeTokenContractAddress *string `json:"nativeTokenContractAddress,omitempty"`
- ConfigContractAddress *string `json:"configContractAddress,omitempty"`
- LinkUSDProxyAddress *string `json:"linkUSDProxyAddress,omitempty"`
- NativeUSDProxyAddress *string `json:"nativeUSDProxyAddress,omitempty"`
- LinkContractAddress *string `json:"linkContractAddress,omitempty"`
- FlagsContractAddress *string `json:"flagsContractAddress,omitempty"`
- LinkFunding *string `json:"linkFunding,omitempty"`
- BillingAdminAccessControllerAddress *string `json:"billingAdminAccessControllerAddress,omitempty"`
- RequesterAdminAccessControllerAddress *string `json:"requesterAdminAccessControllerAddress,omitempty"`
- ExplorerAPIKey *string `json:"explorerAPIKey,omitempty"`
- ExplorerAPIURL *string `json:"explorerAPIURL,omitempty"`
-}
-
-type CreateNetworkPayload struct {
- Network *Network `json:"network,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateNodeInput struct {
- Name string `json:"name,omitempty"`
- PublicKey string `json:"publicKey,omitempty"`
- NodeOperatorID string `json:"nodeOperatorID,omitempty"`
- SupportedCategoryIDs []string `json:"supportedCategoryIDs,omitempty"`
- SupportedProducts []ProductType `json:"supportedProducts,omitempty"`
-}
-
-type CreateNodeOperatorInput struct {
- Keys []string `json:"keys,omitempty"`
- Name string `json:"name,omitempty"`
- Email *string `json:"email,omitempty"`
- Website *string `json:"website,omitempty"`
-}
-
-type CreateNodeOperatorPayload struct {
- NodeOperator *NodeOperator `json:"nodeOperator,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateNodePayload struct {
- Node *Node `json:"node,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateRelayerAccountInput struct {
- RelayerID string `json:"relayerID,omitempty"`
-}
-
-type CreateRelayerAccountPayload struct {
- RelayerAccount *RelayerAccount `json:"relayerAccount,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateRelayerInput struct {
- Name string `json:"name,omitempty"`
- NetworkID string `json:"networkID,omitempty"`
- Config string `json:"config,omitempty"`
- URL *RelayerURL `json:"url,omitempty"`
-}
-
-type CreateRelayerPayload struct {
- Relayer *Relayer `json:"relayer,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateUserInput struct {
- Email string `json:"email,omitempty"`
- Name string `json:"name,omitempty"`
- Password string `json:"password,omitempty"`
- Role UserRole `json:"role,omitempty"`
-}
-
-type CreateUserPayload struct {
- User *User `json:"user,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateVaultInput struct {
- Name string `json:"name,omitempty"`
- Address string `json:"address,omitempty"`
- VaultType VaultType `json:"vaultType,omitempty"`
- SupportedProducts []ProductType `json:"supportedProducts,omitempty"`
- NetworkID string `json:"networkID,omitempty"`
-}
-
-type CreateVaultPayload struct {
- Vault *Vault `json:"vault,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type CreateWebhookInput struct {
- Name string `json:"name,omitempty"`
- EndpointURL string `json:"endpointURL,omitempty"`
-}
-
-type CreateWebhookPayload struct {
- Webhook *Webhook `json:"webhook,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type Don struct {
- ID string `json:"id,omitempty"`
- Network *Network `json:"network,omitempty"`
- ExecutionType DONExecutionType `json:"executionType,omitempty"`
- Jobs []*Job `json:"jobs,omitempty"`
-}
-
-type DONBasic struct {
- ID string `json:"id,omitempty"`
- ExecutionType DONExecutionType `json:"executionType,omitempty"`
- Jobs []*JobBasic `json:"jobs,omitempty"`
-}
-
-type DeactivateBootstrapNodeInput struct {
- ID string `json:"id,omitempty"`
- ContractType ContractType `json:"contractType,omitempty"`
-}
-
-type DeactivateBootstrapNodePayload struct {
- Node *Node `json:"node,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeleteContractInput struct {
- ChainID string `json:"chainID,omitempty"`
- ContractID string `json:"contractID,omitempty"`
-}
-
-type DeleteContractPayload struct {
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeleteFeedInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type DeleteFeedPayload struct {
- Feed *Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeleteJobInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type DeleteJobPayload struct {
- Job *Job `json:"job,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeleteNodeInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type DeleteNodePayload struct {
- Node *Node `json:"node,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeleteVaultInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type DeleteVaultPayload struct {
- Vault *Vault `json:"vault,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeleteWebhookInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type DeleteWebhookPayload struct {
- Webhook *Webhook `json:"webhook,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeleteWorkflowRunInput struct {
- WorkflowRunID string `json:"workflowRunID,omitempty"`
-}
-
-type DeleteWorkflowRunPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeployContractInput struct {
- ChainID string `json:"chainID,omitempty"`
- ContractID string `json:"contractID,omitempty"`
-}
-
-type DeployContractPayload struct {
- Errors []Error `json:"errors,omitempty"`
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
-}
-
-type DeployMercuryV03NetworkStackInput struct {
- NetworkStackID string `json:"networkStackID,omitempty"`
-}
-
-type DeployMercuryV03NetworkStackPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeploySetStorageContractInput struct {
- StorageID string `json:"storageID,omitempty"`
-}
-
-type DeploySetStorageContractPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeployTokenInput struct {
- Symbol string `json:"symbol,omitempty"`
-}
-
-type DeployTokenPayload struct {
- WorkflowRunsAndContracts []*WorkflowRunAndContract `json:"workflowRunsAndContracts,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DeregisterTestTokenInput struct {
- LaneLegID string `json:"laneLegID,omitempty"`
-}
-
-type DeregisterTestTokenPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DisableNodeInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type DisableNodePayload struct {
- Node *Node `json:"node,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DisableRelayerInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type DisableRelayerPayload struct {
- Relayer *Relayer `json:"relayer,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type DisableUserInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type DisableUserPayload struct {
- User *User `json:"user,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type EVMBridgedToken struct {
- Token string `json:"token,omitempty"`
- Address string `json:"address,omitempty"`
- TokenPoolType TokenPoolType `json:"tokenPoolType,omitempty"`
- PriceType TokenPriceType `json:"priceType,omitempty"`
- Price *string `json:"price,omitempty"`
- PriceFeed *PriceFeed `json:"priceFeed,omitempty"`
-}
-
-type EnableNodeInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type EnableNodePayload struct {
- Node *Node `json:"node,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type EnableRelayerInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type EnableRelayerPayload struct {
- Relayer *Relayer `json:"relayer,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type Feed struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Status FeedStatus `json:"status,omitempty"`
- Network *Network `json:"network,omitempty"`
- Proxy *AggregatorProxy `json:"proxy,omitempty"`
- Aggregators []*Aggregator `json:"aggregators,omitempty"`
- WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type FeedsFilters struct {
- ChainID *string `json:"chainID,omitempty"`
- ChainType *ChainType `json:"chainType,omitempty"`
- Name *string `json:"name,omitempty"`
- NetworkID *string `json:"networkID,omitempty"`
- ProxyAddress *string `json:"proxyAddress,omitempty"`
- Limit *string `json:"limit,omitempty"`
- Offset *string `json:"offset,omitempty"`
-}
-
-type FeedsInput struct {
- Filter *FeedsFilters `json:"filter,omitempty"`
-}
-
-type GauntletReport struct {
- ID string `json:"id,omitempty"`
- TraceID string `json:"traceID,omitempty"`
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- TransactionHash *string `json:"transactionHash,omitempty"`
- ReportID string `json:"reportID,omitempty"`
- Timestamp Time `json:"timestamp,omitempty"`
- Op string `json:"op,omitempty"`
- Input string `json:"input,omitempty"`
- Output *string `json:"output,omitempty"`
- Requirements *string `json:"requirements,omitempty"`
- Config string `json:"config,omitempty"`
- Subops *string `json:"subops,omitempty"`
- Events *string `json:"events,omitempty"`
- Snapshot *string `json:"snapshot,omitempty"`
- Error *string `json:"error,omitempty"`
- TraceExtra *string `json:"traceExtra,omitempty"`
-}
-
-type GauntletReportsInput struct {
- TraceID *string `json:"traceID,omitempty"`
- WorkflowRunID *int `json:"workflowRunID,omitempty"`
- TransactionHash *string `json:"transactionHash,omitempty"`
-}
-
-type ImportAggregatorInput struct {
- Name string `json:"name,omitempty"`
- ContractAddress string `json:"contractAddress,omitempty"`
- Template string `json:"template,omitempty"`
- CategoryID string `json:"categoryID,omitempty"`
-}
-
-type ImportChainInput struct {
- NetworkID string `json:"networkID,omitempty"`
- Template string `json:"template,omitempty"`
- // The Display String lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only.
- DisplayName *string `json:"displayName,omitempty"`
-}
-
-type ImportChainPayload struct {
- Errors []Error `json:"errors,omitempty"`
- Chain *CCIPChain `json:"chain,omitempty"`
-}
-
-type ImportFeedAggregatorInput struct {
- FeedID string `json:"feedID,omitempty"`
- Aggregator *ImportAggregatorInput `json:"aggregator,omitempty"`
-}
-
-type ImportFeedAggregatorPayload struct {
- Aggregator *Aggregator `json:"aggregator,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ImportFeedInput struct {
- Name string `json:"name,omitempty"`
- NetworkID string `json:"networkID,omitempty"`
- Proxy *ImportProxyInput `json:"proxy,omitempty"`
- Aggregators []*ImportAggregatorInput `json:"aggregators,omitempty"`
-}
-
-type ImportFeedPayload struct {
- Feed *Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ImportKeystoneWorkflowInput struct {
- CategoryID string `json:"categoryID,omitempty"`
- NetworkID string `json:"networkID,omitempty"`
- Template string `json:"template,omitempty"`
-}
-
-type ImportKeystoneWorkflowPayload struct {
- Workflow *KeystoneWorkflow `json:"workflow,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ImportLaneInput struct {
- ChainAid string `json:"chainAID,omitempty"`
- ChainBid string `json:"chainBID,omitempty"`
- Template string `json:"template,omitempty"`
- // The Display String lets a user differentiate multiple CCIP chains on the same network. It is not unique and used for display purposes only.
- DisplayName *string `json:"displayName,omitempty"`
-}
-
-type ImportLanePayload struct {
- Errors []Error `json:"errors,omitempty"`
- Lane *CCIPLane `json:"lane,omitempty"`
-}
-
-type ImportMercuryFeedInput struct {
- Name string `json:"name,omitempty"`
- ExternalFeedID string `json:"externalFeedID,omitempty"`
- NetworkStackID string `json:"networkStackID,omitempty"`
- FromBlock string `json:"fromBlock,omitempty"`
- Template string `json:"template,omitempty"`
-}
-
-type ImportMercuryFeedPayload struct {
- Feed *MercuryFeed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ImportMercuryV03FeedInput struct {
- Name string `json:"name,omitempty"`
- ExternalFeedID string `json:"externalFeedID,omitempty"`
- Template string `json:"template,omitempty"`
- CategoryID string `json:"categoryID,omitempty"`
-}
-
-type ImportMercuryV03FeedPayload struct {
- Feed *MercuryV03Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ImportMercuryV03NetworkStackInput struct {
- NetworkID string `json:"networkID,omitempty"`
- VerifierAddress string `json:"verifierAddress,omitempty"`
- VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"`
- RewardBankAddress string `json:"rewardBankAddress,omitempty"`
- FeeManagerAddress string `json:"feeManagerAddress,omitempty"`
- MercuryServerURL string `json:"mercuryServerURL,omitempty"`
- MercuryServerPubKey string `json:"mercuryServerPubKey,omitempty"`
- Servers *string `json:"servers,omitempty"`
-}
-
-type ImportMercuryV03NetworkStackPayload struct {
- NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ImportOCR3CapabilityInput struct {
- CategoryID string `json:"categoryID,omitempty"`
- NetworkID string `json:"networkID,omitempty"`
- Template string `json:"template,omitempty"`
-}
-
-type ImportOCR3CapabilityPayload struct {
- Ocr3Capability *OCR3Capability `json:"ocr3Capability,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type ImportProxyInput struct {
- ContractAddress string `json:"contractAddress,omitempty"`
- AccessControllerAddress *string `json:"accessControllerAddress,omitempty"`
- AggregatorAddress string `json:"aggregatorAddress,omitempty"`
-}
-
-type ImportTokenPoolInput struct {
- ID string `json:"id,omitempty"`
- Template string `json:"template,omitempty"`
-}
-
-type ImportTokenPoolPayload struct {
- Errors []Error `json:"errors,omitempty"`
- Chain *CCIPChain `json:"chain,omitempty"`
-}
-
-type Job struct {
- ID string `json:"id,omitempty"`
- UUID string `json:"uuid,omitempty"`
- Type JobType `json:"type,omitempty"`
- Ocr2PluginType *OCR2PluginType `json:"ocr2PluginType,omitempty"`
- Status JobStatus `json:"status,omitempty"`
- NodeOperator *NodeOperator `json:"nodeOperator,omitempty"`
- Node *Node `json:"node,omitempty"`
- IsBootstrap bool `json:"isBootstrap,omitempty"`
- Config JobConfig `json:"config,omitempty"`
- Spec *string `json:"spec,omitempty"`
- ProposalChanged bool `json:"proposalChanged,omitempty"`
- AssignableNodes []*Node `json:"assignableNodes,omitempty"`
- CanPropose bool `json:"canPropose,omitempty"`
- CanRevoke bool `json:"canRevoke,omitempty"`
- Proposals []*JobProposal `json:"proposals,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type JobBasic struct {
- ID string `json:"id,omitempty"`
- UUID string `json:"uuid,omitempty"`
- Type JobType `json:"type,omitempty"`
- Ocr2PluginType *OCR2PluginType `json:"ocr2PluginType,omitempty"`
- Status JobStatus `json:"status,omitempty"`
- IsBootstrap bool `json:"isBootstrap,omitempty"`
-}
-
-type JobConfigEmpty struct {
- Empty bool `json:"_empty,omitempty"`
-}
-
-func (JobConfigEmpty) IsJobConfig() {}
-
-type JobConfigEmptyInput struct {
- Empty *bool `json:"_empty,omitempty"`
-}
-
-type JobConfigInput struct {
- Ocr1 *JobConfigOCR1Input `json:"ocr1,omitempty"`
- Ocr2Median *JobConfigOCR2MedianInput `json:"ocr2Median,omitempty"`
- Ocr2Mercury *JobConfigOCR2MercuryInput `json:"ocr2Mercury,omitempty"`
- Ocr2CCIPCommit *JobConfigEmptyInput `json:"ocr2CCIPCommit,omitempty"`
- Ocr2CCIPExecution *JobConfigEmptyInput `json:"ocr2CCIPExecution,omitempty"`
- Ocr2CCIPRebalancer *JobConfigEmptyInput `json:"ocr2CCIPRebalancer,omitempty"`
-}
-
-type JobConfigOcr1 struct {
- Apis []string `json:"apis,omitempty"`
-}
-
-func (JobConfigOcr1) IsJobConfig() {}
-
-type JobConfigOCR1Input struct {
- Apis []string `json:"apis,omitempty"`
-}
-
-type JobConfigOCR2Median struct {
- Apis []string `json:"apis,omitempty"`
-}
-
-func (JobConfigOCR2Median) IsJobConfig() {}
-
-type JobConfigOCR2MedianInput struct {
- Apis []string `json:"apis,omitempty"`
-}
-
-type JobConfigOCR2Mercury struct {
- Apis []string `json:"apis,omitempty"`
-}
-
-func (JobConfigOCR2Mercury) IsJobConfig() {}
-
-type JobConfigOCR2MercuryInput struct {
- Apis []string `json:"apis,omitempty"`
- CrossApis []string `json:"crossApis,omitempty"`
-}
-
-type JobProposal struct {
- ID string `json:"id,omitempty"`
- Version string `json:"version,omitempty"`
- Status JobProposalStatus `json:"status,omitempty"`
- Spec string `json:"spec,omitempty"`
- Job *Job `json:"job,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- UpdatedAt Time `json:"updatedAt,omitempty"`
- ProposedAt *Time `json:"proposedAt,omitempty"`
- ResponseReceivedAt *Time `json:"responseReceivedAt,omitempty"`
-}
-
-type KeystoneWorkflow struct {
- ID string `json:"id,omitempty"`
- WorkflowSpec string `json:"workflowSpec,omitempty"`
- WorkflowOwner string `json:"workflowOwner,omitempty"`
- ExternalWorkflowID string `json:"externalWorkflowID,omitempty"`
- Don *Don `json:"don,omitempty"`
- Name string `json:"name,omitempty"`
- Category *Category `json:"category,omitempty"`
-}
-
-type KeystoneWorkflowMutations struct {
- ImportWorkflow *ImportKeystoneWorkflowPayload `json:"importWorkflow,omitempty"`
- UpdateWorkflow *UpdateKeystoneWorkflowPayload `json:"updateWorkflow,omitempty"`
-}
-
-type KeystoneWorkflowQueries struct {
- Workflow *KeystoneWorkflow `json:"workflow,omitempty"`
- Workflows []*KeystoneWorkflow `json:"workflows,omitempty"`
-}
-
-type ListAggregatorsFilter struct {
- NetworkID *string `json:"networkID,omitempty"`
- ContractAddress *string `json:"contractAddress,omitempty"`
-}
-
-type ListRelayersFilter struct {
- Enabled *bool `json:"enabled,omitempty"`
-}
-
-type ListWebhookCallsFilter struct {
- State *WebhookCallState `json:"state,omitempty"`
-}
-
-type LoginInput struct {
- Email string `json:"email,omitempty"`
- Password string `json:"password,omitempty"`
-}
-
-type LoginPayload struct {
- Session *Session `json:"session,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type LogoutPayload struct {
- Session *Session `json:"session,omitempty"`
-}
-
-type MarkStaleJobsInput struct {
- Ids []string `json:"ids,omitempty"`
-}
-
-type MarkStaleJobsPayload struct {
- Jobs []*Job `json:"jobs,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type MercuryFeed struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- ExternalFeedID string `json:"externalFeedID,omitempty"`
- NetworkStack *MercuryNetworkStack `json:"networkStack,omitempty"`
- FromBlock string `json:"fromBlock,omitempty"`
- Template string `json:"template,omitempty"`
- Don *Don `json:"don,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- UpdatedAt Time `json:"updatedAt,omitempty"`
-}
-
-type MercuryFeedsFilters struct {
- Name *string `json:"name,omitempty"`
- NetworkID *string `json:"networkID,omitempty"`
- VerifierProxyAddress *string `json:"verifierProxyAddress,omitempty"`
- Limit *string `json:"limit,omitempty"`
- Offset *string `json:"offset,omitempty"`
-}
-
-type MercuryFeedsInput struct {
- Filter *MercuryFeedsFilters `json:"filter,omitempty"`
-}
-
-type MercuryMutations struct {
- CreateNetworkStack *CreateMercuryNetworkStackPayload `json:"createNetworkStack,omitempty"`
- ImportFeed *ImportMercuryFeedPayload `json:"importFeed,omitempty"`
- UpdateFeed *UpdateMercuryFeedPayload `json:"updateFeed,omitempty"`
- UpdateNetworkStack *UpdateMercuryNetworkStackPayload `json:"updateNetworkStack,omitempty"`
-}
-
-type MercuryNetworkStack struct {
- ID string `json:"id,omitempty"`
- Network *Network `json:"network,omitempty"`
- VerifierAddress string `json:"verifierAddress,omitempty"`
- VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"`
- ServerURL string `json:"serverURL,omitempty"`
- ServerPublicKey string `json:"serverPublicKey,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- UpdatedAt Time `json:"updatedAt,omitempty"`
- Servers []*MercuryServer `json:"servers,omitempty"`
-}
-
-type MercuryQueries struct {
- NetworkStacks []*MercuryNetworkStack `json:"networkStacks,omitempty"`
- NetworkStack *MercuryNetworkStack `json:"networkStack,omitempty"`
- Feed *MercuryFeed `json:"feed,omitempty"`
- Feeds []*MercuryFeed `json:"feeds,omitempty"`
-}
-
-type MercuryServer struct {
- URL string `json:"url,omitempty"`
- PublicKey string `json:"publicKey,omitempty"`
-}
-
-type MercuryV03Feed struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- ExternalFeedID string `json:"externalFeedID,omitempty"`
- Verifiers []*MercuryV03Verifier `json:"verifiers,omitempty"`
- ReportSchemaVersion ReportSchemaVersion `json:"reportSchemaVersion,omitempty"`
- Template string `json:"template,omitempty"`
- Don *Don `json:"don,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- UpdatedAt Time `json:"updatedAt,omitempty"`
- ArchivedAt *Time `json:"archivedAt,omitempty"`
- Category *Category `json:"category,omitempty"`
-}
-
-type MercuryV03FeedFilter struct {
- IsArchived *bool `json:"isArchived,omitempty"`
- TransmitToServer *bool `json:"transmitToServer,omitempty"`
-}
-
-type MercuryV03Mutations struct {
- ArchiveFeed *ArchiveFeedPayload `json:"archiveFeed,omitempty"`
- ArchiveNetworkStack *ArchiveNetworkStackPayload `json:"archiveNetworkStack,omitempty"`
- AddVerificationProvider *AddVerificationProviderPayload `json:"addVerificationProvider,omitempty"`
- RemoveVerificationProvider *RemoveVerificationProviderPayload `json:"removeVerificationProvider,omitempty"`
- AddNetworkStack *AddMercuryV03NetworkStackPayload `json:"addNetworkStack,omitempty"`
- DeployNetworkStack *DeployMercuryV03NetworkStackPayload `json:"deployNetworkStack,omitempty"`
- ImportFeed *ImportMercuryV03FeedPayload `json:"importFeed,omitempty"`
- ImportNetworkStack *ImportMercuryV03NetworkStackPayload `json:"importNetworkStack,omitempty"`
- TransferOwnership *TransferOwnershipPayload `json:"transferOwnership,omitempty"`
- UpdateNetworkStack *UpdateMercuryV03NetworkStackPayload `json:"updateNetworkStack,omitempty"`
- UpdateFeed *UpdateMercuryV03FeedPayload `json:"updateFeed,omitempty"`
- VerifyContract *VerifyMercuryV03ContractPayload `json:"verifyContract,omitempty"`
-}
-
-type MercuryV03NetworkStack struct {
- ID string `json:"id,omitempty"`
- Network *Network `json:"network,omitempty"`
- Status NetworkStackStatus `json:"status,omitempty"`
- VerifierAddress *string `json:"verifierAddress,omitempty"`
- VerifierProxyAddress *string `json:"verifierProxyAddress,omitempty"`
- RewardBankAddress *string `json:"rewardBankAddress,omitempty"`
- FeeManagerAddress *string `json:"feeManagerAddress,omitempty"`
- MercuryServerURL string `json:"mercuryServerURL,omitempty"`
- MercuryServerPubKey string `json:"mercuryServerPubKey,omitempty"`
- Contracts []*Contract `json:"contracts,omitempty"`
- WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- UpdatedAt Time `json:"updatedAt,omitempty"`
- ArchivedAt *Time `json:"archivedAt,omitempty"`
- Servers []*MercuryServer `json:"servers,omitempty"`
-}
-
-type MercuryV03NetworkStackFilter struct {
- IsArchived *bool `json:"isArchived,omitempty"`
-}
-
-type MercuryV03Queries struct {
- NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"`
- NetworkStacks []*MercuryV03NetworkStack `json:"networkStacks,omitempty"`
- Feed *MercuryV03Feed `json:"feed,omitempty"`
- Feeds []*MercuryV03Feed `json:"feeds,omitempty"`
-}
-
-type MercuryV03Verifier struct {
- ID string `json:"id,omitempty"`
- NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"`
- NetworkStackType NetworkStackType `json:"networkStackType,omitempty"`
-}
-
-type Mutation struct {
-}
-
-type Network struct {
- ID string `json:"id,omitempty"`
- ChainID string `json:"chainID,omitempty"`
- ChainType ChainType `json:"chainType,omitempty"`
- Name string `json:"name,omitempty"`
- NativeToken string `json:"nativeToken,omitempty"`
- Archived bool `json:"archived,omitempty"`
- NativeTokenContractAddress *string `json:"nativeTokenContractAddress,omitempty"`
- ConfigContractAddress *string `json:"configContractAddress,omitempty"`
- LinkUSDProxyAddress *string `json:"linkUSDProxyAddress,omitempty"`
- NativeUSDProxyAddress *string `json:"nativeUSDProxyAddress,omitempty"`
- LinkContractAddress *string `json:"linkContractAddress,omitempty"`
- FlagsContractAddress *string `json:"flagsContractAddress,omitempty"`
- LinkFunding string `json:"linkFunding,omitempty"`
- BillingAdminAccessControllerAddress *string `json:"billingAdminAccessControllerAddress,omitempty"`
- RequesterAdminAccessControllerAddress *string `json:"requesterAdminAccessControllerAddress,omitempty"`
- IconName *string `json:"iconName,omitempty"`
- ExplorerURL *string `json:"explorerURL,omitempty"`
- Relayers []*Relayer `json:"relayers,omitempty"`
- Vaults []*Vault `json:"vaults,omitempty"`
- ExplorerAPIKey *string `json:"explorerAPIKey,omitempty"`
- ExplorerAPIURL *string `json:"explorerAPIURL,omitempty"`
-}
-
-type NetworksFilters struct {
- Archived *bool `json:"archived,omitempty"`
- ChainID *string `json:"chainID,omitempty"`
- ChainType *ChainType `json:"chainType,omitempty"`
- Name *string `json:"name,omitempty"`
-}
-
-type NetworksInput struct {
- Filter *NetworksFilters `json:"filter,omitempty"`
-}
-
-type Node struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- PublicKey *string `json:"publicKey,omitempty"`
- ChainConfigs []*NodeChainConfig `json:"chainConfigs,omitempty"`
- Connected bool `json:"connected,omitempty"`
- Enabled bool `json:"enabled,omitempty"`
- Metadata *NodeMetadata `json:"metadata,omitempty"`
- NodeOperator *NodeOperator `json:"nodeOperator,omitempty"`
- Version *string `json:"version,omitempty"`
- SupportedProducts []ProductType `json:"supportedProducts,omitempty"`
- Categories []*Category `json:"categories,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type NodeChainConfig struct {
- ID string `json:"id,omitempty"`
- Network *Network `json:"network,omitempty"`
- AccountAddress string `json:"accountAddress,omitempty"`
- AdminAddress string `json:"adminAddress,omitempty"`
- Ocr1Config *NodeOCR1Config `json:"ocr1Config,omitempty"`
- Ocr1BootstrapVerified bool `json:"ocr1BootstrapVerified,omitempty"`
- Ocr2Config *NodeOCR2Config `json:"ocr2Config,omitempty"`
- Ocr2BootstrapVerified bool `json:"ocr2BootstrapVerified,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type NodeConnectionInfo struct {
- PublicKey string `json:"publicKey,omitempty"`
- RPCURL string `json:"rpcURL,omitempty"`
-}
-
-type NodeMetadata struct {
- JobCount int `json:"jobCount,omitempty"`
-}
-
-type NodeOCR1Config struct {
- Enabled bool `json:"enabled,omitempty"`
- IsBootstrap bool `json:"isBootstrap,omitempty"`
- Multiaddr *string `json:"multiaddr,omitempty"`
- P2pKeyBundle *NodeOCR1ConfigP2PKeyBundle `json:"p2pKeyBundle,omitempty"`
- OcrKeyBundle *NodeOCR1ConfigOCRKeyBundle `json:"ocrKeyBundle,omitempty"`
-}
-
-type NodeOCR1ConfigOCRKeyBundle struct {
- BundleID string `json:"bundleID,omitempty"`
- ConfigPublicKey string `json:"configPublicKey,omitempty"`
- OffchainPublicKey string `json:"offchainPublicKey,omitempty"`
- OnchainSigningAddress string `json:"onchainSigningAddress,omitempty"`
-}
-
-type NodeOCR1ConfigP2PKeyBundle struct {
- PeerID string `json:"peerID,omitempty"`
- PublicKey string `json:"publicKey,omitempty"`
-}
-
-type NodeOCR2Config struct {
- Enabled bool `json:"enabled,omitempty"`
- IsBootstrap bool `json:"isBootstrap,omitempty"`
- Multiaddr *string `json:"multiaddr,omitempty"`
- ForwarderAddress *string `json:"forwarderAddress,omitempty"`
- P2pKeyBundle *NodeOCR2ConfigP2PKeyBundle `json:"p2pKeyBundle,omitempty"`
- OcrKeyBundle *NodeOCR2ConfigOCRKeyBundle `json:"ocrKeyBundle,omitempty"`
- Plugins *NodeOCR2ConfigPlugins `json:"plugins,omitempty"`
-}
-
-type NodeOCR2ConfigOCRKeyBundle struct {
- BundleID string `json:"bundleID,omitempty"`
- ConfigPublicKey string `json:"configPublicKey,omitempty"`
- OffchainPublicKey string `json:"offchainPublicKey,omitempty"`
- OnchainSigningAddress string `json:"onchainSigningAddress,omitempty"`
-}
-
-type NodeOCR2ConfigP2PKeyBundle struct {
- PeerID string `json:"peerID,omitempty"`
- PublicKey string `json:"publicKey,omitempty"`
-}
-
-type NodeOCR2ConfigPlugins struct {
- CcipCommit bool `json:"ccipCommit,omitempty"`
- CcipExecution bool `json:"ccipExecution,omitempty"`
- CcipRebalancer bool `json:"ccipRebalancer,omitempty"`
- Median bool `json:"median,omitempty"`
- Mercury bool `json:"mercury,omitempty"`
-}
-
-type NodeOperator struct {
- ID string `json:"id,omitempty"`
- Keys []string `json:"keys,omitempty"`
- Name string `json:"name,omitempty"`
- Email string `json:"email,omitempty"`
- Website string `json:"website,omitempty"`
- Metadata *NodeOperatorMetadata `json:"metadata,omitempty"`
- Nodes []*Node `json:"nodes,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type NodeOperatorMetadata struct {
- NodeCount int `json:"nodeCount,omitempty"`
- JobCount int `json:"jobCount,omitempty"`
-}
-
-type NodesFilters struct {
- NetworkID *string `json:"networkID,omitempty"`
-}
-
-type NodesInput struct {
- Filter *NodesFilters `json:"filter,omitempty"`
-}
-
-type OCR3Capability struct {
- ID string `json:"id,omitempty"`
- ContractAddress string `json:"contractAddress,omitempty"`
- Name string `json:"name,omitempty"`
- BootstrapMultiaddrs []string `json:"bootstrapMultiaddrs,omitempty"`
- Template string `json:"template,omitempty"`
- Category *Category `json:"category,omitempty"`
- Don *Don `json:"don,omitempty"`
-}
-
-type OCR3CapabilityMutations struct {
- ImportOCR3Capability *ImportOCR3CapabilityPayload `json:"importOCR3Capability,omitempty"`
- UpdateOCR3Capability *UpdateOCR3CapabilityPayload `json:"updateOCR3Capability,omitempty"`
-}
-
-type OCR3CapabilityQueries struct {
- Ocr3Capability *OCR3Capability `json:"ocr3Capability,omitempty"`
- Ocr3Capabilities []*OCR3Capability `json:"ocr3Capabilities,omitempty"`
-}
-
-type PriceFeed struct {
- AggregatorAddress string `json:"aggregatorAddress,omitempty"`
- Multiplier string `json:"multiplier,omitempty"`
-}
-
-type Profile struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Email string `json:"email,omitempty"`
- Role UserRole `json:"role,omitempty"`
- Permits []string `json:"permits,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type ProposeJobInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type ProposeJobPayload struct {
- Job *Job `json:"job,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type Query struct {
-}
-
-type ReadAccessController struct {
- Address string `json:"address,omitempty"`
-}
-
-type Relayer struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- URL *URL `json:"url,omitempty"`
- Config string `json:"config,omitempty"`
- IsEnabled bool `json:"isEnabled,omitempty"`
- Network *Network `json:"network,omitempty"`
- Accounts []*RelayerAccount `json:"accounts,omitempty"`
-}
-
-type RelayerAccount struct {
- ID string `json:"id,omitempty"`
- Relayer *Relayer `json:"relayer,omitempty"`
- Address string `json:"address,omitempty"`
- NativeBalance string `json:"nativeBalance,omitempty"`
- LinkBalance string `json:"linkBalance,omitempty"`
-}
-
-type RelayerURL struct {
- Websocket string `json:"websocket,omitempty"`
- HTTP string `json:"http,omitempty"`
-}
-
-type RemoveLiquidityInput struct {
- ChainID string `json:"chainID,omitempty"`
- TokenPoolContractID string `json:"tokenPoolContractID,omitempty"`
- Amount string `json:"amount,omitempty"`
-}
-
-type RemoveLiquidityPayload struct {
- Errors []Error `json:"errors,omitempty"`
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
-}
-
-type RemoveVerificationProviderInput struct {
- FeedID string `json:"feedID,omitempty"`
- NetworkStackID string `json:"networkStackID,omitempty"`
-}
-
-type RemoveVerificationProviderPayload struct {
- Feed *MercuryV03Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type RetryActionRunInput struct {
- ActionRunID string `json:"actionRunID,omitempty"`
-}
-
-type RetryActionRunPayload struct {
- Status ActionRunStatus `json:"status,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type RetryWebhookCallInput struct {
- WebhookCallID string `json:"webhookCallID,omitempty"`
-}
-
-type RetryWebhookCallPayload struct {
- WebhookCall *WebhookCall `json:"webhookCall,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type RevokeJobInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type RevokeJobPayload struct {
- Job *Job `json:"job,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type Role struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Permits []string `json:"permits,omitempty"`
-}
-
-type RunCCIPCommandInput struct {
- Command CCIPCommand `json:"command,omitempty"`
- LaneLegID string `json:"laneLegID,omitempty"`
- Upgrade *bool `json:"upgrade,omitempty"`
-}
-
-type RunCCIPCommandPayload struct {
- Errors []Error `json:"errors,omitempty"`
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
-}
-
-type SendTestWebhookEventInput struct {
- WebhookID string `json:"webhookID,omitempty"`
-}
-
-type SendTestWebhookEventPayload struct {
- WebhookCall *WebhookCall `json:"webhookCall,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type Session struct {
- ID string `json:"id,omitempty"`
- Token string `json:"token,omitempty"`
- ExpiresAt Time `json:"expiresAt,omitempty"`
- Revoked bool `json:"revoked,omitempty"`
- Permits []string `json:"permits,omitempty"`
-}
-
-type SetAllowListTokenPoolInput struct {
- ChainID string `json:"chainID,omitempty"`
- TokenPoolContractID string `json:"tokenPoolContractID,omitempty"`
- AllowList []string `json:"allowList,omitempty"`
-}
-
-type SetAllowListTokenPoolPayload struct {
- Errors []Error `json:"errors,omitempty"`
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
-}
-
-type SetPasswordInput struct {
- UserID string `json:"userID,omitempty"`
- Password string `json:"password,omitempty"`
-}
-
-type SetPasswordPayload struct {
- Errors []Error `json:"errors,omitempty"`
-}
-
-type SetupAppInput struct {
- Token string `json:"token,omitempty"`
- Email string `json:"email,omitempty"`
- Name string `json:"name,omitempty"`
- Password string `json:"password,omitempty"`
-}
-
-type SetupAppPayload struct {
- Errors []Error `json:"errors,omitempty"`
-}
-
-type SpecConfigOffChainReporting1 struct {
- Decimals int `json:"decimals,omitempty"`
-}
-
-func (SpecConfigOffChainReporting1) IsAggregatorSpecConfig() {}
-
-type SpecConfigOffChainReporting2 struct {
- Decimals int `json:"decimals,omitempty"`
-}
-
-func (SpecConfigOffChainReporting2) IsAggregatorSpecConfig() {}
-
-type StorageContract struct {
- ID string `json:"id,omitempty"`
- Network *Network `json:"network,omitempty"`
- DisplayName *string `json:"displayName,omitempty"`
- Template string `json:"template,omitempty"`
- Contract *Contract `json:"contract,omitempty"`
- WorkflowRuns []*WorkflowRun `json:"workflowRuns,omitempty"`
-}
-
-type StorageContractFilter struct {
- NetworkID *string `json:"networkID,omitempty"`
-}
-
-// Grouping of all mutations related to the Storage contract resource.
-type StorageMutations struct {
- // addStorageContract adds a new storage contract to the database and creates
- // a single new resource.
- AddStorageContract *AddStorageContractPayload `json:"addStorageContract,omitempty"`
- // deploySetStorageContract deploys a new storage contract to the network and
- // sets the value on chain to the value provided from the template of the storage.
- DeploySetStorageContract *DeploySetStorageContractPayload `json:"deploySetStorageContract,omitempty"`
-}
-
-// Grouping of all queries related to the Storage contract resource.
-type StorageQueries struct {
- StorageContracts []*StorageContract `json:"storageContracts,omitempty"`
- StorageContract *StorageContract `json:"storageContract,omitempty"`
-}
-
-type SyncAggregatorInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type SyncAggregatorPayload struct {
- Aggregator *Aggregator `json:"aggregator,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type SyncAggregatorProxyInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type SyncAggregatorProxyPayload struct {
- AggregatorProxy *AggregatorProxy `json:"aggregatorProxy,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type SyncChainInput struct {
- ChainID string `json:"chainID,omitempty"`
-}
-
-type SyncChainPayload struct {
- Chain *CCIPChain `json:"chain,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type SyncContractsInput struct {
- ContractIDs []string `json:"contractIDs,omitempty"`
-}
-
-type SyncContractsPayload struct {
- Contracts []*Contract `json:"contracts,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type SyncLaneInput struct {
- LaneID string `json:"laneID,omitempty"`
-}
-
-type SyncLanePayload struct {
- Lane *CCIPLane `json:"lane,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type Task struct {
- Name string `json:"name,omitempty"`
- Run *TaskRun `json:"run,omitempty"`
-}
-
-type TaskRun struct {
- ID string `json:"id,omitempty"`
- Input string `json:"input,omitempty"`
- Output string `json:"output,omitempty"`
- Status TaskRunStatus `json:"status,omitempty"`
- Error *string `json:"error,omitempty"`
- TxHash *string `json:"txHash,omitempty"`
-}
-
-type Token struct {
- Symbol string `json:"symbol,omitempty"`
- Address string `json:"address,omitempty"`
-}
-
-type TransferAdminRoleInput struct {
- TokenAdminRegistryID string `json:"tokenAdminRegistryID,omitempty"`
- TokenPoolID string `json:"tokenPoolID,omitempty"`
- VaultID string `json:"vaultID,omitempty"`
-}
-
-type TransferAdminRolePayload struct {
- Errors []Error `json:"errors,omitempty"`
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
-}
-
-type TransferOwnershipInput struct {
- ContractIDs []string `json:"contractIDs,omitempty"`
- VaultID string `json:"vaultID,omitempty"`
-}
-
-type TransferOwnershipPayload struct {
- Errors []Error `json:"errors,omitempty"`
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
-}
-
-type URL struct {
- Websocket string `json:"websocket,omitempty"`
- HTTP *string `json:"http,omitempty"`
-}
-
-type UnarchiveNetworkInput struct {
- ID string `json:"id,omitempty"`
-}
-
-type UnarchiveNetworkPayload struct {
- Network *Network `json:"network,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateAggregatorDetailsInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- CategoryID string `json:"categoryID,omitempty"`
-}
-
-type UpdateAggregatorDetailsPayload struct {
- Aggregator *Aggregator `json:"aggregator,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateAggregatorInput struct {
- ID string `json:"id,omitempty"`
- AggregatorTemplate *string `json:"aggregatorTemplate,omitempty"`
-}
-
-type UpdateAggregatorPayload struct {
- Aggregator *Aggregator `json:"aggregator,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateAggregatorProxyInput struct {
- ID string `json:"id,omitempty"`
- ContractAddress string `json:"contractAddress,omitempty"`
-}
-
-type UpdateAggregatorProxyPayload struct {
- ID string `json:"id,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateCCIPChainInput struct {
- ID string `json:"id,omitempty"`
- Template string `json:"template,omitempty"`
-}
-
-type UpdateCCIPChainPayload struct {
- Chain *CCIPChain `json:"chain,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateCategoryInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Color *string `json:"color,omitempty"`
-}
-
-type UpdateCategoryPayload struct {
- Category *Category `json:"category,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateFeedInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
-}
-
-type UpdateFeedPayload struct {
- Feed *Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateKeystoneWorkflowInput struct {
- ID string `json:"id,omitempty"`
- Template string `json:"template,omitempty"`
- CategoryID string `json:"categoryID,omitempty"`
-}
-
-type UpdateKeystoneWorkflowPayload struct {
- Workflow *KeystoneWorkflow `json:"workflow,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateLaneInput struct {
- Template *string `json:"template,omitempty"`
- UpdateStartBlocks *bool `json:"updateStartBlocks,omitempty"`
- LegA *CCIPLaneChainUpdateInput `json:"legA,omitempty"`
- LegB *CCIPLaneChainUpdateInput `json:"legB,omitempty"`
-}
-
-type UpdateLanePayload struct {
- Errors []Error `json:"errors,omitempty"`
- Lane *CCIPLane `json:"lane,omitempty"`
-}
-
-type UpdateMercuryFeedInput struct {
- ID string `json:"id,omitempty"`
- FromBlock string `json:"fromBlock,omitempty"`
- Template *string `json:"template,omitempty"`
-}
-
-type UpdateMercuryFeedPayload struct {
- Feed *MercuryFeed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateMercuryNetworkStackInput struct {
- ID string `json:"id,omitempty"`
- VerifierAddress string `json:"verifierAddress,omitempty"`
- VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"`
- ServerURL string `json:"serverURL,omitempty"`
- ServerPublicKey string `json:"serverPublicKey,omitempty"`
- Servers *string `json:"servers,omitempty"`
-}
-
-type UpdateMercuryNetworkStackPayload struct {
- NetworkStack *MercuryNetworkStack `json:"networkStack,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateMercuryV03FeedInput struct {
- ID string `json:"id,omitempty"`
- Template string `json:"template,omitempty"`
- CategoryID string `json:"categoryID,omitempty"`
-}
-
-type UpdateMercuryV03FeedPayload struct {
- Feed *MercuryV03Feed `json:"feed,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateMercuryV03NetworkStackInput struct {
- ID string `json:"id,omitempty"`
- VerifierAddress string `json:"verifierAddress,omitempty"`
- VerifierProxyAddress string `json:"verifierProxyAddress,omitempty"`
- RewardBankAddress string `json:"rewardBankAddress,omitempty"`
- FeeManagerAddress string `json:"feeManagerAddress,omitempty"`
- MercuryServerURL string `json:"mercuryServerURL,omitempty"`
- MercuryServerPubKey string `json:"mercuryServerPubKey,omitempty"`
- Servers *string `json:"servers,omitempty"`
-}
-
-type UpdateMercuryV03NetworkStackPayload struct {
- NetworkStack *MercuryV03NetworkStack `json:"networkStack,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateNetworkInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- NativeToken string `json:"nativeToken,omitempty"`
- NativeTokenContractAddress *string `json:"nativeTokenContractAddress,omitempty"`
- ConfigContractAddress *string `json:"configContractAddress,omitempty"`
- LinkUSDProxyAddress *string `json:"linkUSDProxyAddress,omitempty"`
- NativeUSDProxyAddress *string `json:"nativeUSDProxyAddress,omitempty"`
- LinkContractAddress *string `json:"linkContractAddress,omitempty"`
- FlagsContractAddress *string `json:"flagsContractAddress,omitempty"`
- LinkFunding *string `json:"linkFunding,omitempty"`
- BillingAdminAccessControllerAddress *string `json:"billingAdminAccessControllerAddress,omitempty"`
- RequesterAdminAccessControllerAddress *string `json:"requesterAdminAccessControllerAddress,omitempty"`
- ExplorerAPIKey *string `json:"explorerAPIKey,omitempty"`
- ExplorerAPIURL *string `json:"explorerAPIURL,omitempty"`
-}
-
-type UpdateNetworkPayload struct {
- Network *Network `json:"network,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateNodeInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- PublicKey string `json:"publicKey,omitempty"`
- SupportedCategoryIDs []string `json:"supportedCategoryIDs,omitempty"`
- SupportedProducts []ProductType `json:"supportedProducts,omitempty"`
-}
-
-type UpdateNodeOperatorInput struct {
- ID string `json:"id,omitempty"`
- Keys []string `json:"keys,omitempty"`
- Name string `json:"name,omitempty"`
- Email string `json:"email,omitempty"`
- Website string `json:"website,omitempty"`
-}
-
-type UpdateNodeOperatorPayload struct {
- NodeOperator *NodeOperator `json:"nodeOperator,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateNodePayload struct {
- Node *Node `json:"node,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateOCR3CapabilityInput struct {
- ID string `json:"id,omitempty"`
- Template string `json:"template,omitempty"`
- CategoryID string `json:"categoryID,omitempty"`
-}
-
-type UpdateOCR3CapabilityPayload struct {
- Ocr3Capability *OCR3Capability `json:"ocr3Capability,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdatePasswordInput struct {
- OldPassword string `json:"oldPassword,omitempty"`
- NewPassword string `json:"newPassword,omitempty"`
-}
-
-type UpdatePasswordPayload struct {
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateProfileInput struct {
- Name string `json:"name,omitempty"`
-}
-
-type UpdateProfilePayload struct {
- Profile *Profile `json:"profile,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateRelayerInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- URL *RelayerURL `json:"url,omitempty"`
- Config string `json:"config,omitempty"`
-}
-
-type UpdateRelayerPayload struct {
- Relayer *Relayer `json:"relayer,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateUserInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Email string `json:"email,omitempty"`
- Role UserRole `json:"role,omitempty"`
-}
-
-type UpdateUserPayload struct {
- User *User `json:"user,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateVaultInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Address string `json:"address,omitempty"`
- SupportedProducts []ProductType `json:"supportedProducts,omitempty"`
-}
-
-type UpdateVaultPayload struct {
- Vault *Vault `json:"vault,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type UpdateWebhookInput struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- EndpointURL string `json:"endpointURL,omitempty"`
- Enabled bool `json:"enabled,omitempty"`
-}
-
-type UpdateWebhookPayload struct {
- Webhook *Webhook `json:"webhook,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type User struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Email string `json:"email,omitempty"`
- Role UserRole `json:"role,omitempty"`
- Disabled bool `json:"disabled,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
-}
-
-type Vault struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Address string `json:"address,omitempty"`
- Type VaultType `json:"type,omitempty"`
- SupportedProducts []ProductType `json:"supportedProducts,omitempty"`
- Network *Network `json:"network,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- UpdatedAt Time `json:"updatedAt,omitempty"`
-}
-
-type VaultsFilters struct {
- Type *VaultType `json:"type,omitempty"`
-}
-
-type VaultsInput struct {
- Filter *VaultsFilters `json:"filter,omitempty"`
-}
-
-type VerifyMercuryV03ContractInput struct {
- ContractIDs []string `json:"contractIDs,omitempty"`
-}
-
-type VerifyMercuryV03ContractPayload struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Errors []Error `json:"errors,omitempty"`
-}
-
-type Webhook struct {
- ID string `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- EndpointURL string `json:"endpointURL,omitempty"`
- SecretKey string `json:"secretKey,omitempty"`
- Enabled bool `json:"enabled,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- UpdatedAt Time `json:"updatedAt,omitempty"`
-}
-
-type WebhookCall struct {
- ID string `json:"id,omitempty"`
- UUID string `json:"uuid,omitempty"`
- Type string `json:"type,omitempty"`
- State string `json:"state,omitempty"`
- Payload string `json:"payload,omitempty"`
- Attempts []*WebhookCallAttempt `json:"attempts,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- DeliveredAt *Time `json:"deliveredAt,omitempty"`
-}
-
-type WebhookCallAttempt struct {
- ID string `json:"id,omitempty"`
- StatusCode int `json:"statusCode,omitempty"`
- Timestamp Time `json:"timestamp,omitempty"`
-}
-
-type WorkflowRun struct {
- ID string `json:"id,omitempty"`
- WorkflowType WorkflowType `json:"workflowType,omitempty"`
- Status WorkflowRunStatus `json:"status,omitempty"`
- User *User `json:"user,omitempty"`
- AccountAddress *string `json:"accountAddress,omitempty"`
- Actions []*Action `json:"actions,omitempty"`
- CreatedAt Time `json:"createdAt,omitempty"`
- Name *string `json:"name,omitempty"`
- DeletedAt *Time `json:"deletedAt,omitempty"`
-}
-
-type WorkflowRunAndContract struct {
- WorkflowRun *WorkflowRun `json:"workflowRun,omitempty"`
- Contract *Contract `json:"contract,omitempty"`
-}
-
-type WorkflowRunsFilters struct {
- UserID *string `json:"userID,omitempty"`
-}
-
-type WorkflowRunsInput struct {
- Filter *WorkflowRunsFilters `json:"filter,omitempty"`
-}
-
-type ActionRunStatus string
-
-const (
- ActionRunStatusPending ActionRunStatus = "PENDING"
- ActionRunStatusInProgress ActionRunStatus = "IN_PROGRESS"
- ActionRunStatusCompleted ActionRunStatus = "COMPLETED"
- ActionRunStatusErrored ActionRunStatus = "ERRORED"
-)
-
-var AllActionRunStatus = []ActionRunStatus{
- ActionRunStatusPending,
- ActionRunStatusInProgress,
- ActionRunStatusCompleted,
- ActionRunStatusErrored,
-}
-
-func (e ActionRunStatus) IsValid() bool {
- switch e {
- case ActionRunStatusPending, ActionRunStatusInProgress, ActionRunStatusCompleted, ActionRunStatusErrored:
- return true
- }
- return false
-}
-
-func (e ActionRunStatus) String() string {
- return string(e)
-}
-
-func (e *ActionRunStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = ActionRunStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid ActionRunStatus", str)
- }
- return nil
-}
-
-func (e ActionRunStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type ActionType string
-
-const (
- ActionTypeGeneric ActionType = "GENERIC"
-)
-
-var AllActionType = []ActionType{
- ActionTypeGeneric,
-}
-
-func (e ActionType) IsValid() bool {
- switch e {
- case ActionTypeGeneric:
- return true
- }
- return false
-}
-
-func (e ActionType) String() string {
- return string(e)
-}
-
-func (e *ActionType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = ActionType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid ActionType", str)
- }
- return nil
-}
-
-func (e ActionType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type CCIPCommand string
-
-const (
- CCIPCommandSetConfig CCIPCommand = "SET_CONFIG"
-)
-
-var AllCCIPCommand = []CCIPCommand{
- CCIPCommandSetConfig,
-}
-
-func (e CCIPCommand) IsValid() bool {
- switch e {
- case CCIPCommandSetConfig:
- return true
- }
- return false
-}
-
-func (e CCIPCommand) String() string {
- return string(e)
-}
-
-func (e *CCIPCommand) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = CCIPCommand(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid CCIPCommand", str)
- }
- return nil
-}
-
-func (e CCIPCommand) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type CCIPJobType string
-
-const (
- CCIPJobTypeCommit CCIPJobType = "COMMIT"
- CCIPJobTypeExecute CCIPJobType = "EXECUTE"
- CCIPJobTypeBootstrap CCIPJobType = "BOOTSTRAP"
-)
-
-var AllCCIPJobType = []CCIPJobType{
- CCIPJobTypeCommit,
- CCIPJobTypeExecute,
- CCIPJobTypeBootstrap,
-}
-
-func (e CCIPJobType) IsValid() bool {
- switch e {
- case CCIPJobTypeCommit, CCIPJobTypeExecute, CCIPJobTypeBootstrap:
- return true
- }
- return false
-}
-
-func (e CCIPJobType) String() string {
- return string(e)
-}
-
-func (e *CCIPJobType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = CCIPJobType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid CCIPJobType", str)
- }
- return nil
-}
-
-func (e CCIPJobType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type CCIPLaneLegStatus string
-
-const (
- CCIPLaneLegStatusDraft CCIPLaneLegStatus = "DRAFT"
- CCIPLaneLegStatusReady CCIPLaneLegStatus = "READY"
-)
-
-var AllCCIPLaneLegStatus = []CCIPLaneLegStatus{
- CCIPLaneLegStatusDraft,
- CCIPLaneLegStatusReady,
-}
-
-func (e CCIPLaneLegStatus) IsValid() bool {
- switch e {
- case CCIPLaneLegStatusDraft, CCIPLaneLegStatusReady:
- return true
- }
- return false
-}
-
-func (e CCIPLaneLegStatus) String() string {
- return string(e)
-}
-
-func (e *CCIPLaneLegStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = CCIPLaneLegStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid CCIPLaneLegStatus", str)
- }
- return nil
-}
-
-func (e CCIPLaneLegStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type CCIPLaneLegTag string
-
-const (
- CCIPLaneLegTagMain CCIPLaneLegTag = "MAIN"
- CCIPLaneLegTagProvisional CCIPLaneLegTag = "PROVISIONAL"
- CCIPLaneLegTagDead CCIPLaneLegTag = "DEAD"
-)
-
-var AllCCIPLaneLegTag = []CCIPLaneLegTag{
- CCIPLaneLegTagMain,
- CCIPLaneLegTagProvisional,
- CCIPLaneLegTagDead,
-}
-
-func (e CCIPLaneLegTag) IsValid() bool {
- switch e {
- case CCIPLaneLegTagMain, CCIPLaneLegTagProvisional, CCIPLaneLegTagDead:
- return true
- }
- return false
-}
-
-func (e CCIPLaneLegTag) String() string {
- return string(e)
-}
-
-func (e *CCIPLaneLegTag) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = CCIPLaneLegTag(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid CCIPLaneLegTag", str)
- }
- return nil
-}
-
-func (e CCIPLaneLegTag) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type ChainType string
-
-const (
- ChainTypeEvm ChainType = "EVM"
- ChainTypeSolana ChainType = "SOLANA"
- ChainTypeStarknet ChainType = "STARKNET"
- ChainTypeAptos ChainType = "APTOS"
-
-)
-
-var AllChainType = []ChainType{
- ChainTypeEvm,
- ChainTypeSolana,
- ChainTypeStarknet,
- ChainTypeAptos,
-}
-
-func (e ChainType) IsValid() bool {
- switch e {
- case ChainTypeEvm, ChainTypeSolana, ChainTypeStarknet, ChainTypeAptos:
- return true
- }
- return false
-}
-
-func (e ChainType) String() string {
- return string(e)
-}
-
-func (e *ChainType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = ChainType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid ChainType", str)
- }
- return nil
-}
-
-func (e ChainType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type ContractOwnerType string
-
-const (
- ContractOwnerTypeSystem ContractOwnerType = "SYSTEM"
- ContractOwnerTypeExternal ContractOwnerType = "EXTERNAL"
- ContractOwnerTypeVault ContractOwnerType = "VAULT"
- ContractOwnerTypeNotOwnable ContractOwnerType = "NOT_OWNABLE"
-)
-
-var AllContractOwnerType = []ContractOwnerType{
- ContractOwnerTypeSystem,
- ContractOwnerTypeExternal,
- ContractOwnerTypeVault,
- ContractOwnerTypeNotOwnable,
-}
-
-func (e ContractOwnerType) IsValid() bool {
- switch e {
- case ContractOwnerTypeSystem, ContractOwnerTypeExternal, ContractOwnerTypeVault, ContractOwnerTypeNotOwnable:
- return true
- }
- return false
-}
-
-func (e ContractOwnerType) String() string {
- return string(e)
-}
-
-func (e *ContractOwnerType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = ContractOwnerType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid ContractOwnerType", str)
- }
- return nil
-}
-
-func (e ContractOwnerType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type ContractTag string
-
-const (
- ContractTagMain ContractTag = "MAIN"
- ContractTagTest ContractTag = "TEST"
- ContractTagUpgrade ContractTag = "UPGRADE"
- ContractTagDead ContractTag = "DEAD"
-)
-
-var AllContractTag = []ContractTag{
- ContractTagMain,
- ContractTagTest,
- ContractTagUpgrade,
- ContractTagDead,
-}
-
-func (e ContractTag) IsValid() bool {
- switch e {
- case ContractTagMain, ContractTagTest, ContractTagUpgrade, ContractTagDead:
- return true
- }
- return false
-}
-
-func (e ContractTag) String() string {
- return string(e)
-}
-
-func (e *ContractTag) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = ContractTag(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid ContractTag", str)
- }
- return nil
-}
-
-func (e ContractTag) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type ContractType string
-
-const (
- ContractTypeOcr1 ContractType = "OCR1"
- ContractTypeOcr2 ContractType = "OCR2"
-)
-
-var AllContractType = []ContractType{
- ContractTypeOcr1,
- ContractTypeOcr2,
-}
-
-func (e ContractType) IsValid() bool {
- switch e {
- case ContractTypeOcr1, ContractTypeOcr2:
- return true
- }
- return false
-}
-
-func (e ContractType) String() string {
- return string(e)
-}
-
-func (e *ContractType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = ContractType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid ContractType", str)
- }
- return nil
-}
-
-func (e ContractType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type DONExecutionType string
-
-const (
- DONExecutionTypeMercury DONExecutionType = "MERCURY"
- DONExecutionTypeMercuryV03 DONExecutionType = "MERCURY_V03"
- DONExecutionTypeAggregator DONExecutionType = "AGGREGATOR"
- DONExecutionTypeCcipCommit DONExecutionType = "CCIP_COMMIT"
- DONExecutionTypeCcipExecute DONExecutionType = "CCIP_EXECUTE"
- DONExecutionTypeKeystoneWorkflow DONExecutionType = "KEYSTONE_WORKFLOW"
-)
-
-var AllDONExecutionType = []DONExecutionType{
- DONExecutionTypeMercury,
- DONExecutionTypeMercuryV03,
- DONExecutionTypeAggregator,
- DONExecutionTypeCcipCommit,
- DONExecutionTypeCcipExecute,
- DONExecutionTypeKeystoneWorkflow,
-}
-
-func (e DONExecutionType) IsValid() bool {
- switch e {
- case DONExecutionTypeMercury, DONExecutionTypeMercuryV03, DONExecutionTypeAggregator, DONExecutionTypeCcipCommit, DONExecutionTypeCcipExecute, DONExecutionTypeKeystoneWorkflow:
- return true
- }
- return false
-}
-
-func (e DONExecutionType) String() string {
- return string(e)
-}
-
-func (e *DONExecutionType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = DONExecutionType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid DONExecutionType", str)
- }
- return nil
-}
-
-func (e DONExecutionType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type DeploymentStatus string
-
-const (
- DeploymentStatusPending DeploymentStatus = "PENDING"
- DeploymentStatusQueued DeploymentStatus = "QUEUED"
- DeploymentStatusInProgress DeploymentStatus = "IN_PROGRESS"
- DeploymentStatusCompleted DeploymentStatus = "COMPLETED"
- DeploymentStatusErrored DeploymentStatus = "ERRORED"
-)
-
-var AllDeploymentStatus = []DeploymentStatus{
- DeploymentStatusPending,
- DeploymentStatusQueued,
- DeploymentStatusInProgress,
- DeploymentStatusCompleted,
- DeploymentStatusErrored,
-}
-
-func (e DeploymentStatus) IsValid() bool {
- switch e {
- case DeploymentStatusPending, DeploymentStatusQueued, DeploymentStatusInProgress, DeploymentStatusCompleted, DeploymentStatusErrored:
- return true
- }
- return false
-}
-
-func (e DeploymentStatus) String() string {
- return string(e)
-}
-
-func (e *DeploymentStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = DeploymentStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid DeploymentStatus", str)
- }
- return nil
-}
-
-func (e DeploymentStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type FeedStatus string
-
-const (
- FeedStatusDraft FeedStatus = "DRAFT"
- FeedStatusReady FeedStatus = "READY"
-)
-
-var AllFeedStatus = []FeedStatus{
- FeedStatusDraft,
- FeedStatusReady,
-}
-
-func (e FeedStatus) IsValid() bool {
- switch e {
- case FeedStatusDraft, FeedStatusReady:
- return true
- }
- return false
-}
-
-func (e FeedStatus) String() string {
- return string(e)
-}
-
-func (e *FeedStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = FeedStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid FeedStatus", str)
- }
- return nil
-}
-
-func (e FeedStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type JobProposalStatus string
-
-const (
- JobProposalStatusProposed JobProposalStatus = "PROPOSED"
- JobProposalStatusApproved JobProposalStatus = "APPROVED"
- JobProposalStatusRejected JobProposalStatus = "REJECTED"
- JobProposalStatusAccepted JobProposalStatus = "ACCEPTED"
- JobProposalStatusPending JobProposalStatus = "PENDING"
-)
-
-var AllJobProposalStatus = []JobProposalStatus{
- JobProposalStatusProposed,
- JobProposalStatusApproved,
- JobProposalStatusRejected,
- JobProposalStatusAccepted,
- JobProposalStatusPending,
-}
-
-func (e JobProposalStatus) IsValid() bool {
- switch e {
- case JobProposalStatusProposed, JobProposalStatusApproved, JobProposalStatusRejected, JobProposalStatusAccepted, JobProposalStatusPending:
- return true
- }
- return false
-}
-
-func (e JobProposalStatus) String() string {
- return string(e)
-}
-
-func (e *JobProposalStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = JobProposalStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid JobProposalStatus", str)
- }
- return nil
-}
-
-func (e JobProposalStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type JobStatus string
-
-const (
- JobStatusDraft JobStatus = "DRAFT"
- JobStatusProposed JobStatus = "PROPOSED"
- JobStatusApproved JobStatus = "APPROVED"
- JobStatusRejected JobStatus = "REJECTED"
- JobStatusCancelled JobStatus = "CANCELLED"
- JobStatusDisabled JobStatus = "DISABLED"
- JobStatusDeleted JobStatus = "DELETED"
- JobStatusRevoked JobStatus = "REVOKED"
-)
-
-var AllJobStatus = []JobStatus{
- JobStatusDraft,
- JobStatusProposed,
- JobStatusApproved,
- JobStatusRejected,
- JobStatusCancelled,
- JobStatusDisabled,
- JobStatusDeleted,
- JobStatusRevoked,
-}
-
-func (e JobStatus) IsValid() bool {
- switch e {
- case JobStatusDraft, JobStatusProposed, JobStatusApproved, JobStatusRejected, JobStatusCancelled, JobStatusDisabled, JobStatusDeleted, JobStatusRevoked:
- return true
- }
- return false
-}
-
-func (e JobStatus) String() string {
- return string(e)
-}
-
-func (e *JobStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = JobStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid JobStatus", str)
- }
- return nil
-}
-
-func (e JobStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type JobType string
-
-const (
- JobTypeOffchainreporting JobType = "OFFCHAINREPORTING"
- JobTypeOffchainreporting2 JobType = "OFFCHAINREPORTING2"
- JobTypeBootstrap JobType = "BOOTSTRAP"
- JobTypeWorkflow JobType = "WORKFLOW"
-)
-
-var AllJobType = []JobType{
- JobTypeOffchainreporting,
- JobTypeOffchainreporting2,
- JobTypeBootstrap,
- JobTypeWorkflow,
-}
-
-func (e JobType) IsValid() bool {
- switch e {
- case JobTypeOffchainreporting, JobTypeOffchainreporting2, JobTypeBootstrap, JobTypeWorkflow:
- return true
- }
- return false
-}
-
-func (e JobType) String() string {
- return string(e)
-}
-
-func (e *JobType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = JobType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid JobType", str)
- }
- return nil
-}
-
-func (e JobType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type NetworkStackStatus string
-
-const (
- NetworkStackStatusReady NetworkStackStatus = "READY"
- NetworkStackStatusInProgress NetworkStackStatus = "IN_PROGRESS"
-)
-
-var AllNetworkStackStatus = []NetworkStackStatus{
- NetworkStackStatusReady,
- NetworkStackStatusInProgress,
-}
-
-func (e NetworkStackStatus) IsValid() bool {
- switch e {
- case NetworkStackStatusReady, NetworkStackStatusInProgress:
- return true
- }
- return false
-}
-
-func (e NetworkStackStatus) String() string {
- return string(e)
-}
-
-func (e *NetworkStackStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = NetworkStackStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid NetworkStackStatus", str)
- }
- return nil
-}
-
-func (e NetworkStackStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type NetworkStackType string
-
-const (
- NetworkStackTypeMain NetworkStackType = "MAIN"
- NetworkStackTypeAdditional NetworkStackType = "ADDITIONAL"
-)
-
-var AllNetworkStackType = []NetworkStackType{
- NetworkStackTypeMain,
- NetworkStackTypeAdditional,
-}
-
-func (e NetworkStackType) IsValid() bool {
- switch e {
- case NetworkStackTypeMain, NetworkStackTypeAdditional:
- return true
- }
- return false
-}
-
-func (e NetworkStackType) String() string {
- return string(e)
-}
-
-func (e *NetworkStackType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = NetworkStackType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid NetworkStackType", str)
- }
- return nil
-}
-
-func (e NetworkStackType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type OCR2PluginType string
-
-const (
- OCR2PluginTypeMedian OCR2PluginType = "MEDIAN"
- OCR2PluginTypeCcipCommit OCR2PluginType = "CCIP_COMMIT"
- OCR2PluginTypeCcipExecute OCR2PluginType = "CCIP_EXECUTE"
- OCR2PluginTypeCcipRebalancer OCR2PluginType = "CCIP_REBALANCER"
- OCR2PluginTypeMercury OCR2PluginType = "MERCURY"
-)
-
-var AllOCR2PluginType = []OCR2PluginType{
- OCR2PluginTypeMedian,
- OCR2PluginTypeCcipCommit,
- OCR2PluginTypeCcipExecute,
- OCR2PluginTypeCcipRebalancer,
- OCR2PluginTypeMercury,
-}
-
-func (e OCR2PluginType) IsValid() bool {
- switch e {
- case OCR2PluginTypeMedian, OCR2PluginTypeCcipCommit, OCR2PluginTypeCcipExecute, OCR2PluginTypeCcipRebalancer, OCR2PluginTypeMercury:
- return true
- }
- return false
-}
-
-func (e OCR2PluginType) String() string {
- return string(e)
-}
-
-func (e *OCR2PluginType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = OCR2PluginType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid OCR2PluginType", str)
- }
- return nil
-}
-
-func (e OCR2PluginType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type ProductType string
-
-const (
- ProductTypeDataFeeds ProductType = "DATA_FEEDS"
- ProductTypeDataStreamsV02 ProductType = "DATA_STREAMS_V02"
- ProductTypeDataStreamsV03 ProductType = "DATA_STREAMS_V03"
- ProductTypeCcip ProductType = "CCIP"
- ProductTypeWorkflow ProductType = "WORKFLOW"
- ProductTypeOcr3Capability ProductType = "OCR3_CAPABILITY"
-)
-
-var AllProductType = []ProductType{
- ProductTypeDataFeeds,
- ProductTypeDataStreamsV02,
- ProductTypeDataStreamsV03,
- ProductTypeCcip,
- ProductTypeWorkflow,
- ProductTypeOcr3Capability,
-}
-
-func (e ProductType) IsValid() bool {
- switch e {
- case ProductTypeDataFeeds, ProductTypeDataStreamsV02, ProductTypeDataStreamsV03, ProductTypeCcip, ProductTypeWorkflow, ProductTypeOcr3Capability:
- return true
- }
- return false
-}
-
-func (e ProductType) String() string {
- return string(e)
-}
-
-func (e *ProductType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = ProductType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid ProductType", str)
- }
- return nil
-}
-
-func (e ProductType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type ReportSchemaVersion string
-
-const (
- ReportSchemaVersionBasic ReportSchemaVersion = "BASIC"
- ReportSchemaVersionPremium ReportSchemaVersion = "PREMIUM"
- ReportSchemaVersionBlockBased ReportSchemaVersion = "BLOCK_BASED"
-)
-
-var AllReportSchemaVersion = []ReportSchemaVersion{
- ReportSchemaVersionBasic,
- ReportSchemaVersionPremium,
- ReportSchemaVersionBlockBased,
-}
-
-func (e ReportSchemaVersion) IsValid() bool {
- switch e {
- case ReportSchemaVersionBasic, ReportSchemaVersionPremium, ReportSchemaVersionBlockBased:
- return true
- }
- return false
-}
-
-func (e ReportSchemaVersion) String() string {
- return string(e)
-}
-
-func (e *ReportSchemaVersion) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = ReportSchemaVersion(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid ReportSchemaVersion", str)
- }
- return nil
-}
-
-func (e ReportSchemaVersion) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type SelectorOp string
-
-const (
- SelectorOpEq SelectorOp = "EQ"
- SelectorOpNotEq SelectorOp = "NOT_EQ"
- SelectorOpIn SelectorOp = "IN"
- SelectorOpNotIn SelectorOp = "NOT_IN"
- SelectorOpExist SelectorOp = "EXIST"
- SelectorOpNotExist SelectorOp = "NOT_EXIST"
-)
-
-var AllSelectorOp = []SelectorOp{
- SelectorOpEq,
- SelectorOpNotEq,
- SelectorOpIn,
- SelectorOpNotIn,
- SelectorOpExist,
- SelectorOpNotExist,
-}
-
-func (e SelectorOp) IsValid() bool {
- switch e {
- case SelectorOpEq, SelectorOpNotEq, SelectorOpIn, SelectorOpNotIn, SelectorOpExist, SelectorOpNotExist:
- return true
- }
- return false
-}
-
-func (e SelectorOp) String() string {
- return string(e)
-}
-
-func (e *SelectorOp) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = SelectorOp(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid SelectorOp", str)
- }
- return nil
-}
-
-func (e SelectorOp) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type TaskRunStatus string
-
-const (
- TaskRunStatusInProgress TaskRunStatus = "IN_PROGRESS"
- TaskRunStatusCompleted TaskRunStatus = "COMPLETED"
- TaskRunStatusErrored TaskRunStatus = "ERRORED"
-)
-
-var AllTaskRunStatus = []TaskRunStatus{
- TaskRunStatusInProgress,
- TaskRunStatusCompleted,
- TaskRunStatusErrored,
-}
-
-func (e TaskRunStatus) IsValid() bool {
- switch e {
- case TaskRunStatusInProgress, TaskRunStatusCompleted, TaskRunStatusErrored:
- return true
- }
- return false
-}
-
-func (e TaskRunStatus) String() string {
- return string(e)
-}
-
-func (e *TaskRunStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = TaskRunStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid TaskRunStatus", str)
- }
- return nil
-}
-
-func (e TaskRunStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type TokenPoolType string
-
-const (
- TokenPoolTypeLockRelease TokenPoolType = "LOCK_RELEASE"
- TokenPoolTypeLockReleaseAndProxy TokenPoolType = "LOCK_RELEASE_AND_PROXY"
- TokenPoolTypeBurnMint TokenPoolType = "BURN_MINT"
- TokenPoolTypeBurnMintAndProxy TokenPoolType = "BURN_MINT_AND_PROXY"
- TokenPoolTypeBurnFromMint TokenPoolType = "BURN_FROM_MINT"
- TokenPoolTypeBurnWithFromMint TokenPoolType = "BURN_WITH_FROM_MINT"
- TokenPoolTypeBurnWithFromMintAndProxy TokenPoolType = "BURN_WITH_FROM_MINT_AND_PROXY"
- TokenPoolTypeUsdc TokenPoolType = "USDC"
- TokenPoolTypeFeeTokenOnly TokenPoolType = "FEE_TOKEN_ONLY"
-)
-
-var AllTokenPoolType = []TokenPoolType{
- TokenPoolTypeLockRelease,
- TokenPoolTypeLockReleaseAndProxy,
- TokenPoolTypeBurnMint,
- TokenPoolTypeBurnMintAndProxy,
- TokenPoolTypeBurnFromMint,
- TokenPoolTypeBurnWithFromMint,
- TokenPoolTypeBurnWithFromMintAndProxy,
- TokenPoolTypeUsdc,
- TokenPoolTypeFeeTokenOnly,
-}
-
-func (e TokenPoolType) IsValid() bool {
- switch e {
- case TokenPoolTypeLockRelease, TokenPoolTypeLockReleaseAndProxy, TokenPoolTypeBurnMint, TokenPoolTypeBurnMintAndProxy, TokenPoolTypeBurnFromMint, TokenPoolTypeBurnWithFromMint, TokenPoolTypeBurnWithFromMintAndProxy, TokenPoolTypeUsdc, TokenPoolTypeFeeTokenOnly:
- return true
- }
- return false
-}
-
-func (e TokenPoolType) String() string {
- return string(e)
-}
-
-func (e *TokenPoolType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = TokenPoolType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid TokenPoolType", str)
- }
- return nil
-}
-
-func (e TokenPoolType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type TokenPriceType string
-
-const (
- TokenPriceTypeFixed TokenPriceType = "FIXED"
- TokenPriceTypeFeed TokenPriceType = "FEED"
-)
-
-var AllTokenPriceType = []TokenPriceType{
- TokenPriceTypeFixed,
- TokenPriceTypeFeed,
-}
-
-func (e TokenPriceType) IsValid() bool {
- switch e {
- case TokenPriceTypeFixed, TokenPriceTypeFeed:
- return true
- }
- return false
-}
-
-func (e TokenPriceType) String() string {
- return string(e)
-}
-
-func (e *TokenPriceType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = TokenPriceType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid TokenPriceType", str)
- }
- return nil
-}
-
-func (e TokenPriceType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type TransferOwnershipStatus string
-
-const (
- TransferOwnershipStatusNone TransferOwnershipStatus = "NONE"
- TransferOwnershipStatusProcessingTransaction TransferOwnershipStatus = "PROCESSING_TRANSACTION"
- TransferOwnershipStatusAwaitingConfirmation TransferOwnershipStatus = "AWAITING_CONFIRMATION"
- TransferOwnershipStatusError TransferOwnershipStatus = "ERROR"
-)
-
-var AllTransferOwnershipStatus = []TransferOwnershipStatus{
- TransferOwnershipStatusNone,
- TransferOwnershipStatusProcessingTransaction,
- TransferOwnershipStatusAwaitingConfirmation,
- TransferOwnershipStatusError,
-}
-
-func (e TransferOwnershipStatus) IsValid() bool {
- switch e {
- case TransferOwnershipStatusNone, TransferOwnershipStatusProcessingTransaction, TransferOwnershipStatusAwaitingConfirmation, TransferOwnershipStatusError:
- return true
- }
- return false
-}
-
-func (e TransferOwnershipStatus) String() string {
- return string(e)
-}
-
-func (e *TransferOwnershipStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = TransferOwnershipStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid TransferOwnershipStatus", str)
- }
- return nil
-}
-
-func (e TransferOwnershipStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type UserRole string
-
-const (
- UserRoleViewer UserRole = "VIEWER"
- UserRoleOps UserRole = "OPS"
- UserRoleMaintainer UserRole = "MAINTAINER"
- UserRoleAdmin UserRole = "ADMIN"
- UserRoleFoundation UserRole = "FOUNDATION"
- UserRoleDataProvider UserRole = "DATA_PROVIDER"
- UserRoleCcipValidator UserRole = "CCIP_VALIDATOR"
- UserRoleDataStreamsOps UserRole = "DATA_STREAMS_OPS"
-)
-
-var AllUserRole = []UserRole{
- UserRoleViewer,
- UserRoleOps,
- UserRoleMaintainer,
- UserRoleAdmin,
- UserRoleFoundation,
- UserRoleDataProvider,
- UserRoleCcipValidator,
- UserRoleDataStreamsOps,
-}
-
-func (e UserRole) IsValid() bool {
- switch e {
- case UserRoleViewer, UserRoleOps, UserRoleMaintainer, UserRoleAdmin, UserRoleFoundation, UserRoleDataProvider, UserRoleCcipValidator, UserRoleDataStreamsOps:
- return true
- }
- return false
-}
-
-func (e UserRole) String() string {
- return string(e)
-}
-
-func (e *UserRole) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = UserRole(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid UserRole", str)
- }
- return nil
-}
-
-func (e UserRole) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type VaultType string
-
-const (
- VaultTypeEoa VaultType = "EOA"
- VaultTypeSafe VaultType = "SAFE"
- VaultTypeTimelock VaultType = "TIMELOCK"
-)
-
-var AllVaultType = []VaultType{
- VaultTypeEoa,
- VaultTypeSafe,
- VaultTypeTimelock,
-}
-
-func (e VaultType) IsValid() bool {
- switch e {
- case VaultTypeEoa, VaultTypeSafe, VaultTypeTimelock:
- return true
- }
- return false
-}
-
-func (e VaultType) String() string {
- return string(e)
-}
-
-func (e *VaultType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = VaultType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid VaultType", str)
- }
- return nil
-}
-
-func (e VaultType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type VerificationStatus string
-
-const (
- VerificationStatusUnknown VerificationStatus = "UNKNOWN"
- VerificationStatusSuccess VerificationStatus = "SUCCESS"
- VerificationStatusPending VerificationStatus = "PENDING"
- VerificationStatusError VerificationStatus = "ERROR"
-)
-
-var AllVerificationStatus = []VerificationStatus{
- VerificationStatusUnknown,
- VerificationStatusSuccess,
- VerificationStatusPending,
- VerificationStatusError,
-}
-
-func (e VerificationStatus) IsValid() bool {
- switch e {
- case VerificationStatusUnknown, VerificationStatusSuccess, VerificationStatusPending, VerificationStatusError:
- return true
- }
- return false
-}
-
-func (e VerificationStatus) String() string {
- return string(e)
-}
-
-func (e *VerificationStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = VerificationStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid VerificationStatus", str)
- }
- return nil
-}
-
-func (e VerificationStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type WebhookCallState string
-
-const (
- WebhookCallStatePending WebhookCallState = "PENDING"
- WebhookCallStateSuccess WebhookCallState = "SUCCESS"
- WebhookCallStateError WebhookCallState = "ERROR"
- WebhookCallStateFailed WebhookCallState = "FAILED"
-)
-
-var AllWebhookCallState = []WebhookCallState{
- WebhookCallStatePending,
- WebhookCallStateSuccess,
- WebhookCallStateError,
- WebhookCallStateFailed,
-}
-
-func (e WebhookCallState) IsValid() bool {
- switch e {
- case WebhookCallStatePending, WebhookCallStateSuccess, WebhookCallStateError, WebhookCallStateFailed:
- return true
- }
- return false
-}
-
-func (e WebhookCallState) String() string {
- return string(e)
-}
-
-func (e *WebhookCallState) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = WebhookCallState(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid WebhookCallState", str)
- }
- return nil
-}
-
-func (e WebhookCallState) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type WorkflowRunStatus string
-
-const (
- WorkflowRunStatusPending WorkflowRunStatus = "PENDING"
- WorkflowRunStatusInProgress WorkflowRunStatus = "IN_PROGRESS"
- WorkflowRunStatusCompleted WorkflowRunStatus = "COMPLETED"
- WorkflowRunStatusErrored WorkflowRunStatus = "ERRORED"
-)
-
-var AllWorkflowRunStatus = []WorkflowRunStatus{
- WorkflowRunStatusPending,
- WorkflowRunStatusInProgress,
- WorkflowRunStatusCompleted,
- WorkflowRunStatusErrored,
-}
-
-func (e WorkflowRunStatus) IsValid() bool {
- switch e {
- case WorkflowRunStatusPending, WorkflowRunStatusInProgress, WorkflowRunStatusCompleted, WorkflowRunStatusErrored:
- return true
- }
- return false
-}
-
-func (e WorkflowRunStatus) String() string {
- return string(e)
-}
-
-func (e *WorkflowRunStatus) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = WorkflowRunStatus(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid WorkflowRunStatus", str)
- }
- return nil
-}
-
-func (e WorkflowRunStatus) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
-
-type WorkflowType string
-
-const (
- WorkflowTypeGeneric WorkflowType = "GENERIC"
-)
-
-var AllWorkflowType = []WorkflowType{
- WorkflowTypeGeneric,
-}
-
-func (e WorkflowType) IsValid() bool {
- switch e {
- case WorkflowTypeGeneric:
- return true
- }
- return false
-}
-
-func (e WorkflowType) String() string {
- return string(e)
-}
-
-func (e *WorkflowType) UnmarshalGQL(v interface{}) error {
- str, ok := v.(string)
- if !ok {
- return fmt.Errorf("enums must be strings")
- }
-
- *e = WorkflowType(str)
- if !e.IsValid() {
- return fmt.Errorf("%s is not a valid WorkflowType", str)
- }
- return nil
-}
-
-func (e WorkflowType) MarshalGQL(w io.Writer) {
- fmt.Fprint(w, strconv.Quote(e.String()))
-}
diff --git a/deployment/environment/clo/offchain_client_impl.go b/deployment/environment/clo/offchain_client_impl.go
deleted file mode 100644
index 2046a32f810..00000000000
--- a/deployment/environment/clo/offchain_client_impl.go
+++ /dev/null
@@ -1,271 +0,0 @@
-package clo
-
-import (
- "context"
- "fmt"
- "slices"
- "strings"
-
- "go.uber.org/zap"
- "google.golang.org/grpc"
-
- "github.com/smartcontractkit/chainlink-common/pkg/logger"
- csav1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/csa"
- jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job"
- nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node"
- "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes"
-
- "github.com/smartcontractkit/chainlink/deployment/environment/clo/models"
-)
-
-type JobClient struct {
- NodeOperators []*models.NodeOperator `json:"nodeOperators"`
- nodesByID map[string]*models.Node
- lggr logger.Logger
-}
-
-func (j JobClient) BatchProposeJob(ctx context.Context, in *jobv1.BatchProposeJobRequest, opts ...grpc.CallOption) (*jobv1.BatchProposeJobResponse, error) {
- //TODO implement me
- panic("implement me")
-}
-
-func (j JobClient) UpdateJob(ctx context.Context, in *jobv1.UpdateJobRequest, opts ...grpc.CallOption) (*jobv1.UpdateJobResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) DisableNode(ctx context.Context, in *nodev1.DisableNodeRequest, opts ...grpc.CallOption) (*nodev1.DisableNodeResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) EnableNode(ctx context.Context, in *nodev1.EnableNodeRequest, opts ...grpc.CallOption) (*nodev1.EnableNodeResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) RegisterNode(ctx context.Context, in *nodev1.RegisterNodeRequest, opts ...grpc.CallOption) (*nodev1.RegisterNodeResponse, error) {
- //TODO implement me
- panic("implement me")
-}
-
-func (j JobClient) UpdateNode(ctx context.Context, in *nodev1.UpdateNodeRequest, opts ...grpc.CallOption) (*nodev1.UpdateNodeResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) GetKeypair(ctx context.Context, in *csav1.GetKeypairRequest, opts ...grpc.CallOption) (*csav1.GetKeypairResponse, error) {
- //TODO implement me
- panic("implement me")
-}
-
-func (j JobClient) ListKeypairs(ctx context.Context, in *csav1.ListKeypairsRequest, opts ...grpc.CallOption) (*csav1.ListKeypairsResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) GetNode(ctx context.Context, in *nodev1.GetNodeRequest, opts ...grpc.CallOption) (*nodev1.GetNodeResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) ListNodes(ctx context.Context, in *nodev1.ListNodesRequest, opts ...grpc.CallOption) (*nodev1.ListNodesResponse, error) {
- include := func(node *nodev1.Node) bool {
- if in.Filter == nil {
- return true
- }
- if len(in.Filter.Ids) > 0 {
- idx := slices.IndexFunc(in.Filter.Ids, func(id string) bool {
- return node.Id == id
- })
- if idx < 0 {
- return false
- }
- }
- for _, selector := range in.Filter.Selectors {
- idx := slices.IndexFunc(node.Labels, func(label *ptypes.Label) bool {
- return label.Key == selector.Key
- })
- if idx < 0 {
- return false
- }
- label := node.Labels[idx]
-
- switch selector.Op {
- case ptypes.SelectorOp_IN:
- values := strings.Split(*selector.Value, ",")
- found := slices.Contains(values, *label.Value)
- if !found {
- return false
- }
- default:
- panic("unimplemented selector")
- }
- }
- return true
- }
- var nodes []*nodev1.Node
- for _, nop := range j.NodeOperators {
- for _, n := range nop.Nodes {
- p2pId, err := NodeP2PId(n)
- if err != nil {
- return nil, fmt.Errorf("failed to get p2p id for node %s: %w", n.ID, err)
- }
- node := &nodev1.Node{
- Id: n.ID,
- Name: n.Name,
- PublicKey: *n.PublicKey,
- IsEnabled: n.Enabled,
- IsConnected: n.Connected,
- Labels: []*ptypes.Label{
- {
- Key: "p2p_id",
- Value: &p2pId, // here n.ID is also peer ID
- },
- },
- }
- if include(node) {
- nodes = append(nodes, node)
- }
- }
- }
- return &nodev1.ListNodesResponse{
- Nodes: nodes,
- }, nil
-}
-
-func (j JobClient) ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNodeChainConfigsRequest, opts ...grpc.CallOption) (*nodev1.ListNodeChainConfigsResponse, error) {
-
- resp := &nodev1.ListNodeChainConfigsResponse{
- ChainConfigs: make([]*nodev1.ChainConfig, 0),
- }
- // no filter, return all
- if in.Filter == nil || len(in.Filter.NodeIds) == 0 {
- for _, n := range j.nodesByID {
- ccfg := cloNodeToChainConfigs(n)
- resp.ChainConfigs = append(resp.ChainConfigs, ccfg...)
- }
- } else {
- for _, want := range in.Filter.NodeIds {
- n, ok := j.nodesByID[want]
- if !ok {
- j.lggr.Warn("node not found", zap.String("node_id", want))
- continue
- }
- ccfg := cloNodeToChainConfigs(n)
- resp.ChainConfigs = append(resp.ChainConfigs, ccfg...)
- }
- }
- return resp, nil
-
-}
-
-func (j JobClient) GetJob(ctx context.Context, in *jobv1.GetJobRequest, opts ...grpc.CallOption) (*jobv1.GetJobResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) GetProposal(ctx context.Context, in *jobv1.GetProposalRequest, opts ...grpc.CallOption) (*jobv1.GetProposalResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) ListJobs(ctx context.Context, in *jobv1.ListJobsRequest, opts ...grpc.CallOption) (*jobv1.ListJobsResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) ListProposals(ctx context.Context, in *jobv1.ListProposalsRequest, opts ...grpc.CallOption) (*jobv1.ListProposalsResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) ProposeJob(ctx context.Context, in *jobv1.ProposeJobRequest, opts ...grpc.CallOption) (*jobv1.ProposeJobResponse, error) {
- panic("implement me")
-
-}
-
-func (j JobClient) RevokeJob(ctx context.Context, in *jobv1.RevokeJobRequest, opts ...grpc.CallOption) (*jobv1.RevokeJobResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-func (j JobClient) DeleteJob(ctx context.Context, in *jobv1.DeleteJobRequest, opts ...grpc.CallOption) (*jobv1.DeleteJobResponse, error) {
- //TODO CCIP-3108 implement me
- panic("implement me")
-}
-
-type GetNodeOperatorsResponse struct {
- NodeOperators []*models.NodeOperator `json:"nodeOperators"`
-}
-
-type JobClientConfig struct {
- Nops []*models.NodeOperator
-}
-
-func NewJobClient(lggr logger.Logger, cfg JobClientConfig) *JobClient {
-
- c := &JobClient{
- NodeOperators: cfg.Nops,
- nodesByID: make(map[string]*models.Node),
- lggr: lggr,
- }
- for _, nop := range c.NodeOperators {
- for _, n := range nop.Nodes {
- node := n
- c.nodesByID[n.ID] = node // maybe should use the public key instead?
- }
- }
- return c
-}
-
-func cloNodeToChainConfigs(n *models.Node) []*nodev1.ChainConfig {
- out := make([]*nodev1.ChainConfig, 0)
- for _, ccfg := range n.ChainConfigs {
- out = append(out, cloChainCfgToJDChainCfg(ccfg))
- }
- return out
-}
-
-func cloChainCfgToJDChainCfg(ccfg *models.NodeChainConfig) *nodev1.ChainConfig {
- var ctype nodev1.ChainType
- switch ccfg.Network.ChainType {
- case models.ChainTypeEvm:
- ctype = nodev1.ChainType_CHAIN_TYPE_EVM
- case models.ChainTypeSolana:
- ctype = nodev1.ChainType_CHAIN_TYPE_SOLANA
- case models.ChainTypeStarknet:
- ctype = nodev1.ChainType_CHAIN_TYPE_STARKNET
- case models.ChainTypeAptos:
- ctype = nodev1.ChainType_CHAIN_TYPE_APTOS
- default:
- panic(fmt.Sprintf("Unsupported chain family %v", ccfg.Network.ChainType))
- }
-
- return &nodev1.ChainConfig{
- Chain: &nodev1.Chain{
- Id: ccfg.Network.ChainID,
- Type: ctype,
- },
- AccountAddress: ccfg.AccountAddress,
- AdminAddress: ccfg.AdminAddress,
- // only care about ocr2 for now
- Ocr2Config: &nodev1.OCR2Config{
- Enabled: ccfg.Ocr2Config.Enabled,
- IsBootstrap: ccfg.Ocr2Config.IsBootstrap,
- P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{
- PeerId: ccfg.Ocr2Config.P2pKeyBundle.PeerID,
- PublicKey: ccfg.Ocr2Config.P2pKeyBundle.PublicKey,
- },
- OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{
- BundleId: ccfg.Ocr2Config.OcrKeyBundle.BundleID,
- ConfigPublicKey: ccfg.Ocr2Config.OcrKeyBundle.ConfigPublicKey,
- OffchainPublicKey: ccfg.Ocr2Config.OcrKeyBundle.OffchainPublicKey,
- OnchainSigningAddress: ccfg.Ocr2Config.OcrKeyBundle.OnchainSigningAddress,
- },
- // TODO: the clo cli does not serialize this field, so it will always be nil
- //Multiaddr: *ccfg.Ocr2Config.Multiaddr,
- //ForwarderAddress: ccfg.Ocr2Config.ForwarderAddress,
- },
- }
-}
diff --git a/deployment/environment/clo/offchain_client_impl_test.go b/deployment/environment/clo/offchain_client_impl_test.go
deleted file mode 100644
index f2d6fcf6f41..00000000000
--- a/deployment/environment/clo/offchain_client_impl_test.go
+++ /dev/null
@@ -1,677 +0,0 @@
-package clo_test
-
-import (
- "context"
- "encoding/json"
- "reflect"
- "testing"
-
- "github.com/test-go/testify/require"
- "google.golang.org/grpc"
-
- nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node"
- "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes"
- "github.com/smartcontractkit/chainlink/deployment/environment/clo"
- "github.com/smartcontractkit/chainlink/deployment/environment/clo/models"
- "github.com/smartcontractkit/chainlink/v2/core/logger"
-)
-
-var (
- p2pid_1 = "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE7807807807"
- p2pid_2 = "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE6868686868"
- p2pid_3 = "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE9999999999"
- p2pid_4 = "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE1000000000"
-)
-
-var testNops = `
-[
- {
- "id": "67",
- "name": "Chainlink Keystone Node Operator 9",
- "nodes": [
- {
- "id": "780",
- "name": "Chainlink Sepolia Prod Keystone One 9",
- "publicKey": "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431",
- "connected": true,
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM"
- },
- "ocr2Config": {
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE7807807807"
- }
- }
- }
- ],
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ]
- }
- ],
- "createdAt": "2024-08-14T19:00:07.113658Z"
- },
- {
- "id": "68",
- "name": "Chainlink Keystone Node Operator 8",
- "nodes": [
- {
- "id": "781",
- "name": "Chainlink Sepolia Prod Keystone One 8",
- "publicKey": "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc",
- "connected": true,
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM"
- },
- "ocr2Config": {
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE6868686868"
- }
- }
- }
- ],
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ]
- }
- ],
- "createdAt": "2024-08-14T20:26:37.622463Z"
- },
- {
- "id": "999",
- "name": "Chainlink Keystone Node Operator 100",
- "nodes": [
- {
- "id": "999",
- "name": "Chainlink Sepolia Prod Keystone One 999",
- "publicKey": "9991dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58999999",
- "connected": true,
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM"
- },
- "ocr2Config": {
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE9999999999"
- }
- }
- }
- ],
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ]
- },
- {
- "id": "1000",
- "name": "Chainlink Sepolia Prod Keystone One 1000",
- "publicKey": "1000101e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58641000",
- "connected": true,
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM"
- },
- "ocr2Config": {
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE1000000000"
- }
- }
- }
- ],
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ]
- }
- ],
- "createdAt": "2024-08-14T20:26:37.622463Z"
- }
-]
-`
-
-func parseTestNops(t *testing.T) []*models.NodeOperator {
- t.Helper()
- var out []*models.NodeOperator
- err := json.Unmarshal([]byte(testNops), &out)
- require.NoError(t, err)
- require.Len(t, out, 3, "wrong number of nops")
- return out
-}
-func TestJobClient_ListNodes(t *testing.T) {
- lggr := logger.TestLogger(t)
- nops := parseTestNops(t)
-
- type fields struct {
- NodeOperators []*models.NodeOperator
- RemapNodeIDsToPeerIDs bool
- }
- type args struct {
- ctx context.Context
- in *nodev1.ListNodesRequest
- opts []grpc.CallOption
- }
- tests := []struct {
- name string
- fields fields
- args args
- want *nodev1.ListNodesResponse
- wantErr bool
- }{
- {
- name: "empty",
- fields: fields{
- NodeOperators: make([]*models.NodeOperator, 0),
- },
- args: args{
- ctx: context.Background(),
- in: &nodev1.ListNodesRequest{},
- },
- want: &nodev1.ListNodesResponse{},
- },
- {
- name: "one node from one nop",
- fields: fields{
- NodeOperators: nops[0:1],
- },
- args: args{
- ctx: context.Background(),
- in: &nodev1.ListNodesRequest{},
- },
- want: &nodev1.ListNodesResponse{
- Nodes: []*nodev1.Node{
- {
- Id: "780",
- Name: "Chainlink Sepolia Prod Keystone One 9",
- PublicKey: "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431",
- IsConnected: true,
- Labels: []*ptypes.Label{
- {
- Key: "p2p_id",
- Value: &p2pid_1,
- },
- },
- },
- },
- },
- },
- {
- name: "two nops each with one node",
- fields: fields{
- NodeOperators: nops[0:2],
- },
- args: args{
- ctx: context.Background(),
- in: &nodev1.ListNodesRequest{},
- },
- want: &nodev1.ListNodesResponse{
- Nodes: []*nodev1.Node{
- {
- Id: "780",
- Name: "Chainlink Sepolia Prod Keystone One 9",
- PublicKey: "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431",
- IsConnected: true,
- Labels: []*ptypes.Label{
- {
- Key: "p2p_id",
- Value: &p2pid_1,
- },
- },
- },
- {
- Id: "781",
- Name: "Chainlink Sepolia Prod Keystone One 8",
- PublicKey: "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc",
- IsConnected: true,
- Labels: []*ptypes.Label{
- {
- Key: "p2p_id",
- Value: &p2pid_2,
- },
- },
- },
- },
- },
- },
- {
- name: "two nodes from one nop",
- fields: fields{
- NodeOperators: nops[2:3],
- },
- args: args{
- ctx: context.Background(),
- in: &nodev1.ListNodesRequest{},
- },
- want: &nodev1.ListNodesResponse{
- Nodes: []*nodev1.Node{
- {
- Id: "999",
- Name: "Chainlink Sepolia Prod Keystone One 999",
- PublicKey: "9991dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58999999",
- IsConnected: true,
- Labels: []*ptypes.Label{
- {
- Key: "p2p_id",
- Value: &p2pid_3,
- },
- },
- },
- {
- Id: "1000",
- Name: "Chainlink Sepolia Prod Keystone One 1000",
- PublicKey: "1000101e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58641000",
- IsConnected: true,
- Labels: []*ptypes.Label{
- {
- Key: "p2p_id",
- Value: &p2pid_4,
- },
- },
- },
- },
- },
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- j := clo.NewJobClient(lggr, clo.JobClientConfig{Nops: tt.fields.NodeOperators})
-
- got, err := j.ListNodes(tt.args.ctx, tt.args.in, tt.args.opts...)
- if (err != nil) != tt.wantErr {
- t.Errorf("JobClient.ListNodes() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- if !reflect.DeepEqual(got, tt.want) {
- t.Errorf("JobClient.ListNodes() = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
-var testNopsWithChainConfigs = `
-[
- {
- "id": "67",
- "keys": [
- "keystone-09"
- ],
- "name": "Chainlink Keystone Node Operator 9",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "780",
- "name": "Chainlink Sepolia Prod Keystone One 9",
- "publicKey": "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9"
- },
- "ocrKeyBundle": {
- "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x0b04cE574E80Da73191Ec141c0016a54A6404056",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9"
- },
- "ocrKeyBundle": {
- "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T19:00:07.113658Z"
- },
- {
- "id": "68",
- "keys": [
- "keystone-08"
- ],
- "name": "Chainlink Keystone Node Operator 8",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "781",
- "name": "Chainlink Sepolia Prod Keystone One 8",
- "publicKey": "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xEa4bC3638660D78Da56f39f6680dCDD0cEAaD2c6",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c",
- "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829"
- },
- "ocrKeyBundle": {
- "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3",
- "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264",
- "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70",
- "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x31B179dcF8f9036C30f04bE578793e51bF14A39E",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c",
- "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829"
- },
- "ocrKeyBundle": {
- "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3",
- "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264",
- "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70",
- "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:26:37.622463Z"
- }
-]`
-
-func TestJobClient_ListNodeChainConfigs(t *testing.T) {
- nops := parseTestNopsWithChainConfigs(t)
- lggr := logger.TestLogger(t)
- type fields struct {
- NodeOperators []*models.NodeOperator
- }
- type args struct {
- ctx context.Context
- in *nodev1.ListNodeChainConfigsRequest
- opts []grpc.CallOption
- }
- tests := []struct {
- name string
- fields fields
- args args
- want *nodev1.ListNodeChainConfigsResponse
- wantErr bool
- }{
- {
- name: "empty",
- fields: fields{
- NodeOperators: make([]*models.NodeOperator, 0),
- },
- args: args{
- ctx: context.Background(),
- in: &nodev1.ListNodeChainConfigsRequest{},
- },
- want: &nodev1.ListNodeChainConfigsResponse{
- ChainConfigs: make([]*nodev1.ChainConfig, 0),
- },
- },
-
- {
- name: "no matching nodes",
- fields: fields{
- NodeOperators: nops,
- },
- args: args{
- ctx: context.Background(),
- in: &nodev1.ListNodeChainConfigsRequest{
- Filter: &nodev1.ListNodeChainConfigsRequest_Filter{
- NodeIds: []string{"not-a-node-id"},
- },
- },
- },
- want: &nodev1.ListNodeChainConfigsResponse{
- ChainConfigs: make([]*nodev1.ChainConfig, 0),
- },
- },
-
- {
- name: "one nop with one node that has two chain configs",
- fields: fields{
- NodeOperators: nops[0:1],
- },
- args: args{
- ctx: context.Background(),
- in: &nodev1.ListNodeChainConfigsRequest{},
- },
- want: &nodev1.ListNodeChainConfigsResponse{
- ChainConfigs: []*nodev1.ChainConfig{
- {
- Chain: &nodev1.Chain{
- Id: "421614",
- Type: nodev1.ChainType_CHAIN_TYPE_EVM,
- },
- AccountAddress: "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB",
- AdminAddress: "0x0000000000000000000000000000000000000000",
- Ocr2Config: &nodev1.OCR2Config{
- Enabled: true,
- P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{
- PeerId: "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- PublicKey: "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9",
- },
- OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{
- BundleId: "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- ConfigPublicKey: "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- OffchainPublicKey: "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- OnchainSigningAddress: "679296b7c1eb4948efcc87efc550940a182e610c",
- },
- },
- },
- {
- Chain: &nodev1.Chain{
- Id: "11155111",
- Type: nodev1.ChainType_CHAIN_TYPE_EVM,
- },
- AccountAddress: "0x0b04cE574E80Da73191Ec141c0016a54A6404056",
- AdminAddress: "0x0000000000000000000000000000000000000000",
- Ocr2Config: &nodev1.OCR2Config{
- Enabled: true,
- P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{
- PeerId: "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- PublicKey: "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9",
- },
- OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{
- BundleId: "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- ConfigPublicKey: "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- OffchainPublicKey: "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- OnchainSigningAddress: "679296b7c1eb4948efcc87efc550940a182e610c",
- },
- },
- },
- },
- },
- },
-
- {
- name: "one nop with one node that has two chain configs matching the filter",
- fields: fields{
- NodeOperators: nops,
- },
- args: args{
- ctx: context.Background(),
- in: &nodev1.ListNodeChainConfigsRequest{
- Filter: &nodev1.ListNodeChainConfigsRequest_Filter{
- NodeIds: []string{"780"},
- },
- },
- },
- want: &nodev1.ListNodeChainConfigsResponse{
- ChainConfigs: []*nodev1.ChainConfig{
- {
- Chain: &nodev1.Chain{
- Id: "421614",
- Type: nodev1.ChainType_CHAIN_TYPE_EVM,
- },
- AccountAddress: "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB",
- AdminAddress: "0x0000000000000000000000000000000000000000",
- Ocr2Config: &nodev1.OCR2Config{
- Enabled: true,
- P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{
- PeerId: "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- PublicKey: "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9",
- },
- OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{
- BundleId: "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- ConfigPublicKey: "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- OffchainPublicKey: "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- OnchainSigningAddress: "679296b7c1eb4948efcc87efc550940a182e610c",
- },
- },
- },
- {
- Chain: &nodev1.Chain{
- Id: "11155111",
- Type: nodev1.ChainType_CHAIN_TYPE_EVM,
- },
- AccountAddress: "0x0b04cE574E80Da73191Ec141c0016a54A6404056",
- AdminAddress: "0x0000000000000000000000000000000000000000",
- Ocr2Config: &nodev1.OCR2Config{
- Enabled: true,
- P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{
- PeerId: "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- PublicKey: "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9",
- },
- OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{
- BundleId: "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- ConfigPublicKey: "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- OffchainPublicKey: "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- OnchainSigningAddress: "679296b7c1eb4948efcc87efc550940a182e610c",
- },
- },
- },
- },
- },
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- j := clo.NewJobClient(lggr, clo.JobClientConfig{Nops: tt.fields.NodeOperators})
-
- got, err := j.ListNodeChainConfigs(tt.args.ctx, tt.args.in, tt.args.opts...)
- if (err != nil) != tt.wantErr {
- t.Errorf("JobClient.ListNodeChainConfigs() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- if !reflect.DeepEqual(got, tt.want) {
- t.Errorf("JobClient.ListNodeChainConfigs() = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
-func parseTestNopsWithChainConfigs(t *testing.T) []*models.NodeOperator {
- t.Helper()
- var out []*models.NodeOperator
- err := json.Unmarshal([]byte(testNopsWithChainConfigs), &out)
- require.NoError(t, err)
- require.Len(t, out, 2, "wrong number of nops")
- return out
-}
diff --git a/deployment/environment/clo/testdata/keystone_nops.json b/deployment/environment/clo/testdata/keystone_nops.json
deleted file mode 100644
index 679a85935a4..00000000000
--- a/deployment/environment/clo/testdata/keystone_nops.json
+++ /dev/null
@@ -1,3162 +0,0 @@
-[
- {
- "id": "67",
- "keys": [
- "keystone-09"
- ],
- "name": "Chainlink Keystone Node Operator 9",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "780",
- "name": "Chainlink Sepolia Prod Keystone One 9",
- "publicKey": "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9"
- },
- "ocrKeyBundle": {
- "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x0b04cE574E80Da73191Ec141c0016a54A6404056",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9"
- },
- "ocrKeyBundle": {
- "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "818",
- "name": "Chainlink Sepolia Prod Keystone Cap One 9",
- "publicKey": "3f5bbcb4b0409e6ea39d824f1837787484475fffb12e5e4a70509756ef6c7f9a",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x9b74f08bD7269919C0597C0E00e70ef2A66829db",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz",
- "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f"
- },
- "ocrKeyBundle": {
- "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf",
- "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44",
- "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c",
- "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x662B6B119f7fc9Dc2A526395A9EA88AE79A1192F",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz",
- "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f"
- },
- "ocrKeyBundle": {
- "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf",
- "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44",
- "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c",
- "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x34431021e0E07c75816226697Af6Ef02725e36af",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz",
- "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f"
- },
- "ocrKeyBundle": {
- "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf",
- "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44",
- "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c",
- "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xB5988d5d9ADd3d98CF45211bE37cf9b3372054C9",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz",
- "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f"
- },
- "ocrKeyBundle": {
- "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf",
- "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44",
- "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c",
- "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T19:00:07.113658Z"
- },
- {
- "id": "68",
- "keys": [
- "keystone-08"
- ],
- "name": "Chainlink Keystone Node Operator 8",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "781",
- "name": "Chainlink Sepolia Prod Keystone One 8",
- "publicKey": "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xEa4bC3638660D78Da56f39f6680dCDD0cEAaD2c6",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c",
- "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829"
- },
- "ocrKeyBundle": {
- "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3",
- "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264",
- "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70",
- "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x31B179dcF8f9036C30f04bE578793e51bF14A39E",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c",
- "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829"
- },
- "ocrKeyBundle": {
- "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3",
- "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264",
- "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70",
- "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "817",
- "name": "Chainlink Sepolia Prod Keystone Cap One 8",
- "publicKey": "2346da196a82c88fe6c315d2e4d0dddacf4590a172b20adb6f27a8601ca0540d",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xa5C7133aBD35F9d742bD2997D693A507c5eBf4Ac",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT",
- "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690"
- },
- "ocrKeyBundle": {
- "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2",
- "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713",
- "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139",
- "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x9fd869f5baADb79F9b7C58c0855fcAc0384e1d4B",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT",
- "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690"
- },
- "ocrKeyBundle": {
- "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2",
- "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713",
- "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139",
- "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0xe477E4C2e335E9b839665d710dE77CFECa9C43A7",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT",
- "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690"
- },
- "ocrKeyBundle": {
- "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2",
- "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713",
- "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139",
- "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x056A1275DD670205aba10D8fC9bB597777a65030",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT",
- "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690"
- },
- "ocrKeyBundle": {
- "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2",
- "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713",
- "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139",
- "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:26:37.622463Z"
- },
- {
- "id": "69",
- "keys": [
- "keystone-07"
- ],
- "name": "Chainlink Keystone Node Operator 7",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "782",
- "name": "Chainlink Sepolia Prod Keystone One 7",
- "publicKey": "b473091fe1d4dbbc26ad71c67b4432f8f4280e06bab5e2122a92f4ab8b6ff2f5",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x65bE4739E187a39b859766C143b569acd5BE234d",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC",
- "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1"
- },
- "ocrKeyBundle": {
- "bundleID": "e6d6ffec6cff01ac20d57bc42626c8e955293f232d383bf468351d867a7b8213",
- "configPublicKey": "4d2f75f98b911c20fe7808384312d8b913e6b7a98c34d05c6e461434c92b4502",
- "offchainPublicKey": "01496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3",
- "onchainSigningAddress": "213803bb9f9715379aaf11aadb0212369701dc0a"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x9ad9f3AD49e5aB0F28bD694d211a90297bD90D7f",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC",
- "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1"
- },
- "ocrKeyBundle": {
- "bundleID": "e6d6ffec6cff01ac20d57bc42626c8e955293f232d383bf468351d867a7b8213",
- "configPublicKey": "4d2f75f98b911c20fe7808384312d8b913e6b7a98c34d05c6e461434c92b4502",
- "offchainPublicKey": "01496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3",
- "onchainSigningAddress": "213803bb9f9715379aaf11aadb0212369701dc0a"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "816",
- "name": "Chainlink Sepolia Prod Keystone Cap One 7",
- "publicKey": "50d4e3393516d1998e5c39874d7c0da2291e4e3727f8baac4380e9f5573cc648",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x0ba7c1096B701A862bBCe7F13E9D33eED7e33c1D",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb",
- "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e"
- },
- "ocrKeyBundle": {
- "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd",
- "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c",
- "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f",
- "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0xcC44eD47023Bd88B82092A708c38609e8Fc2D197",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb",
- "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e"
- },
- "ocrKeyBundle": {
- "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd",
- "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c",
- "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f",
- "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x0E8F4E699cd331022FaA2Ad75E500e70303C8767",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb",
- "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e"
- },
- "ocrKeyBundle": {
- "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd",
- "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c",
- "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f",
- "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x49c36b3BEc6b6e0e77305273FAFC68f479630535",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb",
- "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e"
- },
- "ocrKeyBundle": {
- "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd",
- "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c",
- "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f",
- "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:30:51.07624Z"
- },
- {
- "id": "70",
- "keys": [
- "keystone-06"
- ],
- "name": "Chainlink Keystone Node Operator 6",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "783",
- "name": "Chainlink Sepolia Prod Keystone One 6",
- "publicKey": "75ac63fc97a31e31168084e0de8ccd2bea90059b609d962f3e43fc296cdba28d",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x8706E716fc1ee972F3E4D42D42711Aa175Aa654A",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn",
- "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31"
- },
- "ocrKeyBundle": {
- "bundleID": "62d36269d916b4834b17dc6d637c1c39b0895396249a0845764c898e83f63525",
- "configPublicKey": "8c6c7d889ac6cc9e663ae48073bbf130fae105d6a3689636db27752e3e3e6816",
- "offchainPublicKey": "aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d",
- "onchainSigningAddress": "4885973b2fcf061d5cdfb8f74c5139bd3056e9da"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x19e10B063a62B1574AE19020A64fDe6419892dA6",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn",
- "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31"
- },
- "ocrKeyBundle": {
- "bundleID": "62d36269d916b4834b17dc6d637c1c39b0895396249a0845764c898e83f63525",
- "configPublicKey": "8c6c7d889ac6cc9e663ae48073bbf130fae105d6a3689636db27752e3e3e6816",
- "offchainPublicKey": "aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d",
- "onchainSigningAddress": "4885973b2fcf061d5cdfb8f74c5139bd3056e9da"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "815",
- "name": "Chainlink Sepolia Prod Keystone Cap One 6",
- "publicKey": "2669981add3071fae5dfd760fe97e7d2b90157f86b40227f306f1f3906099fc3",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x405eE4ad3E79786f899810ff6de16a83A920Db5D",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu",
- "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98"
- },
- "ocrKeyBundle": {
- "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b",
- "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c",
- "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3",
- "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x58D39d629ae9f904b0Ae509179b9e7c9B0184cee",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu",
- "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98"
- },
- "ocrKeyBundle": {
- "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b",
- "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c",
- "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3",
- "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x34bFe10F4f4e1101b019639ABd5E5eE5186B80E6",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu",
- "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98"
- },
- "ocrKeyBundle": {
- "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b",
- "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c",
- "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3",
- "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x1741EB7468A490b4A9BA6f4CC7A47B82EcD65c4c",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu",
- "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98"
- },
- "ocrKeyBundle": {
- "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b",
- "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c",
- "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3",
- "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:32:14.024795Z"
- },
- {
- "id": "71",
- "keys": [
- "keystone-05"
- ],
- "name": "Chainlink Keystone Node Operator 5",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "784",
- "name": "Chainlink Sepolia Prod Keystone One 5",
- "publicKey": "4542f4fd2ed150c8c976b39802fe3d994aec3ac94fd11e7817f693b1c9a1dabb",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xcea9f5C042130dD35Eff5B5a6E2361A0276570e3",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ",
- "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6"
- },
- "ocrKeyBundle": {
- "bundleID": "99fad0362cc8dc8a57a8e616e68133a6d5a8834e08a1b4819710f0e912df5abc",
- "configPublicKey": "36de4924cf11938b4461aea1ce99cb640e9603d9a7c294ab6c54acd51d575a49",
- "offchainPublicKey": "283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8",
- "onchainSigningAddress": "657587eb55cecd6f90b97297b611c3024e488cc0"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xdAd1F3F8ec690cf335D46c50EdA5547CeF875161",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ",
- "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6"
- },
- "ocrKeyBundle": {
- "bundleID": "99fad0362cc8dc8a57a8e616e68133a6d5a8834e08a1b4819710f0e912df5abc",
- "configPublicKey": "36de4924cf11938b4461aea1ce99cb640e9603d9a7c294ab6c54acd51d575a49",
- "offchainPublicKey": "283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8",
- "onchainSigningAddress": "657587eb55cecd6f90b97297b611c3024e488cc0"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "814",
- "name": "Chainlink Sepolia Prod Keystone Cap One 5",
- "publicKey": "94e9ee398547f1564b8b5f72c6148e511919ed0e59b94ae848d63685108f2ab4",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xbd1ee3165178D3A3E38458a9Fb1d6BF7fb5C443e",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1",
- "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0"
- },
- "ocrKeyBundle": {
- "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13",
- "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a",
- "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5",
- "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x9b6284B5775E46fB02C1a589596EF07c35b55377",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1",
- "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0"
- },
- "ocrKeyBundle": {
- "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13",
- "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a",
- "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5",
- "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0xD83DCED517E4df64e913B97b3d0A906e4CA63d43",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1",
- "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0"
- },
- "ocrKeyBundle": {
- "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13",
- "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a",
- "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5",
- "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xFF1218066b4b5Cd9dE2A73639862082bcC98bf0D",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1",
- "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0"
- },
- "ocrKeyBundle": {
- "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13",
- "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a",
- "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5",
- "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:38:35.588611Z"
- },
- {
- "id": "72",
- "keys": [
- "keystone-04"
- ],
- "name": "Chainlink Keystone Node Operator 4",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "785",
- "name": "Chainlink Sepolia Prod Keystone One 4",
- "publicKey": "07e0ffc57b6263604df517b94bd986169451a3c90600a855bb19212dc575de54",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x0be7Df958604166D9Bf0F727F0AC7A4Fb0f5B8a1",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg",
- "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed"
- },
- "ocrKeyBundle": {
- "bundleID": "8e563a16ec5a802345b162d0f31149e8d5055014a31847d7b20d6de500aa48bd",
- "configPublicKey": "c812eab2415f45cc1d2afdb2be2e3ea419bb7851acfc30c07b4df42c856e8f74",
- "offchainPublicKey": "2a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde",
- "onchainSigningAddress": "a6f35436cb7bffd615cc47a0a04aa0a78696a144"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x6F5cAb24Fb7412bB516b3468b9F3a9c471d25fE5",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg",
- "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed"
- },
- "ocrKeyBundle": {
- "bundleID": "8e563a16ec5a802345b162d0f31149e8d5055014a31847d7b20d6de500aa48bd",
- "configPublicKey": "c812eab2415f45cc1d2afdb2be2e3ea419bb7851acfc30c07b4df42c856e8f74",
- "offchainPublicKey": "2a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde",
- "onchainSigningAddress": "a6f35436cb7bffd615cc47a0a04aa0a78696a144"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "813",
- "name": "Chainlink Sepolia Prod Keystone Cap One 4",
- "publicKey": "a618fe2d3260151957d105d2dd593dddaad20c45dc6ae8eab265504e6585a02c",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xE73E4D047DA32De40C7008075aEb9F60C8AF3C90",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT",
- "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2"
- },
- "ocrKeyBundle": {
- "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b",
- "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878",
- "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6",
- "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x7501ff3462fd2133f2E1F93DB7Ec514988B43E56",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT",
- "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2"
- },
- "ocrKeyBundle": {
- "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b",
- "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878",
- "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6",
- "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0xef080765890a3F697C4920609621fe301Dd34A70",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT",
- "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2"
- },
- "ocrKeyBundle": {
- "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b",
- "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878",
- "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6",
- "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x860235D5Db42eF568665900BBD6bA3DB2fA4f33f",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT",
- "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2"
- },
- "ocrKeyBundle": {
- "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b",
- "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878",
- "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6",
- "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:39:26.24249Z"
- },
- {
- "id": "73",
- "keys": [
- "keystone-03",
- "keystone-bt-03"
- ],
- "name": "Chainlink Keystone Node Operator 3",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "786",
- "name": "\tChainlink Sepolia Prod Keystone One 3",
- "publicKey": "487901e0c0a9d3c66e7cfc50f3a9e3cdbfdf1b0107273d73d94a91d278545516",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x3Be73A57a36E5ab00DcceD755B4bfF8bb99e52b2",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT",
- "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6"
- },
- "ocrKeyBundle": {
- "bundleID": "8843b5db0608f92dac38ca56775766a08db9ee82224a19595d04bd6c58b38fbd",
- "configPublicKey": "63375a3d175364bd299e7cecf352cb3e469dd30116cf1418f2b7571fb46c4a4b",
- "offchainPublicKey": "b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed55709127",
- "onchainSigningAddress": "6607c140e558631407f33bafbabd103863cee876"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xA9eFB53c513E413762b2Be5299D161d8E6e7278e",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT",
- "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6"
- },
- "ocrKeyBundle": {
- "bundleID": "8843b5db0608f92dac38ca56775766a08db9ee82224a19595d04bd6c58b38fbd",
- "configPublicKey": "63375a3d175364bd299e7cecf352cb3e469dd30116cf1418f2b7571fb46c4a4b",
- "offchainPublicKey": "b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed55709127",
- "onchainSigningAddress": "6607c140e558631407f33bafbabd103863cee876"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "812",
- "name": "Chainlink Sepolia Prod Keystone Cap One 3",
- "publicKey": "f4cf97438c3ad86003e5c0368ab52c70f7fbb7f39ae0d7bf6dacbe16807e8a36",
- "chainConfigs": [
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x646665317aF70313B3E83Ea1369A91de389DaCAe",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM",
- "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600"
- },
- "ocrKeyBundle": {
- "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd",
- "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e",
- "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439",
- "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x3Ab2A4e4765A0374F727a9a9eCE893734e2928ec",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM",
- "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600"
- },
- "ocrKeyBundle": {
- "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd",
- "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e",
- "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439",
- "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x9905E8C3A4f82037170a8c411CD8b11D4894066f",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM",
- "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600"
- },
- "ocrKeyBundle": {
- "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd",
- "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e",
- "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439",
- "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x762354eC86ea2253F5da27FF8b952Cb7Dec52B6D",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM",
- "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600"
- },
- "ocrKeyBundle": {
- "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd",
- "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e",
- "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439",
- "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:40:30.499914Z"
- },
- {
- "id": "74",
- "keys": [
- "keystone-02",
- "keystone-bt-02"
- ],
- "name": "Chainlink Keystone Node Operator 2",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "787",
- "name": "Chainlink Sepolia Prod Keystone One 2",
- "publicKey": "7a166fbc816eb4a4dcb620d11c3ccac5c085d56b1972374100116f87619debb8",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x693bf95A3ef46E5dABe17d1A89dB1E83948aeD88",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo",
- "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c"
- },
- "ocrKeyBundle": {
- "bundleID": "1d20490fe469dd6af3d418cc310a6e835181fa13e8dc80156bcbe302b7afcd34",
- "configPublicKey": "ee466234b3b2f65b13c848b17aa6a8d4e0aa0311d3bf8e77a64f20b04ed48d39",
- "offchainPublicKey": "dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3",
- "onchainSigningAddress": "d4dcc573e9d24a8b27a07bba670ba3a2ab36e5bb"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xCea84bC1881F3cE14BA13Dc3a00DC1Ff3D553fF0",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo",
- "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c"
- },
- "ocrKeyBundle": {
- "bundleID": "1d20490fe469dd6af3d418cc310a6e835181fa13e8dc80156bcbe302b7afcd34",
- "configPublicKey": "ee466234b3b2f65b13c848b17aa6a8d4e0aa0311d3bf8e77a64f20b04ed48d39",
- "offchainPublicKey": "dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3",
- "onchainSigningAddress": "d4dcc573e9d24a8b27a07bba670ba3a2ab36e5bb"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "811",
- "name": "Chainlink Sepolia Prod Keystone Cap One 2",
- "publicKey": "a1f112923513f13ede1ca8f982ea0ab6221d584b40cd57f0c82307ab79c0e69f",
- "chainConfigs": [
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0xbF1Ad47D99A65e230235537b47C8D1Dddb22FD53",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA",
- "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed"
- },
- "ocrKeyBundle": {
- "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037",
- "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700",
- "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37",
- "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0xa8d4698f74a0A427c1b8ec4575d9dFdD17Be288c",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA",
- "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed"
- },
- "ocrKeyBundle": {
- "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037",
- "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700",
- "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37",
- "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xf286c79b4a613a1fE480C8e4fB17B837E7D8ba03",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA",
- "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed"
- },
- "ocrKeyBundle": {
- "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037",
- "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700",
- "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37",
- "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xfe85A25cE2CB58b280CC0316305fC678Bf570f5e",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA",
- "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed"
- },
- "ocrKeyBundle": {
- "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037",
- "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700",
- "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37",
- "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:41:33.205484Z"
- },
- {
- "id": "75",
- "keys": [
- "keystone-01",
- "keystone-bt-01"
- ],
- "name": "Chainlink Keystone Node Operator 1",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "788",
- "name": "Chainlink Sepolia Prod Keystone One 1",
- "publicKey": "28b91143ec9111796a7d63e14c1cf6bb01b4ed59667ab54f5bc72ebe49c881be",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xe45a754B30FdE9852A826F58c6bd94Fa6554CE96",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v",
- "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3"
- },
- "ocrKeyBundle": {
- "bundleID": "7a9b75510b8d09932b98142419bef52436ff725dd9395469473b487ef87fdfb0",
- "configPublicKey": "2c45fec2320f6bcd36444529a86d9f8b4439499a5d8272dec9bcbbebb5e1bf01",
- "offchainPublicKey": "255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8",
- "onchainSigningAddress": "8258f4c4761cc445333017608044a204fd0c006a"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x415aa1E9a1bcB3929ed92bFa1F9735Dc0D45AD31",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v",
- "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3"
- },
- "ocrKeyBundle": {
- "bundleID": "7a9b75510b8d09932b98142419bef52436ff725dd9395469473b487ef87fdfb0",
- "configPublicKey": "2c45fec2320f6bcd36444529a86d9f8b4439499a5d8272dec9bcbbebb5e1bf01",
- "offchainPublicKey": "255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8",
- "onchainSigningAddress": "8258f4c4761cc445333017608044a204fd0c006a"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "810",
- "name": "Chainlink Sepolia Prod Keystone Cap One 1",
- "publicKey": "9ef27cd1855a0ed6932be33c80d7cd9c178307e5a240dbeb9055946359dc5d7f",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xBB465BCa1b289269F2a95a36f5B6fD006Af56ede",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf",
- "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c"
- },
- "ocrKeyBundle": {
- "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067",
- "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c",
- "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c",
- "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x5e3618cFF8Ab337b3c73c2775d1a2EC65e5abEF0",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf",
- "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c"
- },
- "ocrKeyBundle": {
- "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067",
- "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c",
- "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c",
- "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x1796BbC2AbbAd5660C8a7812b313E1f48A99f1D1",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf",
- "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c"
- },
- "ocrKeyBundle": {
- "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067",
- "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c",
- "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c",
- "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xA2bfAc45e6878fbE04525C23dFbb11fFb224Ea60",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf",
- "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c"
- },
- "ocrKeyBundle": {
- "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067",
- "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c",
- "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c",
- "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:42:05.709664Z"
- },
- {
- "id": "76",
- "keys": [
- "keystone-00",
- "keystone-bt-00"
- ],
- "name": "Chainlink Keystone Node Operator 0",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "789",
- "name": "Chainlink Sepolia Prod Keystone One 0",
- "publicKey": "403b72f0b1b3b5f5a91bcfedb7f28599767502a04b5b7e067fcf3782e23eeb9c",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x1a04C6b4b1A45D20356F93DcE7931F765955BAa7",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv",
- "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b"
- },
- "ocrKeyBundle": {
- "bundleID": "665a101d79d310cb0a5ebf695b06e8fc8082b5cbe62d7d362d80d47447a31fea",
- "configPublicKey": "5193f72fc7b4323a86088fb0acb4e4494ae351920b3944bd726a59e8dbcdd45f",
- "offchainPublicKey": "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1",
- "onchainSigningAddress": "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x2877F08d9c5Cc9F401F730Fa418fAE563A9a2FF3",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv",
- "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b"
- },
- "ocrKeyBundle": {
- "bundleID": "665a101d79d310cb0a5ebf695b06e8fc8082b5cbe62d7d362d80d47447a31fea",
- "configPublicKey": "5193f72fc7b4323a86088fb0acb4e4494ae351920b3944bd726a59e8dbcdd45f",
- "offchainPublicKey": "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1",
- "onchainSigningAddress": "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- },
- {
- "id": "809",
- "name": "Chainlink Sepolia Prod Keystone Cap One 0",
- "publicKey": "545197637db59b96b22528ff90960b9e7cdcea81c8a5a9f06ae6b728bcba35cb",
- "chainConfigs": [
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x66a88b0a23D8351e8F5e228eEe8439e65F423842",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH",
- "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e"
- },
- "ocrKeyBundle": {
- "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef",
- "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e",
- "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e",
- "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x36a46774A3743641D4C274b385608Cb455B5B6b8",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH",
- "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e"
- },
- "ocrKeyBundle": {
- "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef",
- "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e",
- "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e",
- "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x868ab67c00fF7e21aFf470C066798e5bE4240305",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH",
- "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e"
- },
- "ocrKeyBundle": {
- "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef",
- "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e",
- "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e",
- "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xa60bC482fCfcd12B752541a00555E4e448Bc1d16",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH",
- "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e"
- },
- "ocrKeyBundle": {
- "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef",
- "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e",
- "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e",
- "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:42:49.446864Z"
- },
- {
- "id": "81",
- "keys": [
- "cl-df-asset-don-testnet-0"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 0",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 18
- },
- "nodes": [
- {
- "id": "831",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 0",
- "publicKey": "d791dad33f1aeff811f3364088993053d5d08fa595ba48f73aecd4ee2d5035a1",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xe826b8D7f57b1c08E2d0C9477006244AECB280c3",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWDh47EiK5TzG4yApEEwLecgRkqZKQif3fcnsztfhQNzNh",
- "publicKey": "398f42d12c7f3445341e42ce4ea555c87d84db68c808c76a0655e5d993d7a2a6"
- },
- "ocrKeyBundle": {
- "bundleID": "c8dee638c00194cf38bd0c30306fffd14b561601828085ceaaf0ab5fe451ec23",
- "configPublicKey": "dbd5d1f5aa4921fd1e7b16f26dc75aff5cc08fee6e74324e947654ba78791e7e",
- "offchainPublicKey": "66a599cda37e6fb5dc50e16d7c81e6967e010a25bbeaabf20752e228a26f5bc3",
- "onchainSigningAddress": "9184c1c20da57f2f747a60909d0152c289e8518f"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:19:34.127102Z"
- },
- {
- "id": "82",
- "keys": [
- "cl-df-asset-don-testnet-1"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 1",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "832",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 1",
- "publicKey": "eb410038ba7847a729c4e40c1d4afdbcce9ad33cc71e459883cd98f0883a5366",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xCE154165b0d60D1efA9b3c7a172ED77712Cb82f9",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWG7WEsQjxXQdn5WAEQSDh77qxjMoWxz3rGYrRC9pPB7qx",
- "publicKey": "5d8a1f11ecd0cd2cdd95fec35b8ea6386af567bc96aa2c2ea47e91d22b1f12bf"
- },
- "ocrKeyBundle": {
- "bundleID": "a6dda044db7fa1fa652ec9ff60a44fb31ee99d33db35599848b21e34ce33c343",
- "configPublicKey": "586fb9935401e8907ead91e7a3423a0c0676d4669bac619f71c99913e14b362a",
- "offchainPublicKey": "9557c0c4c6c8aeb41ecaa84f0aa7d0e1be7ffa9e4a08da27b23bd64b2d0c0fe9",
- "onchainSigningAddress": "bd3e16dda612f543c0f79fafc03fa35f3f300e30"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:19:48.159926Z"
- },
- {
- "id": "83",
- "keys": [
- "cl-df-asset-don-testnet-2"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 2",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "833",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 2",
- "publicKey": "daf14b79caa585c3dacf550688aeed5371f8fd39cbfb6e33add2fb82538626b0",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xbb16a69A7bb8778dc52a2D081EE1B2Dde0237F3b",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBWms38viHaptUHTXXNdN4Qm2ZxDWtuaZviZtq1WzWWcq",
- "publicKey": "1935b60309f79e7fd1bfd4736df5729b7532bcd435be2a707dd28519e9ae6e6a"
- },
- "ocrKeyBundle": {
- "bundleID": "9c63a332ff254cd2cda8bcf2c3f0e46ee95d4991595019619a0c60907437d98c",
- "configPublicKey": "29b9b6f61db8e72df13e17e274bdf5450987953079b9dee2745f2d288dc7e86d",
- "offchainPublicKey": "c3b08d0b68baf68da2c8446f6a9dc552af3ab2014b900d75ca9e2122b6fc9eb0",
- "onchainSigningAddress": "cb66494d66922ad00708bce7c83ada133ddb8994"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:20:01.151494Z"
- },
- {
- "id": "84",
- "keys": [
- "cl-df-asset-don-testnet-3"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 3",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "834",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 3",
- "publicKey": "0e1f9462a8b326d746fde2d5016faa9f2e017f7e6e5969aaf3281519d2e31dbc",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xA64f65e0c12ab015792c34867BE5b80b4D4C551A",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMhHZTVHz23gCQAEzFyeBLxR9ghVqMQHk18VND4TbAc1U",
- "publicKey": "b07bf77b2b1d8964915d4871b4cd0173e13bc1d0590731a8969393a6e80aef8f"
- },
- "ocrKeyBundle": {
- "bundleID": "87770ad41d54661a6dee424612f4338b49cd4fd20bdab1f11c308c76efeb56f8",
- "configPublicKey": "dd0edc91d1476a0a4c554e8fe8050dadba679ba42f53973bf181d85eed1b6821",
- "offchainPublicKey": "2ba2cc779c8e1460d9ff823d594708a344bb7a9d84aa3aa3833d539852511a88",
- "onchainSigningAddress": "5e5b1a602c5a79ec6cdeb67e6f855d58061f785f"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:20:10.382565Z"
- },
- {
- "id": "85",
- "keys": [
- "cl-df-asset-don-testnet-4"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 4",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "835",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 4",
- "publicKey": "1d5f6ef3443e48bd471efdb47a5b9c6c900a14f35253c2b562908186f5b8b457",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x7284bBa5C8090Ac99d55b14db015a291C017275c",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMrkkbkFYJydLhcYKr8AnxNcNGmwfVXMQGdn8uoSpYoJs",
- "publicKey": "b2e8f0b25c7334e8082cb82eee29bc4f48ae086b8fe4a2fd5eb4e08195a0e06c"
- },
- "ocrKeyBundle": {
- "bundleID": "1ceac31d893d21e95a62419d94b1a88805fa4f056b1636ccd79ab0ca8b4fe68c",
- "configPublicKey": "4c94f49461fd0fd9d4da5cda4590a2cf80fba2ea27c422b92ee18a3aaaa51321",
- "offchainPublicKey": "d1649b393614e01811979340d2726280f9ea57fd7a1ee28958adbbaf71b41bf5",
- "onchainSigningAddress": "e47d17607054e9899d3fb7fa5b4b3e01b85b8fc9"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:20:21.050174Z"
- },
- {
- "id": "86",
- "keys": [
- "cl-df-asset-don-testnet-5"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 5",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "837",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 5",
- "publicKey": "d87dfbb7444036e0654578afdb11864e31a0de1824ca2780f24b16116a85463d",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x6c75DB65540ca889803a092d4C1497D3337cDE30",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWH8q69DtEqahJdwKfYXnkRHHH6E4jTqevZSAZzGsrnsTB",
- "publicKey": "6cbcb3cc0a48ec9d94bb1424beea5e1b7cf57fda2dbfc519afd9221cbeac3b8e"
- },
- "ocrKeyBundle": {
- "bundleID": "6e088c00e61fea95a5a808a56e7e55c58ec0d61c3207383a2c63abc705bd120c",
- "configPublicKey": "0728ce40c95155853ecd31bc213ed2b39d4ecf2e62dc95334f008181ad010848",
- "offchainPublicKey": "521d4c291fe8ef245b2e497982b0a07127cd3c65439a10784d914e03ba24328d",
- "onchainSigningAddress": "d32a6ed4be6656fd988a0e43e71ce43fab3faba4"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:21:21.831183Z"
- },
- {
- "id": "87",
- "keys": [
- "cl-df-asset-don-testnet-6"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 6",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "838",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 6",
- "publicKey": "294f58723d4049af0dcd63eedfcda957287401a10070db509ede7a799bb70654",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xa2788731913cc2deBC061F8594AEaa8e99B4FCCE",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWD7URmTzSeotMvEzkJTiFrwUHhcGMBeaS9GY8763Sqqnf",
- "publicKey": "30f502f9fb19b54e8644f038f57f9a43582f76b86bace61759fff12886ccf1a8"
- },
- "ocrKeyBundle": {
- "bundleID": "57bc2a8a62ed96e6aa7b9bbe56f93abeef938a1766cb8a6d18e42ebf71101646",
- "configPublicKey": "36c882b0cdcec84aa85f00ea43cd31254406cec84d31f6dded69b4fbb3f17449",
- "offchainPublicKey": "46951e1e18cee25cd417b3fa7feb25fb53623a249e1c09491bb978dccc2ea76e",
- "onchainSigningAddress": "abcd8be3952a84fb10947dbeb768a255ead58ca2"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:21:34.93501Z"
- },
- {
- "id": "88",
- "keys": [
- "cl-df-asset-don-testnet-7"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 7",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "839",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 7",
- "publicKey": "55b0ec5d90de973c00efce233334a9d3c5a94062ea010575bb248eb6804a9cfe",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x14dAF00DaD855089A6586690d5C1fD2779302736",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBbo44H5CLACV3yGyDWrtMuSWRdN5sQcDsnPC4WfLr6Jo",
- "publicKey": "1a7ef5e7420434fcf06de3d15a0191f7499e00e15427679616ce800779ceb514"
- },
- "ocrKeyBundle": {
- "bundleID": "f87acde2c1c21e8859d84813034d84a3f3bb1d49596e13ac66731d50750b9436",
- "configPublicKey": "e75f21bc1dc6eac12358277caf18a216ed54f8dc84285941ef1f5fb1047f8d5b",
- "offchainPublicKey": "c7b86dfbdf31a3b13c44305cd6fc88c402653198201006083414223ffc36950d",
- "onchainSigningAddress": "93fbb113f191959f8ab5e052395676e0038f2f1f"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:21:45.063449Z"
- },
- {
- "id": "89",
- "keys": [
- "cl-df-asset-don-testnet-8"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 8",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "840",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 8",
- "publicKey": "8f9f327ac7ad823a0f3297f3505591bcd40adc8fb1309f99874c26663cbd5914",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xb0C0168905C07F00A141494eaeFc0bD9F153fc16",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWGVroAehJh33SBns9MohmctNPZSDh89KRQM1J6TSCnT1v",
- "publicKey": "63442493270891409900afd3bb868d03fd07c775bb38c56e56a624b674a68b35"
- },
- "ocrKeyBundle": {
- "bundleID": "4413e0a3080c3dfa7709b16c3ee68c04359e2dd66d107fd3be6ba7c615c4b3b6",
- "configPublicKey": "8f3975b19fc6f02e241119b2132331ed9ed0d19221bd0cfd6f54b5859090a741",
- "offchainPublicKey": "f4f182c889668d8951932c49e1ffb1252b8a33a9875d3f19aea7bb805b65c7a6",
- "onchainSigningAddress": "b257e9efe637f38b5462a170737571ea0f0e2e05"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:21:55.09098Z"
- },
- {
- "id": "90",
- "keys": [
- "cl-df-asset-don-testnet-9"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 9",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "841",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 9",
- "publicKey": "1d79884071dfec1f39dc62f4868f4a143ae39cb03ad9d14142b184686c2b5a93",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x2F5E08a5b9D893e9dA2d68Ef605fBa6f8Ebfd0cB",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWEBn9tWmMWrSxRZe2VQ56RcSHRUPdcFoD3Ep88wqTT9zP",
- "publicKey": "40eb109d9f28e8754dfff419a9175d6714405907413d2f77657355721c3b2bd0"
- },
- "ocrKeyBundle": {
- "bundleID": "6d4da72b1daad0b9ea47a7daa6cde81c1608b7bd199c05b18b989d10c5d7b99e",
- "configPublicKey": "7e1c66bfa23c270770401d0dd739adad5a52827ecb40a0668f7e014d53f38059",
- "offchainPublicKey": "712561a10b1f7dd96f0ae0f0d3e6cdf83fdd0837d333cf9bbae0090126ae7f39",
- "onchainSigningAddress": "2ef8cea7dae7bd1e876a59a44ca59b89adf8abb4"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:22:09.476108Z"
- },
- {
- "id": "91",
- "keys": [
- "cl-df-asset-don-testnet-10"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 10",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "842",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 10",
- "publicKey": "cf6c47ad934518f5947ce8f1a48c2df8c93bd585788a3a82229fd4d723efa706",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x4794743bB8f159954Efa31642609ebfD4D2b9EdC",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNXZCbQe4Ao7KEciJGY6Ec4oZLZNGcMTPyZ7XpFhLPyLo",
- "publicKey": "bcd987b3b2b20d9effe30598850ddfd33023339dab012c4aee4cdc4246111bfc"
- },
- "ocrKeyBundle": {
- "bundleID": "a8d9929327d89cfabd8c583d250dfddbc14e947e9253f7471191886ca5197786",
- "configPublicKey": "a1a390e756bce818d1786dca6ba3e45013085087e5a3be6253d8bbbd6479255a",
- "offchainPublicKey": "76522fec251ce6130c03a816025f2054eb3ac83b7d30347f42b73a77e7b9a511",
- "onchainSigningAddress": "179d48901e5e9c3c11dd947c001f8a2ee887c8eb"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:22:30.732346Z"
- },
- {
- "id": "92",
- "keys": [
- "cl-df-asset-don-testnet-11"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 11",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "843",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 11",
- "publicKey": "c239c23670224558a64ea3165eae8d67a17b75b1874fbccf8a4dd98e953820ad",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x27AFd92F391dFD7BA1bbC89e3bd13ceC9A667c11",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWSSzLfwq7QSdJcpDLFiBznA1XR58dwg1xre4b88SbP7VF",
- "publicKey": "f71ccc7f7b73f1499f72987679a94a11e8564f01415acdb958c008c5bfe21eae"
- },
- "ocrKeyBundle": {
- "bundleID": "3e691b13aa702631fba25f6e128a566bdff3982cc3438af29acc2a819b9d6e02",
- "configPublicKey": "149d81dce137d0874b477ad6c19dc72801f335200622fa34f1c660623febed22",
- "offchainPublicKey": "b0d0d8e3c62abc7236e6539413ef82e568dd24f0c39ff6e8e2babe513590a522",
- "onchainSigningAddress": "a0f2feab4d03899eb2e830bd4abc3fd5babef3e1"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:22:42.314654Z"
- },
- {
- "id": "93",
- "keys": [
- "cl-df-asset-don-testnet-12"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 12",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "844",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 12",
- "publicKey": "71b29eb63daa6ac2e48b46669936eff5606879b102bae78afc929554c435dd0b",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x13d5b27d71B4C4697874177Ff43DEB1884Cff49e",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWT1LMqEW51UfxBynzjYjuybQzVkmf4rH9js9e16QAbU3X",
- "publicKey": "ff66057a6c96779134a6527364cddcce43b69e3d1820f59dde5e6b38d1d32fde"
- },
- "ocrKeyBundle": {
- "bundleID": "4854ee3fc7ac4591eea33c5d0d1cefd4ad819d2c374a2f86267a9999228a967a",
- "configPublicKey": "470225644f274147b5b80c862a3f3cd7a19fed4ff915e9c18ac80e06003ecc6a",
- "offchainPublicKey": "e7d89e196f5f6d92f4c42ab34f9a2f21f3201314be65b819872c4609b87866c7",
- "onchainSigningAddress": "c84f2f60ccb1d7e6c6e4ae4bc3cab8bb85db8977"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:22:52.838595Z"
- },
- {
- "id": "94",
- "keys": [
- "cl-df-asset-don-testnet-13"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 13",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "845",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 13",
- "publicKey": "c098264a552125355804b903de06400621f2d1de357c2bed94586727fe8a3502",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x5647A091F2a09915c1C0F6ac95630Be87114881F",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWRjg2KoP6jKVWU2BczeduWsdnfN69tHN2YGEAGtETvc9P",
- "publicKey": "ec87467a512f8218bb63f7fcf46cf0b8fd8ebb14bd5f3b670908d505a5af801a"
- },
- "ocrKeyBundle": {
- "bundleID": "20626049a1e24912a14d186645ba70fea4860efcc987b3ec7c9ddc881b5057db",
- "configPublicKey": "d84d4653db0caca062d4058e9937ae618a53bbd1b41a673c5f13bebc24e7aa3a",
- "offchainPublicKey": "156c8ab52099386377fe27bbd50dafa368ff2790245f1407579f590b0bae7a1e",
- "onchainSigningAddress": "4f4b7bff5d32d62326b575d8c951d34e54888e31"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:23:19.587619Z"
- },
- {
- "id": "95",
- "keys": [
- "cl-df-asset-don-testnet-14"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 14",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "846",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 14",
- "publicKey": "12681ec137cd2d25e7c71638f564404dd764061921c870bbcddf683d048eed21",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x0419E70d32c3972930c99aaaDF20dCB473c56d22",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCdEG68z5kwYuD1xp1aJsFBtpw2HYh1K3ffVM6keVrJnT",
- "publicKey": "29b8bafebdef5e11ec3556fbcacdfb626d2f80cf178406e38664775e8b1ace78"
- },
- "ocrKeyBundle": {
- "bundleID": "80b1304898d5cea3c684790a0f01158468c7fa7770675edef33e4b137232ddc9",
- "configPublicKey": "15552ecb6ff10103a534f02594a7b7cbab686d76d5e7b32a9c67059e8c856861",
- "offchainPublicKey": "b561b7df3bdfe70f1af9395dbc00ef796774aa352c9a30d9c7e2f7e74d438073",
- "onchainSigningAddress": "fb1ca65bf473b4443d7359becc0de67a2d96228d"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:23:44.73219Z"
- },
- {
- "id": "96",
- "keys": [
- "cl-df-asset-don-testnet-15"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 15",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "847",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 15",
- "publicKey": "a9a5d084f9cbbbd291eb43c33dd137cd6140e33c53cebb260463bf52795ec579",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x931900764a585D7a01e500976B630B4747216c8c",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQyZ9A9ScBpcoRww1gJVBNB2brNkjJhaqze6ehuv6bmfQ",
- "publicKey": "e139f020ae4bc9efaa77da9cfd54339d36176479028f849b9e64ad2cf29acba3"
- },
- "ocrKeyBundle": {
- "bundleID": "5c1c69eb1d6619b2c9b93bdfdd9c1b87c28101d6fc88bf7979ad52ceda459908",
- "configPublicKey": "33f2107ab22b3dd5c19d5de0c5b1e6e038f2275ba455eed7997485caec421925",
- "offchainPublicKey": "bb91b077c135cbdd1f4422c6021cf56d78326710c8bb8c4a87b3e7415e48915f",
- "onchainSigningAddress": "b94e3de607033d03e3f0cc3ef1f09edd2592b440"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:24:01.875231Z"
- }
-]
\ No newline at end of file
diff --git a/deployment/environment/clo/utils.go b/deployment/environment/clo/utils.go
deleted file mode 100644
index 67be141a6db..00000000000
--- a/deployment/environment/clo/utils.go
+++ /dev/null
@@ -1,101 +0,0 @@
-package clo
-
-import (
- "fmt"
-
- jd "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node"
- "github.com/smartcontractkit/chainlink/deployment/environment/clo/models"
-)
-
-// NewChainConfig creates a new JobDistributor ChainConfig from a clo model NodeChainConfig
-func NewChainConfig(chain *models.NodeChainConfig) *jd.ChainConfig {
- return &jd.ChainConfig{
- Chain: &jd.Chain{
- Id: chain.Network.ChainID,
- Type: jd.ChainType_CHAIN_TYPE_EVM, // TODO: support other chain types
- },
-
- AccountAddress: chain.AccountAddress,
- AdminAddress: chain.AdminAddress,
- Ocr2Config: &jd.OCR2Config{
- Enabled: chain.Ocr2Config.Enabled,
- P2PKeyBundle: &jd.OCR2Config_P2PKeyBundle{
- PeerId: chain.Ocr2Config.P2pKeyBundle.PeerID,
- PublicKey: chain.Ocr2Config.P2pKeyBundle.PublicKey,
- },
- OcrKeyBundle: &jd.OCR2Config_OCRKeyBundle{
- BundleId: chain.Ocr2Config.OcrKeyBundle.BundleID,
- OnchainSigningAddress: chain.Ocr2Config.OcrKeyBundle.OnchainSigningAddress,
- OffchainPublicKey: chain.Ocr2Config.OcrKeyBundle.OffchainPublicKey,
- ConfigPublicKey: chain.Ocr2Config.OcrKeyBundle.ConfigPublicKey,
- },
- },
- }
-}
-
-func NodeP2PId(n *models.Node) (string, error) {
- p2pIds := make(map[string]struct{})
- for _, cc := range n.ChainConfigs {
- if cc.Ocr2Config != nil && cc.Ocr2Config.P2pKeyBundle != nil {
- p2pIds[cc.Ocr2Config.P2pKeyBundle.PeerID] = struct{}{}
- }
- }
- if len(p2pIds) == 0 {
- return "", fmt.Errorf("no p2p id found for node %s", n.ID)
- }
- if len(p2pIds) > 1 {
- return "", fmt.Errorf("multiple p2p ids found for node %s", n.ID)
- }
- var p2pId string
- for k := range p2pIds {
- p2pId = k
- break
- }
- return p2pId, nil
-}
-
-func NodesToPeerIDs(nodes []*models.Node) ([]string, error) {
- var p2pIds []string
- for _, node := range nodes {
- p2pId, err := NodeP2PId(node)
- if err != nil {
- return nil, err
- }
- p2pIds = append(p2pIds, p2pId)
- }
- return p2pIds, nil
-}
-
-func NopsToNodes(nops []*models.NodeOperator) []*models.Node {
- var nodes []*models.Node
- for _, nop := range nops {
- nodes = append(nodes, nop.Nodes...)
- }
- return nodes
-}
-
-func NopsToPeerIds(nops []*models.NodeOperator) ([]string, error) {
- return NodesToPeerIDs(NopsToNodes(nops))
-}
-
-func SetIdToPeerId(n *models.Node) error {
- p2pId, err := NodeP2PId(n)
- if err != nil {
- return err
- }
- n.ID = p2pId
- return nil
-}
-
-// SetNodeIdsToPeerIds sets the ID of each node in the NOPs to the P2P ID of the node
-// It mutates the input NOPs
-func SetNodeIdsToPeerIds(nops []*models.NodeOperator) error {
- for _, nop := range nops {
- for _, n := range nop.Nodes {
- if err := SetIdToPeerId(n); err != nil {
- return err
- }
- }
- }
- return nil
-}
diff --git a/deployment/environment/clo/utils_test.go b/deployment/environment/clo/utils_test.go
deleted file mode 100644
index e2202d4e14f..00000000000
--- a/deployment/environment/clo/utils_test.go
+++ /dev/null
@@ -1,168 +0,0 @@
-package clo
-
-import (
- "testing"
-
- "github.com/smartcontractkit/chainlink/deployment/environment/clo/models"
- "github.com/stretchr/testify/assert"
-)
-
-func TestSetNodeIdsToPeerIds(t *testing.T) {
- type args struct {
- nops []*models.NodeOperator
- }
- tests := []struct {
- name string
- args args
- want []*models.NodeOperator
- wantErr bool
- }{
- {
- name: "no nodes",
- args: args{
- nops: []*models.NodeOperator{
- {
- ID: "nop1",
- },
- },
- },
- want: []*models.NodeOperator{
- {
- ID: "nop1",
- },
- },
- },
- {
- name: "error no p2p key bundle",
- args: args{
- nops: []*models.NodeOperator{
- {
- ID: "nop1",
- Nodes: []*models.Node{
- {
- ID: "node1",
- ChainConfigs: []*models.NodeChainConfig{
- {
- Ocr2Config: &models.NodeOCR2Config{},
- },
- },
- },
- },
- },
- },
- },
- wantErr: true,
- },
- {
- name: "error multiple p2p key bundle",
- args: args{
- nops: []*models.NodeOperator{
- {
- ID: "nop1",
- Nodes: []*models.Node{
- {
- ID: "node1",
- ChainConfigs: []*models.NodeChainConfig{
- {
- Ocr2Config: &models.NodeOCR2Config{
- P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{
- PeerID: "peer1",
- },
- },
- },
- {
- Ocr2Config: &models.NodeOCR2Config{
- P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{
- PeerID: "peer2",
- },
- },
- },
- },
- },
- },
- },
- },
- },
- wantErr: true,
- },
- {
- name: "multiple nodes",
- args: args{
- nops: []*models.NodeOperator{
- {
- ID: "nop1",
- Nodes: []*models.Node{
- {
- ID: "node1",
- ChainConfigs: []*models.NodeChainConfig{
- {
- Ocr2Config: &models.NodeOCR2Config{
- P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{
- PeerID: "peer1",
- },
- },
- },
- },
- },
- {
- ID: "node2",
- ChainConfigs: []*models.NodeChainConfig{
- {
- Ocr2Config: &models.NodeOCR2Config{
- P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{
- PeerID: "another peer id",
- },
- },
- },
- },
- },
- },
- },
- },
- },
- want: []*models.NodeOperator{
- {
- ID: "nop1",
- Nodes: []*models.Node{
- {
- ID: "peer1",
- ChainConfigs: []*models.NodeChainConfig{
- {
- Ocr2Config: &models.NodeOCR2Config{
- P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{
- PeerID: "peer1",
- },
- },
- },
- },
- },
- {
- ID: "another peer id",
- ChainConfigs: []*models.NodeChainConfig{
- {
- Ocr2Config: &models.NodeOCR2Config{
- P2pKeyBundle: &models.NodeOCR2ConfigP2PKeyBundle{
- PeerID: "another peer id",
- },
- },
- },
- },
- },
- },
- },
- },
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- err := SetNodeIdsToPeerIds(tt.args.nops)
- if (err != nil) != tt.wantErr {
- t.Errorf("SetNodeIdsToPeerIds() error = %v, wantErr %v", err, tt.wantErr)
- }
- if err != nil {
- return
- }
- assert.EqualValues(t, tt.args.nops, tt.want)
- })
- }
-}
diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go
new file mode 100644
index 00000000000..bb3acec8aa4
--- /dev/null
+++ b/deployment/environment/crib/ccip_deployer.go
@@ -0,0 +1,225 @@
+package crib
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/config"
+
+ commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
+ "github.com/smartcontractkit/chainlink/deployment/environment/devenv"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+)
+
+// DeployHomeChainContracts deploys the home chain contracts so that the chainlink nodes can be started with the CR address in Capabilities.ExternalRegistry
+// DeployHomeChainContracts is to 1. Set up crib with chains and chainlink nodes ( cap reg is not known yet so not setting the config with capreg address)
+// Call DeployHomeChain changeset with nodeinfo ( the peer id and all)
+func DeployHomeChainContracts(ctx context.Context, lggr logger.Logger, envConfig devenv.EnvironmentConfig, homeChainSel uint64, feedChainSel uint64) (deployment.CapabilityRegistryConfig, deployment.AddressBook, error) {
+ e, _, err := devenv.NewEnvironment(func() context.Context { return ctx }, lggr, envConfig)
+ if err != nil {
+ return deployment.CapabilityRegistryConfig{}, nil, err
+ }
+ if e == nil {
+ return deployment.CapabilityRegistryConfig{}, nil, errors.New("environment is nil")
+ }
+
+ nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain)
+ if err != nil {
+ return deployment.CapabilityRegistryConfig{}, e.ExistingAddresses, fmt.Errorf("failed to get node info from env: %w", err)
+ }
+ p2pIds := nodes.NonBootstraps().PeerIDs()
+ *e, err = commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChain),
+ Config: changeset.DeployHomeChainConfig{
+ HomeChainSel: homeChainSel,
+ RMNStaticConfig: changeset.NewTestRMNStaticConfig(),
+ RMNDynamicConfig: changeset.NewTestRMNDynamicConfig(),
+ NodeOperators: changeset.NewTestNodeOperator(e.Chains[homeChainSel].DeployerKey.From),
+ NodeP2PIDsPerNodeOpAdmin: map[string][][32]byte{
+ "NodeOperator": p2pIds,
+ },
+ },
+ },
+ })
+
+ state, err := changeset.LoadOnchainState(*e)
+ if err != nil {
+ return deployment.CapabilityRegistryConfig{}, e.ExistingAddresses, fmt.Errorf("failed to load on chain state: %w", err)
+ }
+ capRegAddr := state.Chains[homeChainSel].CapabilityRegistry.Address()
+ if capRegAddr == common.HexToAddress("0x") {
+ return deployment.CapabilityRegistryConfig{}, e.ExistingAddresses, fmt.Errorf("cap Reg address not found: %w", err)
+ }
+ capRegConfig := deployment.CapabilityRegistryConfig{
+ EVMChainID: homeChainSel,
+ Contract: state.Chains[homeChainSel].CapabilityRegistry.Address(),
+ NetworkType: relay.NetworkEVM,
+ }
+ return capRegConfig, e.ExistingAddresses, nil
+}
+
+func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig devenv.EnvironmentConfig, homeChainSel, feedChainSel uint64, ab deployment.AddressBook) (DeployCCIPOutput, error) {
+ e, _, err := devenv.NewEnvironment(func() context.Context { return ctx }, lggr, envConfig)
+ if err != nil {
+ return DeployCCIPOutput{}, fmt.Errorf("failed to initiate new environment: %w", err)
+ }
+ e.ExistingAddresses = ab
+ chainSelectors := e.AllChainSelectors()
+ cfg := make(map[uint64]commontypes.MCMSWithTimelockConfig)
+ var prereqCfgs []changeset.DeployPrerequisiteConfigPerChain
+ for _, chain := range e.AllChainSelectors() {
+ mcmsConfig, err := config.NewConfig(1, []common.Address{e.Chains[chain].DeployerKey.From}, []config.Config{})
+ if err != nil {
+ return DeployCCIPOutput{}, fmt.Errorf("failed to create mcms config: %w", err)
+ }
+ cfg[chain] = commontypes.MCMSWithTimelockConfig{
+ Canceller: *mcmsConfig,
+ Bypasser: *mcmsConfig,
+ Proposer: *mcmsConfig,
+ TimelockMinDelay: big.NewInt(0),
+ }
+ prereqCfgs = append(prereqCfgs, changeset.DeployPrerequisiteConfigPerChain{
+ ChainSelector: chain,
+ })
+ }
+
+ // This will not apply any proposals because we pass nil to testing.
+ // However, setup is ok because we only need to deploy the contracts and distribute job specs
+ *e, err = commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken),
+ Config: chainSelectors,
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.DeployPrerequisites),
+ Config: changeset.DeployPrerequisiteConfig{
+ Configs: prereqCfgs,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock),
+ Config: cfg,
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.DeployChainContracts),
+ Config: changeset.DeployChainContractsConfig{
+ ChainSelectors: chainSelectors,
+ HomeChainSelector: homeChainSel,
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.CCIPCapabilityJobspec),
+ Config: struct{}{},
+ },
+ })
+ state, err := changeset.LoadOnchainState(*e)
+ if err != nil {
+ return DeployCCIPOutput{}, fmt.Errorf("failed to load onchain state: %w", err)
+ }
+ // Add all lanes
+ for from := range e.Chains {
+ for to := range e.Chains {
+ if from != to {
+ stateChain1 := state.Chains[from]
+ newEnv, err := commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDests),
+ Config: changeset.UpdateOnRampDestsConfig{
+ UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{
+ from: {
+ to: {
+ IsEnabled: true,
+ TestRouter: false,
+ AllowListEnabled: false,
+ },
+ },
+ },
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterPricesCS),
+ Config: changeset.UpdateFeeQuoterPricesConfig{
+ PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{
+ from: {
+ TokenPrices: map[common.Address]*big.Int{
+ stateChain1.LinkToken.Address(): changeset.DefaultLinkPrice,
+ stateChain1.Weth9.Address(): changeset.DefaultWethPrice,
+ },
+ GasPrices: map[uint64]*big.Int{
+ to: changeset.DefaultGasPrice,
+ },
+ },
+ },
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterDests),
+ Config: changeset.UpdateFeeQuoterDestsConfig{
+ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{
+ from: {
+ to: changeset.DefaultFeeQuoterDestChainConfig(),
+ },
+ },
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOffRampSources),
+ Config: changeset.UpdateOffRampSourcesConfig{
+ UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{
+ to: {
+ from: {
+ IsEnabled: true,
+ TestRouter: true,
+ },
+ },
+ },
+ },
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(changeset.UpdateRouterRamps),
+ Config: changeset.UpdateRouterRampsConfig{
+ TestRouter: true,
+ UpdatesByChain: map[uint64]changeset.RouterUpdates{
+ // onRamp update on source chain
+ from: {
+ OnRampUpdates: map[uint64]bool{
+ to: true,
+ },
+ },
+ // off
+ from: {
+ OffRampUpdates: map[uint64]bool{
+ to: true,
+ },
+ },
+ },
+ },
+ },
+ })
+ if err != nil {
+ return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets: %w", err)
+ }
+ e = &newEnv
+ }
+ }
+ }
+
+ addresses, err := e.ExistingAddresses.Addresses()
+ if err != nil {
+ return DeployCCIPOutput{}, fmt.Errorf("failed to get convert address book to address book map: %w", err)
+ }
+ return DeployCCIPOutput{
+ AddressBook: *deployment.NewMemoryAddressBookFromMap(addresses),
+ NodeIDs: e.NodeIDs,
+ }, err
+}
diff --git a/deployment/environment/crib/data.go b/deployment/environment/crib/data.go
new file mode 100644
index 00000000000..b9197691613
--- /dev/null
+++ b/deployment/environment/crib/data.go
@@ -0,0 +1,81 @@
+package crib
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/environment/devenv"
+)
+
+type OutputReader struct {
+ outputDir string
+}
+
+func NewOutputReader(outputDir string) *OutputReader {
+ return &OutputReader{outputDir: outputDir}
+}
+
+func (r *OutputReader) ReadNodesDetails() NodesDetails {
+ byteValue := r.readFile(NodesDetailsFileName)
+
+ var result NodesDetails
+
+ // Unmarshal the JSON into the map
+ err := json.Unmarshal(byteValue, &result)
+ if err != nil {
+ fmt.Println("Error unmarshalling JSON:", err)
+ panic(err)
+ }
+
+ return result
+}
+
+func (r *OutputReader) ReadChainConfigs() []devenv.ChainConfig {
+ byteValue := r.readFile(ChainsConfigsFileName)
+
+ var result []devenv.ChainConfig
+
+ // Unmarshal the JSON into the map
+ err := json.Unmarshal(byteValue, &result)
+ if err != nil {
+ fmt.Println("Error unmarshalling JSON:", err)
+ panic(err)
+ }
+
+ return result
+}
+
+func (r *OutputReader) ReadAddressBook() *deployment.AddressBookMap {
+ byteValue := r.readFile(AddressBookFileName)
+
+ var result map[uint64]map[string]deployment.TypeAndVersion
+
+ // Unmarshal the JSON into the map
+ err := json.Unmarshal(byteValue, &result)
+ if err != nil {
+ fmt.Println("Error unmarshalling JSON:", err)
+ panic(err)
+ }
+
+ return deployment.NewMemoryAddressBookFromMap(result)
+}
+
+func (r *OutputReader) readFile(fileName string) []byte {
+ file, err := os.Open(fmt.Sprintf("%s/%s", r.outputDir, fileName))
+ if err != nil {
+ fmt.Println("Error opening file:", err)
+ panic(err)
+ }
+ defer file.Close()
+
+ // Read the file's content into a byte slice
+ byteValue, err := io.ReadAll(file)
+ if err != nil {
+ fmt.Println("Error reading file:", err)
+ panic(err)
+ }
+ return byteValue
+}
diff --git a/deployment/environment/crib/env.go b/deployment/environment/crib/env.go
new file mode 100644
index 00000000000..3af1acaf754
--- /dev/null
+++ b/deployment/environment/crib/env.go
@@ -0,0 +1,45 @@
+package crib
+
+const (
+ AddressBookFileName = "ccip-v2-scripts-address-book.json"
+ NodesDetailsFileName = "ccip-v2-scripts-nodes-details.json"
+ ChainsConfigsFileName = "ccip-v2-scripts-chains-details.json"
+)
+
+type CRIBEnv struct {
+ envStateDir string
+}
+
+func NewDevspaceEnvFromStateDir(envStateDir string) CRIBEnv {
+ return CRIBEnv{
+ envStateDir: envStateDir,
+ }
+}
+
+func (c CRIBEnv) GetConfig() DeployOutput {
+ reader := NewOutputReader(c.envStateDir)
+ nodesDetails := reader.ReadNodesDetails()
+ chainConfigs := reader.ReadChainConfigs()
+ return DeployOutput{
+ AddressBook: reader.ReadAddressBook(),
+ NodeIDs: nodesDetails.NodeIDs,
+ Chains: chainConfigs,
+ }
+}
+
+type RPC struct {
+ External *string
+ Internal *string
+}
+
+type ChainConfig struct {
+ ChainID uint64 // chain id as per EIP-155, mainly applicable for EVM chains
+ ChainName string // name of the chain populated from chainselector repo
+ ChainType string // should denote the chain family. Acceptable values are EVM, COSMOS, SOLANA, STARKNET, APTOS etc
+ WSRPCs []RPC // websocket rpcs to connect to the chain
+ HTTPRPCs []RPC // http rpcs to connect to the chain
+}
+
+type NodesDetails struct {
+ NodeIDs []string
+}
diff --git a/deployment/environment/crib/env_test.go b/deployment/environment/crib/env_test.go
new file mode 100644
index 00000000000..262a2540923
--- /dev/null
+++ b/deployment/environment/crib/env_test.go
@@ -0,0 +1,18 @@
+package crib
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestShouldProvideEnvironmentConfig(t *testing.T) {
+ t.Parallel()
+ env := NewDevspaceEnvFromStateDir("testdata/lanes-deployed-state")
+ config := env.GetConfig()
+ require.NotNil(t, config)
+ assert.NotEmpty(t, config.NodeIDs)
+ assert.NotNil(t, config.AddressBook)
+ assert.NotEmpty(t, config.Chains)
+}
diff --git a/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-address-book.json b/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-address-book.json
new file mode 100644
index 00000000000..e4b2672cb5f
--- /dev/null
+++ b/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-address-book.json
@@ -0,0 +1 @@
+{"12922642891491394802":{"0x05Aa229Aec102f78CE0E852A812a388F076Aa555":{"Type":"CancellerManyChainMultiSig","Version":"1.0.0"},"0x0D4ff719551E23185Aeb16FFbF2ABEbB90635942":{"Type":"TestRouter","Version":"1.2.0"},"0x0f5D1ef48f12b6f691401bfe88c2037c690a6afe":{"Type":"ProposerManyChainMultiSig","Version":"1.0.0"},"0x2dE080e97B0caE9825375D31f5D0eD5751fDf16D":{"Type":"CCIPReceiver","Version":"1.0.0"},"0x2fc631e4B3018258759C52AF169200213e84ABab":{"Type":"OnRamp","Version":"1.6.0-dev"},"0x5C7c905B505f0Cf40Ab6600d05e677F717916F6B":{"Type":"Router","Version":"1.2.0"},"0x63cf2Cd54fE91e3545D1379abf5bfd194545259d":{"Type":"OffRamp","Version":"1.6.0-dev"},"0x712516e61C8B383dF4A63CFe83d7701Bce54B03e":{"Type":"LinkToken","Version":"1.0.0"},"0x71C95911E9a5D330f4D621842EC243EE1343292e":{"Type":"PriceFeed","Version":"1.0.0"},"0x73eccD6288e117cAcA738BDAD4FEC51312166C1A":{"Type":"RMNRemote","Version":"1.6.0-dev"},"0x8464135c8F25Da09e49BC8782676a84730C318bC":{"Type":"PriceFeed","Version":"1.0.0"},"0x85C5Dd61585773423e378146D4bEC6f8D149E248":{"Type":"TokenAdminRegistry","Version":"1.5.0"},"0x948B3c65b89DF0B4894ABE91E6D02FE579834F8F":{"Type":"WETH9","Version":"1.0.0"},"0xAfe1b5bdEbD4ae65AF2024738bf0735fbb65d44b":{"Type":"FeeQuoter","Version":"1.6.0-dev"},"0xC6bA8C3233eCF65B761049ef63466945c362EdD2":{"Type":"BypasserManyChainMultiSig","Version":"1.0.0"},"0xbCF26943C0197d2eE0E5D05c716Be60cc2761508":{"Type":"AdminManyChainMultiSig","Version":"1.0.0"},"0xcA03Dc4665A8C3603cb4Fd5Ce71Af9649dC00d44":{"Type":"RBACTimelock","Version":"1.0.0"},"0xe6b98F104c1BEf218F3893ADab4160Dc73Eb8367":{"Type":"ARMProxy","Version":"1.0.0"},"0xfbAb4aa40C202E4e80390171E82379824f7372dd":{"Type":"NonceManager","Version":"1.6.0-dev"}},"3379446385462418246":{"0x09635F643e140090A9A8Dcd712eD6285858ceBef":{"Type":"RMNRemote","Version":"1.6.0-dev"},"0x0B306BF915C4d645ff596e518fAf3F9669b97016":{"Type":"LinkToken","Version":"1.0.0"},"0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8":{"Type":"OnRamp","Version":"1.6.0-dev"},"0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6":{"Type":"CCIPHome","Version":"1.6.0-dev"},"0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44":{"Type":"ProposerManyChainMultiSig","Version":"1.0.0"},"0x3Aa5ebB10DC797CAC828524e59A333d0A371443c":{"Type":"BypasserManyChainMultiSig","Version":"1.0.0"},"0x4A679253410272dd5232B3Ff7cF5dbB88f295319":{"Type":"RBACTimelock","Version":"1.0.0"},"0x59b670e9fA9D0A427751Af201D676719a970857b":{"Type":"CancellerManyChainMultiSig","Version":"1.0.0"},"0x67d269191c92Caf3cD7723F116c85e6E9bf55933":{"Type":"ARMProxy","Version":"1.0.0"},"0x7a2088a1bFc9d81c55368AE168C2C02570cB814F":{"Type":"CCIPReceiver","Version":"1.0.0"},"0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB":{"Type":"TokenAdminRegistry","Version":"1.5.0"},"0x851356ae760d987E095750cCeb3bC6014560891C":{"Type":"OffRamp","Version":"1.6.0-dev"},"0x8A791620dd6260079BF849Dc5567aDC3F2FdC318":{"Type":"RMNHome","Version":"1.6.0-dev"},"0x9A676e781A523b5d0C0e43731313A708CB607508":{"Type":"WETH9","Version":"1.0.0"},"0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE":{"Type":"AdminManyChainMultiSig","Version":"1.0.0"},"0x9E545E3C0baAB3E08CdfD552C960A1050f373042":{"Type":"NonceManager","Version":"1.6.0-dev"},"0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E":{"Type":"Router","Version":"1.2.0"},"0xa513E6E4b8f2a923D98304ec87F64353C4D5C853":{"Type":"CapabilitiesRegistry","Version":"1.0.0"},"0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9":{"Type":"FeeQuoter","Version":"1.6.0-dev"},"0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690":{"Type":"TestRouter","Version":"1.2.0"}}}
diff --git a/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-chains-details.json b/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-chains-details.json
new file mode 100644
index 00000000000..f93ea4ce231
--- /dev/null
+++ b/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-chains-details.json
@@ -0,0 +1,24 @@
+[
+ {
+ "ChainID": 1337,
+ "ChainName": "alpha",
+ "ChainType": "EVM",
+ "WSRPCs": [
+ "wss://crib-local-geth-1337-ws.local:443"
+ ],
+ "HTTPRPCs": [
+ "https://crib-local-geth-1337-ws.local:443"
+ ]
+ },
+ {
+ "ChainID": 2337,
+ "ChainName": "alpha",
+ "ChainType": "EVM",
+ "WSRPCs": [
+ "wss://crib-local-geth-2337-ws.local:443"
+ ],
+ "HTTPRPCs": [
+ "https://crib-local-geth-2337-ws.local:443"
+ ]
+ }
+]
diff --git a/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-nodes-details.json b/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-nodes-details.json
new file mode 100644
index 00000000000..477ae0527b1
--- /dev/null
+++ b/deployment/environment/crib/testdata/lanes-deployed-state/ccip-v2-scripts-nodes-details.json
@@ -0,0 +1 @@
+{"NodeIDs":["node_2URuou3RXmtZu5gLQX8qd","node_m9TTQbUxBx3WjDEjmpVDL","node_4FiKVPtuQjCTvHnS7QpES","node_A4VTgecDwMoG2YYicyjuG","node_jQFpzXDadzaADq147nThS"]}
diff --git a/deployment/environment/crib/types.go b/deployment/environment/crib/types.go
new file mode 100644
index 00000000000..d19c8424443
--- /dev/null
+++ b/deployment/environment/crib/types.go
@@ -0,0 +1,39 @@
+package crib
+
+import (
+ "context"
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/environment/devenv"
+)
+
+const (
+ CRIB_ENV_NAME = "Crib Environment"
+)
+
+type DeployOutput struct {
+ NodeIDs []string
+ Chains []devenv.ChainConfig // chain selector -> Chain Config
+ AddressBook deployment.AddressBook // Addresses of all contracts
+}
+
+type DeployCCIPOutput struct {
+ AddressBook deployment.AddressBookMap
+ NodeIDs []string
+}
+
+func NewDeployEnvironmentFromCribOutput(lggr logger.Logger, output DeployOutput) (*deployment.Environment, error) {
+ chains, err := devenv.NewChains(lggr, output.Chains)
+ if err != nil {
+ return nil, err
+ }
+ return deployment.NewEnvironment(
+ CRIB_ENV_NAME,
+ lggr,
+ output.AddressBook,
+ chains,
+ output.NodeIDs,
+ nil, // todo: populate the offchain client using output.DON
+ func() context.Context { return context.Background() }, deployment.XXXGenerateTestOCRSecrets(),
+ ), nil
+}
diff --git a/deployment/environment/devenv/don.go b/deployment/environment/devenv/don.go
index 05a3d5bea08..76f6ee92b68 100644
--- a/deployment/environment/devenv/don.go
+++ b/deployment/environment/devenv/don.go
@@ -2,7 +2,9 @@ package devenv
import (
"context"
+ "errors"
"fmt"
+ chainsel "github.com/smartcontractkit/chain-selectors"
"strconv"
"strings"
"time"
@@ -10,8 +12,6 @@ import (
"github.com/hashicorp/go-multierror"
"github.com/rs/zerolog"
"github.com/sethvargo/go-retry"
- chainsel "github.com/smartcontractkit/chain-selectors"
-
nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node"
clclient "github.com/smartcontractkit/chainlink/deployment/environment/nodeclient"
"github.com/smartcontractkit/chainlink/deployment/environment/web/sdk/client"
@@ -185,7 +185,7 @@ type JDChainConfigInput struct {
// It expects bootstrap nodes to have label with key "type" and value as "bootstrap".
// It fetches the account address, peer id, and OCR2 key bundle id and creates the JobDistributorChainConfig.
func (n *Node) CreateCCIPOCRSupportedChains(ctx context.Context, chains []JDChainConfigInput, jd JobDistributor) error {
- for i, chain := range chains {
+ for _, chain := range chains {
chainId := strconv.FormatUint(chain.ChainID, 10)
var account string
switch chain.ChainType {
@@ -239,35 +239,51 @@ func (n *Node) CreateCCIPOCRSupportedChains(ctx context.Context, chains []JDChai
break
}
}
- // JD silently fails to update nodeChainConfig. Therefore, we fetch the node config and
- // if it's not updated , throw an error
- _, err = n.gqlClient.CreateJobDistributorChainConfig(ctx, client.JobDistributorChainConfigInput{
- JobDistributorID: n.JDId,
- ChainID: chainId,
- ChainType: chain.ChainType,
- AccountAddr: account,
- AdminAddr: n.adminAddr,
- Ocr2Enabled: true,
- Ocr2IsBootstrap: isBootstrap,
- Ocr2Multiaddr: n.multiAddr,
- Ocr2P2PPeerID: value(peerID),
- Ocr2KeyBundleID: ocr2BundleId,
- Ocr2Plugins: `{"commit":true,"execute":true,"median":false,"mercury":false}`,
+
+ // retry twice with 5 seconds interval to create JobDistributorChainConfig
+ err = retry.Do(ctx, retry.WithMaxDuration(10*time.Second, retry.NewConstant(3*time.Second)), func(ctx context.Context) error {
+ // check the node chain config to see if this chain already exists
+ nodeChainConfigs, err := jd.ListNodeChainConfigs(context.Background(), &nodev1.ListNodeChainConfigsRequest{
+ Filter: &nodev1.ListNodeChainConfigsRequest_Filter{
+ NodeIds: []string{n.NodeId},
+ }})
+ if err != nil {
+ return retry.RetryableError(fmt.Errorf("failed to list node chain configs for node %s, retrying..: %w", n.Name, err))
+ }
+ if nodeChainConfigs != nil {
+ for _, chainConfig := range nodeChainConfigs.ChainConfigs {
+ if chainConfig.Chain.Id == chainId {
+ return nil
+ }
+ }
+ }
+
+ // JD silently fails to update nodeChainConfig. Therefore, we fetch the node config and
+ // if it's not updated , throw an error
+ _, err = n.gqlClient.CreateJobDistributorChainConfig(ctx, client.JobDistributorChainConfigInput{
+ JobDistributorID: n.JDId,
+ ChainID: chainId,
+ ChainType: chain.ChainType,
+ AccountAddr: account,
+ AdminAddr: n.adminAddr,
+ Ocr2Enabled: true,
+ Ocr2IsBootstrap: isBootstrap,
+ Ocr2Multiaddr: n.multiAddr,
+ Ocr2P2PPeerID: value(peerID),
+ Ocr2KeyBundleID: ocr2BundleId,
+ Ocr2Plugins: `{"commit":true,"execute":true,"median":false,"mercury":false}`,
+ })
+ // todo: add a check if the chain config failed because of a duplicate in that case, should we update or return success?
+ if err != nil {
+ return fmt.Errorf("failed to create CCIPOCR2SupportedChains for node %s: %w", n.Name, err)
+ }
+
+ return retry.RetryableError(errors.New("retrying CreateChainConfig in JD"))
})
+
if err != nil {
return fmt.Errorf("failed to create CCIPOCR2SupportedChains for node %s: %w", n.Name, err)
}
- // query the node chain config to check if it's created
- nodeChainConfigs, err := jd.ListNodeChainConfigs(context.Background(), &nodev1.ListNodeChainConfigsRequest{
- Filter: &nodev1.ListNodeChainConfigsRequest_Filter{
- NodeIds: []string{n.NodeId},
- }})
- if err != nil {
- return fmt.Errorf("failed to list node chain configs for node %s: %w", n.Name, err)
- }
- if nodeChainConfigs == nil || len(nodeChainConfigs.ChainConfigs) < i+1 {
- return fmt.Errorf("failed to create chain config for node %s", n.Name)
- }
}
return nil
}
@@ -377,6 +393,17 @@ func (n *Node) CreateJobDistributor(ctx context.Context, jd JobDistributor) (str
return "", err
}
// create the job distributor in the node with the csa key
+ resp, err := n.gqlClient.ListJobDistributors(ctx)
+ if err != nil {
+ return "", fmt.Errorf("could not list job distrubutors: %w", err)
+ }
+ if len(resp.FeedsManagers.Results) > 0 {
+ for _, fm := range resp.FeedsManagers.Results {
+ if fm.GetPublicKey() == csaKey {
+ return fm.GetId(), nil
+ }
+ }
+ }
return n.gqlClient.CreateJobDistributor(ctx, client.JobDistributorInput{
Name: "Job Distributor",
Uri: jd.WSRPC,
@@ -394,8 +421,9 @@ func (n *Node) SetUpAndLinkJobDistributor(ctx context.Context, jd JobDistributor
}
// now create the job distributor in the node
id, err := n.CreateJobDistributor(ctx, jd)
- if err != nil && !strings.Contains(err.Error(), "DuplicateFeedsManagerError") {
- return err
+ if err != nil &&
+ (!strings.Contains(err.Error(), "only a single feeds manager is supported") || !strings.Contains(err.Error(), "DuplicateFeedsManagerError")) {
+ return fmt.Errorf("failed to create job distributor in node %s: %w", n.Name, err)
}
// wait for the node to connect to the job distributor
err = retry.Do(ctx, retry.WithMaxDuration(1*time.Minute, retry.NewFibonacci(1*time.Second)), func(ctx context.Context) error {
diff --git a/deployment/environment/devenv/rmn.go b/deployment/environment/devenv/rmn.go
index 63f27f1e422..3e0c6efe0cd 100644
--- a/deployment/environment/devenv/rmn.go
+++ b/deployment/environment/devenv/rmn.go
@@ -22,7 +22,6 @@ import (
"github.com/smartcontractkit/chainlink-testing-framework/lib/docker"
"github.com/smartcontractkit/chainlink-testing-framework/lib/docker/test_env"
"github.com/smartcontractkit/chainlink-testing-framework/lib/logging"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/logstream"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
)
@@ -51,7 +50,6 @@ func NewRage2ProxyComponent(
imageVersion string,
local ProxyLocalConfig,
shared ProxySharedConfig,
- logStream *logstream.LogStream,
) (*RageProxy, error) {
rageName := fmt.Sprintf("%s-proxy-%s", name, uuid.NewString()[0:8])
@@ -71,7 +69,6 @@ func NewRage2ProxyComponent(
ContainerImage: imageName,
ContainerVersion: imageVersion,
Networks: networks,
- LogStream: logStream,
},
Passphrase: DefaultAFNPassphrase,
proxyListenerPort: listenPort,
@@ -193,8 +190,7 @@ func NewAFN2ProxyComponent(
imageName,
imageVersion string,
shared SharedConfig,
- local LocalConfig,
- logStream *logstream.LogStream) (*AFN2Proxy, error) {
+ local LocalConfig) (*AFN2Proxy, error) {
afnName := fmt.Sprintf("%s-%s", name, uuid.NewString()[0:8])
rmn := &AFN2Proxy{
EnvComponent: test_env.EnvComponent{
@@ -202,7 +198,6 @@ func NewAFN2ProxyComponent(
ContainerImage: imageName,
ContainerVersion: imageVersion,
Networks: networks,
- LogStream: logStream,
},
AFNPassphrase: DefaultAFNPassphrase,
Shared: shared,
@@ -343,7 +338,6 @@ func NewRMNCluster(
proxyVersion string,
rmnImage string,
rmnVersion string,
- logStream *logstream.LogStream,
) (*RMNCluster, error) {
rmn := &RMNCluster{
t: t,
@@ -351,7 +345,7 @@ func NewRMNCluster(
Nodes: make(map[string]RMNNode),
}
for name, rmnConfig := range config {
- proxy, err := NewRage2ProxyComponent(networks, name, proxyImage, proxyVersion, rmnConfig.ProxyLocal, rmnConfig.ProxyShared, logStream)
+ proxy, err := NewRage2ProxyComponent(networks, name, proxyImage, proxyVersion, rmnConfig.ProxyLocal, rmnConfig.ProxyShared)
if err != nil {
return nil, err
}
@@ -371,7 +365,7 @@ func NewRMNCluster(
return nil, err
}
rmnConfig.Local.Networking.RageProxy = strings.TrimPrefix(fmt.Sprintf("%s:%s", proxyName, port), "/")
- afn, err := NewAFN2ProxyComponent(networks, name, rmnImage, rmnVersion, rmnConfig.Shared, rmnConfig.Local, logStream)
+ afn, err := NewAFN2ProxyComponent(networks, name, rmnImage, rmnVersion, rmnConfig.Shared, rmnConfig.Local)
if err != nil {
return nil, err
}
diff --git a/deployment/environment/memory/chain.go b/deployment/environment/memory/chain.go
index 40a20a02416..77a8f397d39 100644
--- a/deployment/environment/memory/chain.go
+++ b/deployment/environment/memory/chain.go
@@ -14,6 +14,7 @@ import (
chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
)
@@ -52,10 +53,10 @@ func GenerateChains(t *testing.T, numChains int, numUsers int) map[uint64]EVMCha
return chains
}
-func GenerateChainsWithIds(t *testing.T, chainIDs []uint64) map[uint64]EVMChain {
+func GenerateChainsWithIds(t *testing.T, chainIDs []uint64, numUsers int) map[uint64]EVMChain {
chains := make(map[uint64]EVMChain)
for _, chainID := range chainIDs {
- chains[chainID] = evmChain(t, 1)
+ chains[chainID] = evmChain(t, numUsers)
}
return chains
}
diff --git a/deployment/environment/memory/environment.go b/deployment/environment/memory/environment.go
index d6c80a92a44..a74d23a847b 100644
--- a/deployment/environment/memory/environment.go
+++ b/deployment/environment/memory/environment.go
@@ -5,6 +5,7 @@ import (
"fmt"
"strconv"
"testing"
+ "time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/core/types"
@@ -58,9 +59,15 @@ func NewMemoryChains(t *testing.T, numChains int, numUsers int) (map[uint64]depl
return generateMemoryChain(t, mchains), users
}
-func NewMemoryChainsWithChainIDs(t *testing.T, chainIDs []uint64) map[uint64]deployment.Chain {
- mchains := GenerateChainsWithIds(t, chainIDs)
- return generateMemoryChain(t, mchains)
+func NewMemoryChainsWithChainIDs(t *testing.T, chainIDs []uint64, numUsers int) (map[uint64]deployment.Chain, map[uint64][]*bind.TransactOpts) {
+ mchains := GenerateChainsWithIds(t, chainIDs, numUsers)
+ users := make(map[uint64][]*bind.TransactOpts)
+ for id, chain := range mchains {
+ sel, err := chainsel.SelectorFromChainId(id)
+ require.NoError(t, err)
+ users[sel] = chain.Users
+ }
+ return generateMemoryChain(t, mchains), users
}
func generateMemoryChain(t *testing.T, inputs map[uint64]EVMChain) map[uint64]deployment.Chain {
@@ -80,10 +87,13 @@ func generateMemoryChain(t *testing.T, inputs map[uint64]EVMChain) map[uint64]de
}
for {
backend.Commit()
- receipt, err := backend.TransactionReceipt(context.Background(), tx.Hash())
+ receipt, err := func() (*types.Receipt, error) {
+ ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
+ defer cancel()
+ return bind.WaitMined(ctx, backend, tx)
+ }()
if err != nil {
- t.Log("failed to get receipt", "chain", chainInfo.ChainName, err)
- continue
+ return 0, fmt.Errorf("tx %s failed to confirm: %w, chain %d", tx.Hash().Hex(), err, chainInfo.ChainSelector)
}
if receipt.Status == 0 {
errReason, err := deployment.GetErrorReasonFromTx(chain.Backend.Client(), chain.DeployerKey.From, tx, receipt)
diff --git a/deployment/environment/memory/job_client.go b/deployment/environment/memory/job_client.go
index 98fb90ceffa..a3cfee41608 100644
--- a/deployment/environment/memory/job_client.go
+++ b/deployment/environment/memory/job_client.go
@@ -20,6 +20,8 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype"
+ ocr2validate "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/validate"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocrbootstrap"
)
type JobClient struct {
@@ -295,7 +297,27 @@ func (j JobClient) ProposeJob(ctx context.Context, in *jobv1.ProposeJobRequest,
// TODO: Use FMS
jb, err := validate.ValidatedCCIPSpec(in.Spec)
if err != nil {
- return nil, err
+ if !strings.Contains(err.Error(), "the only supported type is currently 'ccip'") {
+ return nil, err
+ }
+ // check if it's offchainreporting2 job
+ jb, err = ocr2validate.ValidatedOracleSpecToml(
+ ctx,
+ n.App.GetConfig().OCR2(),
+ n.App.GetConfig().Insecure(),
+ in.Spec,
+ nil, // not required for validation
+ )
+ if err != nil {
+ if !strings.Contains(err.Error(), "the only supported type is currently 'offchainreporting2'") {
+ return nil, err
+ }
+ // check if it's bootstrap job
+ jb, err = ocrbootstrap.ValidatedBootstrapSpecToml(in.Spec)
+ if err != nil {
+ return nil, fmt.Errorf("failed to validate job spec only ccip, bootstrap and offchainreporting2 are supported: %w", err)
+ }
+ }
}
err = n.App.AddJobV2(ctx, &jb)
if err != nil {
diff --git a/deployment/environment/memory/node.go b/deployment/environment/memory/node.go
index fd08d3cf17b..84f0d2e443f 100644
--- a/deployment/environment/memory/node.go
+++ b/deployment/environment/memory/node.go
@@ -286,6 +286,8 @@ func CreateKeys(t *testing.T,
}
backend := chain.Client.(*Backend).Sim
fundAddress(t, chain.DeployerKey, transmitters[evmChainID], assets.Ether(1000).ToInt(), backend)
+ // need to look more into it, but it seems like with sim chains nodes are sending txs with 0x from address
+ fundAddress(t, chain.DeployerKey, common.Address{}, assets.Ether(1000).ToInt(), backend)
}
return Keys{
diff --git a/deployment/environment/web/sdk/client/client.go b/deployment/environment/web/sdk/client/client.go
index 5472591ef94..e0a56b9e642 100644
--- a/deployment/environment/web/sdk/client/client.go
+++ b/deployment/environment/web/sdk/client/client.go
@@ -4,10 +4,11 @@ import (
"context"
"encoding/json"
"fmt"
+ "github.com/Khan/genqlient/graphql"
+ "github.com/sethvargo/go-retry"
"net/http"
"strings"
-
- "github.com/Khan/genqlient/graphql"
+ "time"
"github.com/smartcontractkit/chainlink/deployment/environment/web/sdk/client/doer"
"github.com/smartcontractkit/chainlink/deployment/environment/web/sdk/internal/generated"
@@ -60,8 +61,15 @@ func New(baseURI string, creds Credentials) (Client, error) {
endpoints: ep,
credentials: creds,
}
-
- if err := c.login(); err != nil {
+
+ err := retry.Do(context.Background(), retry.WithMaxDuration(10*time.Second, retry.NewFibonacci(2*time.Second)), func(ctx context.Context) error {
+ err := c.login()
+ if err != nil {
+ return retry.RetryableError(fmt.Errorf("retrying login to node: %w", err))
+ }
+ return nil
+ })
+ if err != nil {
return nil, fmt.Errorf("failed to login to node: %w", err)
}
diff --git a/deployment/go.mod b/deployment/go.mod
index 8c30d54bdff..34fbc7fd21d 100644
--- a/deployment/go.mod
+++ b/deployment/go.mod
@@ -26,13 +26,13 @@ require (
github.com/pkg/errors v0.9.1
github.com/rs/zerolog v1.33.0
github.com/sethvargo/go-retry v0.2.4
- github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86
+ github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix
github.com/smartcontractkit/chain-selectors v1.0.34
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0
- github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000
+ github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0
github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.13
- github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12
+ github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919
github.com/stretchr/testify v1.9.0
github.com/test-go/testify v1.1.4
github.com/testcontainers/testcontainers-go v0.34.0
@@ -40,7 +40,7 @@ require (
go.uber.org/zap v1.27.0
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c
golang.org/x/oauth2 v0.23.0
- golang.org/x/sync v0.8.0
+ golang.org/x/sync v0.10.0
google.golang.org/grpc v1.67.1
google.golang.org/protobuf v1.35.1
gopkg.in/guregu/null.v4 v4.0.0
@@ -82,7 +82,7 @@ require (
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect
github.com/alexflint/go-arg v1.4.2 // indirect
github.com/alexflint/go-scalar v1.0.0 // indirect
- github.com/andybalholm/brotli v1.1.0 // indirect
+ github.com/andybalholm/brotli v1.1.1 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect
@@ -223,7 +223,7 @@ require (
github.com/go-viper/mapstructure/v2 v2.1.0 // indirect
github.com/go-webauthn/webauthn v0.9.4 // indirect
github.com/go-webauthn/x v0.1.5 // indirect
- github.com/goccy/go-json v0.10.2 // indirect
+ github.com/goccy/go-json v0.10.3 // indirect
github.com/goccy/go-yaml v1.12.0 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
github.com/gofrs/flock v0.8.1 // indirect
@@ -315,8 +315,8 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/julienschmidt/httprouter v1.3.0 // indirect
github.com/kelseyhightower/envconfig v1.4.0 // indirect
- github.com/klauspost/compress v1.17.9 // indirect
- github.com/klauspost/cpuid/v2 v2.2.7 // indirect
+ github.com/klauspost/compress v1.17.11 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
@@ -364,6 +364,7 @@ require (
github.com/oklog/run v1.1.0 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
+ github.com/onsi/gomega v1.34.2 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0 // indirect
github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e // indirect
@@ -407,10 +408,10 @@ require (
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e // indirect
- github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db // indirect
+ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 // indirect
github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect
- github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 // indirect
- github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc // indirect
+ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect
+ github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce // indirect
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 // indirect
github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect
github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.5 // indirect
@@ -492,12 +493,12 @@ require (
go.uber.org/ratelimit v0.3.1 // indirect
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect
golang.org/x/arch v0.11.0 // indirect
- golang.org/x/crypto v0.28.0 // indirect
+ golang.org/x/crypto v0.31.0 // indirect
golang.org/x/mod v0.21.0 // indirect
golang.org/x/net v0.30.0 // indirect
- golang.org/x/sys v0.26.0 // indirect
- golang.org/x/term v0.25.0 // indirect
- golang.org/x/text v0.19.0 // indirect
+ golang.org/x/sys v0.28.0 // indirect
+ golang.org/x/term v0.27.0 // indirect
+ golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.7.0 // indirect
golang.org/x/tools v0.26.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
diff --git a/deployment/go.sum b/deployment/go.sum
index b1ce805ba28..a364fc9b1ec 100644
--- a/deployment/go.sum
+++ b/deployment/go.sum
@@ -184,9 +184,11 @@ github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2uc
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
-github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
+github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g6V7ZM=
+github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
@@ -245,6 +247,8 @@ github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQ
github.com/aws/jsii-runtime-go v1.104.0/go.mod h1:7ZmQXxV0AAhhvv/GaHX4n6zbgA1tSRVdnQYAJbIhXHk=
github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM=
github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0=
@@ -282,6 +286,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA=
@@ -541,6 +547,8 @@ github.com/gagliardetto/solana-go v1.8.4 h1:vmD/JmTlonyXGy39bAo0inMhmbdAwV7rXZtL
github.com/gagliardetto/solana-go v1.8.4/go.mod h1:i+7aAyNDTHG0jK8GZIBSI4OVvDqkt2Qx+LklYclRNG8=
github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw=
github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok=
+github.com/gagliardetto/utilz v0.1.1 h1:/etW4hl607emKg6R6Lj9jRJ9d6ue2AQOyjhuAwjzs1U=
+github.com/gagliardetto/utilz v0.1.1/go.mod h1:b+rGFkRHz3HWJD0RYMzat47JyvbTtpE0iEcYTRJTLLA=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ=
@@ -548,8 +556,8 @@ github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9y
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk=
-github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI=
+github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
+github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E=
github.com/gin-contrib/expvar v0.0.1 h1:IuU5ArEgihz50vG8Onrwz22kJr7Mcvgv9xSSpfU5g+w=
github.com/gin-contrib/expvar v0.0.1/go.mod h1:8o2CznfQi1JjktORdHr2/abg3wSV6OCnXh0yGypvvVw=
github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE=
@@ -638,8 +646,8 @@ github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0=
github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY=
github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg=
github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM=
github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU=
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0=
@@ -707,6 +715,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI=
+github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -831,6 +841,8 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=
github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/api v1.29.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw=
github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk=
@@ -1032,11 +1044,11 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
-github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
+github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
-github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
+github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00=
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM=
@@ -1091,6 +1103,8 @@ github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYt
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk=
+github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ=
+github.com/marcboeker/go-duckdb v1.8.3/go.mod h1:C9bYRE1dPYb1hhfu/SSomm78B0FXmNgRvv6YBW/Hooc=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -1219,8 +1233,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
-github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
+github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo=
+github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
@@ -1262,8 +1276,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
-github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
-github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
@@ -1356,6 +1370,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
+github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
@@ -1403,28 +1419,28 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 h1:qQH6fZZe31nBAG6INHph3z5ysDTPptyu0TR9uoJ1+ok=
-github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86/go.mod h1:WtWOoVQQEHxRHL2hNmuRrvDfYfQG/CioFNoa9Rr2mBE=
+github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix h1:DPJD++yKLSx0EfT+U14P8vLVxjXFmoIETiCO9lVwQo8=
+github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY=
github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3fePb3eCreuAnUA3RBj4=
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0 h1:/1L+v4SxUD2K5RMRbfByyLfePMAgQKeD0onSetPnGmA=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000 h1:6Zzr/R1j6P7bbvcUlt5WUIbItvrrGdGzIsiAzQezcwo=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000/go.mod h1:ncjd6mPZSRlelEqH/2KeLE1pU3UlqzBSn8RYkEoECzY=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550 h1:rRs74zjDJ7do5aYEXSU/sOnLnlbYCNqM8BrvEx/0NH8=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550/go.mod h1:yti7e1+G9hhkYhj+L5sVUULn9Bn3bBL5/AxaNqdJ5YQ=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e/go.mod h1:mUh5/woemsVaHgTorA080hrYmO3syBCmPdnWc/5dOqk=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db h1:N1RH1hSr2ACzOFc9hkCcjE8pRBTdcU3p8nsTJByaLes=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db/go.mod h1:yjb9d4q7+m8aGbjfTbkNoNuA4PeSxcUszsSZHDrvS0E=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 h1:aeiBdBHGY8QNftps+VqrIk6OnfeeOD5z4jrAabW4ZSc=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3/go.mod h1:AS6zY2BkcRwfiGzNabGbHhfrLSrXrcI/GmjnT4jQ5/s=
github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c=
github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 h1:onBe3DqNrbtOAzKS4PrPIiJX65BGo1aYiYZxFVEW+jc=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc h1:dssRwJhmzJkUN/OajaDj2GsxBn+Tupk3bI1BkPEoJg0=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc/go.mod h1:p8aUDfJeley6oer7y+Ucd3edOtRlMTnWg3mN6rhaLWo=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce h1:Mvpbr/Fi2IdU2EcmqCxhlCzs5ncnx+BwV80YweA4DZs=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce/go.mod h1:qq+nW0JDnCCGMf2c38ZHjH8xgkAQnXKighjJr5JdDNE=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 h1:tNS7U9lrxkFvEuyxQv11HHOiV9LPDGC9wYEy+yM/Jv4=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8/go.mod h1:EBrEgcdIbwepqguClkv8Ohy7CbyWSJaE4EC9aBJlQK0=
github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.13 h1:T0kbw07Vb6xUyA9MIJZfErMgWseWi1zf7cYvRpoq7ug=
@@ -1437,8 +1453,8 @@ github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 h1:7bCdbTUW
github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2/go.mod h1:MltlNu3jcXm/DyLN98I5TFNtu/o1NNAcaPAFKMXWk70=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12 h1:NzZGjaqez21I3DU7objl3xExTH4fxYvzTqar8DC6360=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc=
@@ -1589,6 +1605,8 @@ github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
+github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
+github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1600,6 +1618,8 @@ github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE
github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U=
github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
@@ -1746,8 +1766,8 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1877,8 +1897,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1972,8 +1992,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1984,8 +2004,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -2000,8 +2020,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff --git a/deployment/helpers.go b/deployment/helpers.go
index dfbbccc2698..34a2584a544 100644
--- a/deployment/helpers.go
+++ b/deployment/helpers.go
@@ -14,6 +14,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/rpc"
"github.com/pkg/errors"
chain_selectors "github.com/smartcontractkit/chain-selectors"
@@ -87,7 +88,7 @@ func parseError(txError error) (string, error) {
return callErr.Data, nil
}
-func ParseErrorFromABI(errorString string, contractABI string) (string, error) {
+func parseErrorFromABI(errorString string, contractABI string) (string, error) {
parsedAbi, err := abi.JSON(strings.NewReader(contractABI))
if err != nil {
return "", errors.Wrap(err, "error loading ABI")
@@ -112,6 +113,30 @@ func ParseErrorFromABI(errorString string, contractABI string) (string, error) {
return "", errors.New("error not found in ABI")
}
+// DecodeErr decodes an error from a contract call using the contract's ABI.
+// If the error is not decodable, it returns the original error.
+func DecodeErr(encodedABI string, err error) error {
+ if err == nil {
+ return nil
+ }
+ //revive:disable
+ var d rpc.DataError
+ ok := errors.As(err, &d)
+ if ok {
+ encErr, ok := d.ErrorData().(string)
+ if !ok {
+ return fmt.Errorf("error without error data: %s", d.Error())
+ }
+ errStr, parseErr := parseErrorFromABI(encErr, encodedABI)
+ if parseErr != nil {
+ return fmt.Errorf("failed to decode error '%s' with abi: %w", encErr, parseErr)
+ }
+ return fmt.Errorf("contract error: %s", errStr)
+
+ }
+ return fmt.Errorf("cannot decode error with abi: %w", err)
+}
+
// ContractDeploy represents the result of an EVM contract deployment
// via an abigen Go binding. It contains all the return values
// as they are useful in different ways.
diff --git a/deployment/keystone/changeset/accept_ownership.go b/deployment/keystone/changeset/accept_ownership.go
index 662a4c2dcfa..dd709523bc2 100644
--- a/deployment/keystone/changeset/accept_ownership.go
+++ b/deployment/keystone/changeset/accept_ownership.go
@@ -5,7 +5,7 @@ import (
"github.com/ethereum/go-ethereum/common"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
+ kslib "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/common/changeset"
diff --git a/deployment/keystone/changeset/accept_ownership_test.go b/deployment/keystone/changeset/accept_ownership_test.go
index b2aa1b20194..4007fde4f79 100644
--- a/deployment/keystone/changeset/accept_ownership_test.go
+++ b/deployment/keystone/changeset/accept_ownership_test.go
@@ -1,7 +1,6 @@
package changeset_test
import (
- "math/big"
"testing"
"github.com/stretchr/testify/require"
@@ -10,6 +9,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/common/types"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
@@ -35,7 +35,7 @@ func TestAcceptAllOwnership(t *testing.T) {
},
{
Changeset: commonchangeset.WrapChangeSet(changeset.DeployForwarder),
- Config: registrySel,
+ Config: changeset.DeployForwarderRequest{},
},
{
Changeset: commonchangeset.WrapChangeSet(changeset.DeployFeedsConsumer),
@@ -44,23 +44,18 @@ func TestAcceptAllOwnership(t *testing.T) {
{
Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock),
Config: map[uint64]types.MCMSWithTimelockConfig{
- registrySel: {
- Canceller: commonchangeset.SingleGroupMCMS(t),
- Bypasser: commonchangeset.SingleGroupMCMS(t),
- Proposer: commonchangeset.SingleGroupMCMS(t),
- TimelockMinDelay: big.NewInt(0),
- },
+ registrySel: proposalutils.SingleGroupTimelockConfig(t),
},
},
})
require.NoError(t, err)
addrs, err := env.ExistingAddresses.AddressesForChain(registrySel)
require.NoError(t, err)
- timelock, err := commonchangeset.MaybeLoadMCMSWithTimelockState(env.Chains[registrySel], addrs)
+ timelock, err := commonchangeset.MaybeLoadMCMSWithTimelockChainState(env.Chains[registrySel], addrs)
require.NoError(t, err)
- _, err = commonchangeset.ApplyChangesets(t, env, map[uint64]*commonchangeset.TimelockExecutionContracts{
- registrySel: &commonchangeset.TimelockExecutionContracts{
+ _, err = commonchangeset.ApplyChangesets(t, env, map[uint64]*proposalutils.TimelockExecutionContracts{
+ registrySel: &proposalutils.TimelockExecutionContracts{
Timelock: timelock.Timelock,
CallProxy: timelock.CallProxy,
},
diff --git a/deployment/keystone/changeset/addrbook_utils.go b/deployment/keystone/changeset/addrbook_utils.go
index 4b6d6d151b1..fa4dd27ca18 100644
--- a/deployment/keystone/changeset/addrbook_utils.go
+++ b/deployment/keystone/changeset/addrbook_utils.go
@@ -8,11 +8,12 @@ import (
ccipowner "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
"github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/deployment/keystone"
- capReg "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer"
- keystoneForwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
- ocr3Capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability"
+
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
+ capReg "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
+ feeds_consumer "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer_1_0_0"
+ keystoneForwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0"
+ ocr3Capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0"
)
// contractConstructor is a function type that takes an address and a client,
@@ -56,7 +57,7 @@ func capRegistriesFromAddrBook(addrBook deployment.AddressBook, chain deployment
return getContractsFromAddrBook[capReg.CapabilitiesRegistry](
addrBook,
chain,
- keystone.CapabilitiesRegistry,
+ internal.CapabilitiesRegistry,
capReg.NewCapabilitiesRegistry,
)
}
@@ -66,7 +67,7 @@ func ocr3FromAddrBook(addrBook deployment.AddressBook, chain deployment.Chain) (
return getContractsFromAddrBook[ocr3Capability.OCR3Capability](
addrBook,
chain,
- keystone.OCR3Capability,
+ internal.OCR3Capability,
ocr3Capability.NewOCR3Capability,
)
}
@@ -76,7 +77,7 @@ func forwardersFromAddrBook(addrBook deployment.AddressBook, chain deployment.Ch
return getContractsFromAddrBook[keystoneForwarder.KeystoneForwarder](
addrBook,
chain,
- keystone.KeystoneForwarder,
+ internal.KeystoneForwarder,
keystoneForwarder.NewKeystoneForwarder,
)
}
@@ -86,7 +87,7 @@ func feedsConsumersFromAddrBook(addrBook deployment.AddressBook, chain deploymen
return getContractsFromAddrBook[feeds_consumer.KeystoneFeedsConsumer](
addrBook,
chain,
- keystone.FeedConsumer,
+ internal.FeedConsumer,
feeds_consumer.NewKeystoneFeedsConsumer,
)
}
@@ -96,7 +97,7 @@ func proposersFromAddrBook(addrBook deployment.AddressBook, chain deployment.Cha
return getContractsFromAddrBook[ccipowner.ManyChainMultiSig](
addrBook,
chain,
- keystone.ProposerManyChainMultiSig,
+ internal.ProposerManyChainMultiSig,
ccipowner.NewManyChainMultiSig,
)
}
@@ -106,7 +107,7 @@ func timelocksFromAddrBook(addrBook deployment.AddressBook, chain deployment.Cha
return getContractsFromAddrBook[ccipowner.RBACTimelock](
addrBook,
chain,
- keystone.RBACTimelock,
+ internal.RBACTimelock,
ccipowner.NewRBACTimelock,
)
}
diff --git a/deployment/keystone/changeset/append_node_capabilities.go b/deployment/keystone/changeset/append_node_capabilities.go
index 688d4fd8d2f..d558cf39c95 100644
--- a/deployment/keystone/changeset/append_node_capabilities.go
+++ b/deployment/keystone/changeset/append_node_capabilities.go
@@ -8,7 +8,6 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
)
@@ -63,7 +62,7 @@ func (req *AppendNodeCapabilitiesRequest) convert(e deployment.Environment) (*in
if !ok {
return nil, fmt.Errorf("registry chain selector %d does not exist in environment", req.RegistryChainSel)
}
- resp, err := kslib.GetContractSets(e.Logger, &kslib.GetContractSetsRequest{
+ resp, err := internal.GetContractSets(e.Logger, &internal.GetContractSetsRequest{
Chains: map[uint64]deployment.Chain{req.RegistryChainSel: registryChain},
AddressBook: e.ExistingAddresses,
})
diff --git a/deployment/keystone/changeset/append_node_capabilities_test.go b/deployment/keystone/changeset/append_node_capabilities_test.go
index 159500ab5a7..fb2c99ed15e 100644
--- a/deployment/keystone/changeset/append_node_capabilities_test.go
+++ b/deployment/keystone/changeset/append_node_capabilities_test.go
@@ -8,8 +8,10 @@ import (
"golang.org/x/exp/maps"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -28,10 +30,10 @@ func TestAppendNodeCapabilities(t *testing.T) {
caps = []kcr.CapabilitiesRegistryCapability{capA, capB}
)
t.Run("no mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
})
@@ -57,10 +59,10 @@ func TestAppendNodeCapabilities(t *testing.T) {
})
})
t.Run("with mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
UseMCMS: true,
})
@@ -87,7 +89,7 @@ func TestAppendNodeCapabilities(t *testing.T) {
// now apply the changeset such that the proposal is signed and execed
contracts := te.ContractSets()[te.RegistrySelector]
- timelockContracts := map[uint64]*commonchangeset.TimelockExecutionContracts{
+ timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{
te.RegistrySelector: {
Timelock: contracts.Timelock,
CallProxy: contracts.CallProxy,
@@ -107,7 +109,7 @@ func TestAppendNodeCapabilities(t *testing.T) {
}
// validateUpdate checks reads nodes from the registry and checks they have the expected updates
-func validateCapabilityAppends(t *testing.T, te TestEnv, appended map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) {
+func validateCapabilityAppends(t *testing.T, te test.TestEnv, appended map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) {
registry := te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry
wfP2PIDs := p2pIDs(t, maps.Keys(te.WFNodes))
nodes, err := registry.GetNodesByP2PIds(nil, wfP2PIDs)
diff --git a/deployment/keystone/changeset/compatiblity.go b/deployment/keystone/changeset/compatiblity.go
new file mode 100644
index 00000000000..7f80b6ab53d
--- /dev/null
+++ b/deployment/keystone/changeset/compatiblity.go
@@ -0,0 +1,95 @@
+package changeset
+
+import "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
+
+//TODO: KS-673 refactor internal package to reduce and remove the duplication
+
+// OracleConfig is the configuration for an oracle
+type OracleConfig = internal.OracleConfig
+
+// OCR3OnchainConfig is the onchain configuration of an OCR2 contract
+type OCR3OnchainConfig = internal.OCR2OracleConfig
+
+// NodeKeys is a set of public keys for a node
+type NodeKeys = internal.NodeKeys
+
+// TopLevelConfigSource is the top level configuration source
+type TopLevelConfigSource = internal.TopLevelConfigSource
+
+// GenerateOCR3Config generates an OCR3 config
+var GenerateOCR3Config = internal.GenerateOCR3Config
+
+// FeedConsumer is a feed consumer contract type
+var FeedConsumer = internal.FeedConsumer
+
+// KeystoneForwarder is a keystone forwarder contract type
+var KeystoneForwarder = internal.KeystoneForwarder
+
+// GetContractSetsRequest is a request to get contract sets
+type GetContractSetsRequest = internal.GetContractSetsRequest
+
+// GetContractSetsResponse is a response to get contract sets
+type GetContractSetsResponse = internal.GetContractSetsResponse
+
+// GetContractSets gets contract sets
+var GetContractSets = internal.GetContractSets
+
+// RegisterCapabilitiesRequest is a request to register capabilities
+type RegisterCapabilitiesRequest = internal.RegisterCapabilitiesRequest
+
+// RegisterCapabilitiesResponse is a response to register capabilities
+type RegisterCapabilitiesResponse = internal.RegisterCapabilitiesResponse
+
+// RegisterCapabilities registers capabilities
+var RegisterCapabilities = internal.RegisterCapabilities
+
+// RegisterNOPSRequest is a request to register NOPS
+type RegisterNOPSRequest = internal.RegisterNOPSRequest
+
+// RegisterNOPSResponse is a response to register NOPS
+type RegisterNOPSResponse = internal.RegisterNOPSResponse
+
+// RegisterNOPS registers NOPS
+var RegisterNOPS = internal.RegisterNOPS
+
+// RegisterNodesRequest is a request to register nodes with the capabilities registry
+type RegisterNodesRequest = internal.RegisterNodesRequest
+
+// RegisterNodesResponse is a response to register nodes with the capabilities registry
+type RegisterNodesResponse = internal.RegisterNodesResponse
+
+// RegisterNodes registers nodes with the capabilities registry
+var RegisterNodes = internal.RegisterNodes
+
+// RegisteredCapability is a wrapper of a capability and its ID
+type RegisteredCapability = internal.RegisteredCapability
+
+// FromCapabilitiesRegistryCapability converts a capabilities registry capability to a registered capability
+var FromCapabilitiesRegistryCapability = internal.FromCapabilitiesRegistryCapability
+
+// RegisterDonsRequest is a request to register Dons with the capabilities registry
+type RegisterDonsRequest = internal.RegisterDonsRequest
+
+// RegisterDonsResponse is a response to register Dons with the capabilities registry
+type RegisterDonsResponse = internal.RegisterDonsResponse
+
+// RegisterDons registers Dons with the capabilities registry
+var RegisterDons = internal.RegisterDons
+
+// DONToRegister is the minimal information needed to register a DON with the capabilities registry
+type DONToRegister = internal.DONToRegister
+
+// ConfigureContractsRequest is a request to configure ALL the contracts
+type ConfigureContractsRequest = internal.ConfigureContractsRequest
+
+// ConfigureContractsResponse is a response to configure ALL the contracts
+type ConfigureContractsResponse = internal.ConfigureContractsResponse
+
+// DonCapabilities is a set of capabilities hosted by a set of node operators
+// in is in a convenient form to handle the CLO representation of the nop data
+type DonCapabilities = internal.DonCapabilities
+
+type DeployRequest = internal.DeployRequest
+type DeployResponse = internal.DeployResponse
+
+type ContractSet = internal.ContractSet
diff --git a/deployment/keystone/changeset/configure_contracts.go b/deployment/keystone/changeset/configure_contracts.go
index 3a92782e12b..b57ebb0ed52 100644
--- a/deployment/keystone/changeset/configure_contracts.go
+++ b/deployment/keystone/changeset/configure_contracts.go
@@ -7,7 +7,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
+ kslib "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
)
var _ deployment.ChangeSet[InitialContractsCfg] = ConfigureInitialContractsChangeset
diff --git a/deployment/keystone/changeset/deploy_consumer.go b/deployment/keystone/changeset/deploy_consumer.go
index fc7992e2a7d..d94d7ac0adc 100644
--- a/deployment/keystone/changeset/deploy_consumer.go
+++ b/deployment/keystone/changeset/deploy_consumer.go
@@ -4,7 +4,7 @@ import (
"fmt"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
+ kslib "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
)
type DeployFeedsConsumerRequest struct {
diff --git a/deployment/keystone/changeset/deploy_forwarder.go b/deployment/keystone/changeset/deploy_forwarder.go
index 1e4066770bd..66923140e6a 100644
--- a/deployment/keystone/changeset/deploy_forwarder.go
+++ b/deployment/keystone/changeset/deploy_forwarder.go
@@ -2,26 +2,40 @@ package changeset
import (
"fmt"
+ "maps"
+ "slices"
"github.com/ethereum/go-ethereum/common"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
)
-var _ deployment.ChangeSet[uint64] = DeployForwarder
+var _ deployment.ChangeSet[DeployForwarderRequest] = DeployForwarder
+
+type DeployForwarderRequest struct {
+ ChainSelectors []uint64 // filter to only deploy to these chains; if empty, deploy to all chains
+}
// DeployForwarder deploys the KeystoneForwarder contract to all chains in the environment
// callers must merge the output addressbook with the existing one
// TODO: add selectors to deploy only to specific chains
-func DeployForwarder(env deployment.Environment, _ uint64) (deployment.ChangesetOutput, error) {
+func DeployForwarder(env deployment.Environment, cfg DeployForwarderRequest) (deployment.ChangesetOutput, error) {
lggr := env.Logger
ab := deployment.NewMemoryAddressBook()
- for _, chain := range env.Chains {
+ selectors := cfg.ChainSelectors
+ if len(selectors) == 0 {
+ selectors = slices.Collect(maps.Keys(env.Chains))
+ }
+ for _, sel := range selectors {
+ chain, ok := env.Chains[sel]
+ if !ok {
+ return deployment.ChangesetOutput{}, fmt.Errorf("chain with selector %d not found", sel)
+ }
lggr.Infow("deploying forwarder", "chainSelector", chain.Selector)
- forwarderResp, err := kslib.DeployForwarder(chain, ab)
+ forwarderResp, err := internal.DeployForwarder(chain, ab)
if err != nil {
return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy KeystoneForwarder to chain selector %d: %w", chain.Selector, err)
}
@@ -55,7 +69,7 @@ func (r ConfigureForwardContractsRequest) UseMCMS() bool {
}
func ConfigureForwardContracts(env deployment.Environment, req ConfigureForwardContractsRequest) (deployment.ChangesetOutput, error) {
- wfDon, err := kslib.NewRegisteredDon(env, kslib.RegisteredDonConfig{
+ wfDon, err := internal.NewRegisteredDon(env, internal.RegisteredDonConfig{
NodeIDs: req.WFNodeIDs,
Name: req.WFDonName,
RegistryChainSel: req.RegistryChainSel,
@@ -63,15 +77,15 @@ func ConfigureForwardContracts(env deployment.Environment, req ConfigureForwardC
if err != nil {
return deployment.ChangesetOutput{}, fmt.Errorf("failed to create registered don: %w", err)
}
- r, err := kslib.ConfigureForwardContracts(&env, kslib.ConfigureForwarderContractsRequest{
- Dons: []kslib.RegisteredDon{*wfDon},
+ r, err := internal.ConfigureForwardContracts(&env, internal.ConfigureForwarderContractsRequest{
+ Dons: []internal.RegisteredDon{*wfDon},
UseMCMS: req.UseMCMS(),
})
if err != nil {
return deployment.ChangesetOutput{}, fmt.Errorf("failed to configure forward contracts: %w", err)
}
- cresp, err := kslib.GetContractSets(env.Logger, &kslib.GetContractSetsRequest{
+ cresp, err := internal.GetContractSets(env.Logger, &internal.GetContractSetsRequest{
Chains: env.Chains,
AddressBook: env.ExistingAddresses,
})
@@ -97,7 +111,7 @@ func ConfigureForwardContracts(env deployment.Environment, req ConfigureForwardC
timelocksPerChain,
proposerMCMSes,
[]timelock.BatchChainOperation{op},
- "proposal to set update nodes",
+ "proposal to set forwarder config",
req.MCMSConfig.MinDuration,
)
if err != nil {
diff --git a/deployment/keystone/changeset/deploy_forwarder_test.go b/deployment/keystone/changeset/deploy_forwarder_test.go
index dd894fde9d9..ec80a9432b0 100644
--- a/deployment/keystone/changeset/deploy_forwarder_test.go
+++ b/deployment/keystone/changeset/deploy_forwarder_test.go
@@ -11,8 +11,10 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test"
)
func TestDeployForwarder(t *testing.T) {
@@ -32,7 +34,7 @@ func TestDeployForwarder(t *testing.T) {
// deploy forwarder
env.ExistingAddresses = ab
- resp, err := changeset.DeployForwarder(env, registrySel)
+ resp, err := changeset.DeployForwarder(env, changeset.DeployForwarderRequest{})
require.NoError(t, err)
require.NotNil(t, resp)
// registry, ocr3, forwarder should be deployed on registry chain
@@ -55,10 +57,10 @@ func TestConfigureForwarders(t *testing.T) {
for _, nChains := range []int{1, 3} {
name := fmt.Sprintf("nChains=%d", nChains)
t.Run(name, func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: nChains,
})
@@ -92,10 +94,10 @@ func TestConfigureForwarders(t *testing.T) {
for _, nChains := range []int{1, 3} {
name := fmt.Sprintf("nChains=%d", nChains)
t.Run(name, func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: nChains,
UseMCMS: true,
})
@@ -116,11 +118,11 @@ func TestConfigureForwarders(t *testing.T) {
require.Len(t, csOut.Proposals, nChains)
require.Nil(t, csOut.AddressBook)
- timelockContracts := make(map[uint64]*commonchangeset.TimelockExecutionContracts)
+ timelockContracts := make(map[uint64]*proposalutils.TimelockExecutionContracts)
for selector, contractSet := range te.ContractSets() {
require.NotNil(t, contractSet.Timelock)
require.NotNil(t, contractSet.CallProxy)
- timelockContracts[selector] = &commonchangeset.TimelockExecutionContracts{
+ timelockContracts[selector] = &proposalutils.TimelockExecutionContracts{
Timelock: contractSet.Timelock,
CallProxy: contractSet.CallProxy,
}
diff --git a/deployment/keystone/changeset/deploy_ocr3.go b/deployment/keystone/changeset/deploy_ocr3.go
index 4dfed1e292c..ba5ea2921d9 100644
--- a/deployment/keystone/changeset/deploy_ocr3.go
+++ b/deployment/keystone/changeset/deploy_ocr3.go
@@ -6,12 +6,13 @@ import (
"io"
"github.com/ethereum/go-ethereum/common"
+
"github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
+ kslib "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
)
var _ deployment.ChangeSet[uint64] = DeployOCR3
@@ -37,6 +38,7 @@ var _ deployment.ChangeSet[ConfigureOCR3Config] = ConfigureOCR3Contract
type ConfigureOCR3Config struct {
ChainSel uint64
NodeIDs []string
+ Address *common.Address // address of the OCR3 contract to configure
OCR3Config *kslib.OracleConfig
DryRun bool
WriteGeneratedConfig io.Writer // if not nil, write the generated config to this writer as JSON [OCR2OracleConfig]
@@ -54,6 +56,7 @@ func ConfigureOCR3Contract(env deployment.Environment, cfg ConfigureOCR3Config)
ChainSel: cfg.ChainSel,
NodeIDs: cfg.NodeIDs,
OCR3Config: cfg.OCR3Config,
+ Address: cfg.Address,
DryRun: cfg.DryRun,
UseMCMS: cfg.UseMCMS(),
})
@@ -99,7 +102,7 @@ func ConfigureOCR3Contract(env deployment.Environment, cfg ConfigureOCR3Config)
timelocksPerChain,
proposerMCMSes,
[]timelock.BatchChainOperation{*resp.Ops},
- "proposal to set update nodes",
+ "proposal to set OCR3 config",
cfg.MCMSConfig.MinDuration,
)
if err != nil {
diff --git a/deployment/keystone/changeset/deploy_ocr3_test.go b/deployment/keystone/changeset/deploy_ocr3_test.go
index 5d02f83500d..ea984989703 100644
--- a/deployment/keystone/changeset/deploy_ocr3_test.go
+++ b/deployment/keystone/changeset/deploy_ocr3_test.go
@@ -7,15 +7,18 @@ import (
"go.uber.org/zap/zapcore"
+ "github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test"
)
func TestDeployOCR3(t *testing.T) {
@@ -46,22 +49,22 @@ func TestDeployOCR3(t *testing.T) {
func TestConfigureOCR3(t *testing.T) {
t.Parallel()
- c := kslib.OracleConfig{
+ c := internal.OracleConfig{
MaxFaultyOracles: 1,
DeltaProgressMillis: 12345,
}
t.Run("no mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
})
var wfNodes []string
- for id, _ := range te.WFNodes {
+ for id := range te.WFNodes {
wfNodes = append(wfNodes, id)
}
@@ -75,7 +78,7 @@ func TestConfigureOCR3(t *testing.T) {
csOut, err := changeset.ConfigureOCR3Contract(te.Env, cfg)
require.NoError(t, err)
- var got kslib.OCR2OracleConfig
+ var got internal.OCR2OracleConfig
err = json.Unmarshal(w.Bytes(), &got)
require.NoError(t, err)
assert.Len(t, got.Signers, 4)
@@ -83,17 +86,173 @@ func TestConfigureOCR3(t *testing.T) {
assert.Nil(t, csOut.Proposals)
})
+ t.Run("success multiple OCR3 contracts", func(t *testing.T) {
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
+ NumChains: 1,
+ })
+
+ registrySel := te.Env.AllChainSelectors()[0]
+
+ existingContracts, err := te.Env.ExistingAddresses.AddressesForChain(registrySel)
+ require.NoError(t, err)
+ require.Len(t, existingContracts, 4)
+
+ // Find existing OCR3 contract
+ var existingOCR3Addr string
+ for addr, tv := range existingContracts {
+ if tv.Type == internal.OCR3Capability {
+ existingOCR3Addr = addr
+ break
+ }
+ }
+
+ // Deploy a new OCR3 contract
+ resp, err := changeset.DeployOCR3(te.Env, registrySel)
+ require.NoError(t, err)
+ require.NotNil(t, resp)
+ require.NoError(t, te.Env.ExistingAddresses.Merge(resp.AddressBook))
+
+ // Verify after merge there are three original contracts plus one new one
+ addrs, err := te.Env.ExistingAddresses.AddressesForChain(registrySel)
+ require.NoError(t, err)
+ require.Len(t, addrs, 5)
+
+ // Find new OCR3 contract
+ var newOCR3Addr string
+ for addr, tv := range addrs {
+ if tv.Type == internal.OCR3Capability && addr != existingOCR3Addr {
+ newOCR3Addr = addr
+ break
+ }
+ }
+
+ var wfNodes []string
+ for id := range te.WFNodes {
+ wfNodes = append(wfNodes, id)
+ }
+
+ na := common.HexToAddress(newOCR3Addr)
+ w := &bytes.Buffer{}
+ cfg := changeset.ConfigureOCR3Config{
+ ChainSel: te.RegistrySelector,
+ NodeIDs: wfNodes,
+ Address: &na, // Use the new OCR3 contract to configure
+ OCR3Config: &c,
+ WriteGeneratedConfig: w,
+ }
+
+ csOut, err := changeset.ConfigureOCR3Contract(te.Env, cfg)
+ require.NoError(t, err)
+ var got internal.OCR2OracleConfig
+ err = json.Unmarshal(w.Bytes(), &got)
+ require.NoError(t, err)
+ assert.Len(t, got.Signers, 4)
+ assert.Len(t, got.Transmitters, 4)
+ assert.Nil(t, csOut.Proposals)
+ })
+
+ t.Run("fails multiple OCR3 contracts but unspecified address", func(t *testing.T) {
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
+ NumChains: 1,
+ })
+
+ registrySel := te.Env.AllChainSelectors()[0]
+
+ existingContracts, err := te.Env.ExistingAddresses.AddressesForChain(registrySel)
+ require.NoError(t, err)
+ require.Len(t, existingContracts, 4)
+
+ // Deploy a new OCR3 contract
+ resp, err := changeset.DeployOCR3(te.Env, registrySel)
+ require.NoError(t, err)
+ require.NotNil(t, resp)
+ require.NoError(t, te.Env.ExistingAddresses.Merge(resp.AddressBook))
+
+ // Verify after merge there are original contracts plus one new one
+ addrs, err := te.Env.ExistingAddresses.AddressesForChain(registrySel)
+ require.NoError(t, err)
+ require.Len(t, addrs, 5)
+
+ var wfNodes []string
+ for id := range te.WFNodes {
+ wfNodes = append(wfNodes, id)
+ }
+
+ w := &bytes.Buffer{}
+ cfg := changeset.ConfigureOCR3Config{
+ ChainSel: te.RegistrySelector,
+ NodeIDs: wfNodes,
+ OCR3Config: &c,
+ WriteGeneratedConfig: w,
+ }
+
+ _, err = changeset.ConfigureOCR3Contract(te.Env, cfg)
+ require.Error(t, err)
+ require.ErrorContains(t, err, "OCR contract address is unspecified")
+ })
+
+ t.Run("fails multiple OCR3 contracts but address not found", func(t *testing.T) {
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
+ NumChains: 1,
+ })
+
+ registrySel := te.Env.AllChainSelectors()[0]
+
+ existingContracts, err := te.Env.ExistingAddresses.AddressesForChain(registrySel)
+ require.NoError(t, err)
+ require.Len(t, existingContracts, 4)
+
+ // Deploy a new OCR3 contract
+ resp, err := changeset.DeployOCR3(te.Env, registrySel)
+ require.NoError(t, err)
+ require.NotNil(t, resp)
+ require.NoError(t, te.Env.ExistingAddresses.Merge(resp.AddressBook))
+
+ // Verify after merge there are original contracts plus one new one
+ addrs, err := te.Env.ExistingAddresses.AddressesForChain(registrySel)
+ require.NoError(t, err)
+ require.Len(t, addrs, 5)
+
+ var wfNodes []string
+ for id := range te.WFNodes {
+ wfNodes = append(wfNodes, id)
+ }
+
+ nfa := common.HexToAddress("0x1234567890123456789012345678901234567890")
+ w := &bytes.Buffer{}
+ cfg := changeset.ConfigureOCR3Config{
+ ChainSel: te.RegistrySelector,
+ NodeIDs: wfNodes,
+ OCR3Config: &c,
+ Address: &nfa,
+ WriteGeneratedConfig: w,
+ }
+
+ _, err = changeset.ConfigureOCR3Contract(te.Env, cfg)
+ require.Error(t, err)
+ require.ErrorContains(t, err, "not found in contract set")
+ })
+
t.Run("mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
UseMCMS: true,
})
var wfNodes []string
- for id, _ := range te.WFNodes {
+ for id := range te.WFNodes {
wfNodes = append(wfNodes, id)
}
@@ -108,7 +267,7 @@ func TestConfigureOCR3(t *testing.T) {
csOut, err := changeset.ConfigureOCR3Contract(te.Env, cfg)
require.NoError(t, err)
- var got kslib.OCR2OracleConfig
+ var got internal.OCR2OracleConfig
err = json.Unmarshal(w.Bytes(), &got)
require.NoError(t, err)
assert.Len(t, got.Signers, 4)
@@ -118,7 +277,7 @@ func TestConfigureOCR3(t *testing.T) {
contracts := te.ContractSets()[te.RegistrySelector]
require.NoError(t, err)
- var timelockContracts = map[uint64]*commonchangeset.TimelockExecutionContracts{
+ var timelockContracts = map[uint64]*proposalutils.TimelockExecutionContracts{
te.RegistrySelector: {
Timelock: contracts.Timelock,
CallProxy: contracts.CallProxy,
diff --git a/deployment/keystone/changeset/deploy_registry.go b/deployment/keystone/changeset/deploy_registry.go
index d07e2728282..2b8342c06dd 100644
--- a/deployment/keystone/changeset/deploy_registry.go
+++ b/deployment/keystone/changeset/deploy_registry.go
@@ -4,7 +4,7 @@ import (
"fmt"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
+ kslib "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
)
var _ deployment.ChangeSet[uint64] = DeployCapabilityRegistry
diff --git a/deployment/keystone/changeset/internal/append_node_capabilities.go b/deployment/keystone/changeset/internal/append_node_capabilities.go
index 892aa4c1e16..32fe8572da3 100644
--- a/deployment/keystone/changeset/internal/append_node_capabilities.go
+++ b/deployment/keystone/changeset/internal/append_node_capabilities.go
@@ -5,14 +5,14 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
type AppendNodeCapabilitiesRequest struct {
Chain deployment.Chain
- ContractSet *kslib.ContractSet
+ ContractSet *ContractSet
P2pToCapabilities map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability
UseMCMS bool
@@ -48,7 +48,7 @@ func AppendNodeCapabilitiesImpl(lggr logger.Logger, req *AppendNodeCapabilitiesR
for _, cap := range req.P2pToCapabilities {
capabilities = append(capabilities, cap...)
}
- op, err := kslib.AddCapabilities(lggr, req.ContractSet, req.Chain, capabilities, req.UseMCMS)
+ op, err := AddCapabilities(lggr, req.ContractSet, req.Chain, capabilities, req.UseMCMS)
if err != nil {
return nil, fmt.Errorf("failed to add capabilities: %w", err)
}
diff --git a/deployment/keystone/changeset/internal/append_node_capabilities_test.go b/deployment/keystone/changeset/internal/append_node_capabilities_test.go
index f2ec2bf5c8f..6d26133195d 100644
--- a/deployment/keystone/changeset/internal/append_node_capabilities_test.go
+++ b/deployment/keystone/changeset/internal/append_node_capabilities_test.go
@@ -11,7 +11,7 @@ import (
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
kstest "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal/test"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
diff --git a/deployment/keystone/capability_definitions.go b/deployment/keystone/changeset/internal/capability_definitions.go
similarity index 93%
rename from deployment/keystone/capability_definitions.go
rename to deployment/keystone/changeset/internal/capability_definitions.go
index 61f129a939a..21c2b4fce01 100644
--- a/deployment/keystone/capability_definitions.go
+++ b/deployment/keystone/changeset/internal/capability_definitions.go
@@ -1,6 +1,6 @@
-package keystone
+package internal
-import kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+import kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
// TODO: KS-457 configuration management for capabilities from external sources
var StreamTriggerCap = kcr.CapabilitiesRegistryCapability{
diff --git a/deployment/keystone/capability_management.go b/deployment/keystone/changeset/internal/capability_management.go
similarity index 96%
rename from deployment/keystone/capability_management.go
rename to deployment/keystone/changeset/internal/capability_management.go
index 7e502d4f8ea..268b4fd0d01 100644
--- a/deployment/keystone/capability_management.go
+++ b/deployment/keystone/changeset/internal/capability_management.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"fmt"
@@ -8,7 +8,7 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
// AddCapabilities adds the capabilities to the registry
@@ -27,7 +27,7 @@ func AddCapabilities(lggr logger.Logger, contractSet *ContractSet, chain deploym
}
tx, err := registry.AddCapabilities(txOpts, deduped)
if err != nil {
- err = DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(kcr.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to add capabilities: %w", err)
}
var batch *timelock.BatchChainOperation
diff --git a/deployment/keystone/capability_registry_deployer.go b/deployment/keystone/changeset/internal/capability_registry_deployer.go
similarity index 97%
rename from deployment/keystone/capability_registry_deployer.go
rename to deployment/keystone/changeset/internal/capability_registry_deployer.go
index 11c85453927..492ba168c9d 100644
--- a/deployment/keystone/capability_registry_deployer.go
+++ b/deployment/keystone/changeset/internal/capability_registry_deployer.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"context"
@@ -11,7 +11,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
type CapabilitiesRegistryDeployer struct {
diff --git a/deployment/keystone/consumer_deployer.go b/deployment/keystone/changeset/internal/consumer_deployer.go
similarity index 90%
rename from deployment/keystone/consumer_deployer.go
rename to deployment/keystone/changeset/internal/consumer_deployer.go
index 12d148144b5..3c2de539ccb 100644
--- a/deployment/keystone/consumer_deployer.go
+++ b/deployment/keystone/changeset/internal/consumer_deployer.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"fmt"
@@ -6,7 +6,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer"
+ feeds_consumer "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer_1_0_0"
)
type KeystoneFeedsConsumerDeployer struct {
diff --git a/deployment/keystone/contract_set.go b/deployment/keystone/changeset/internal/contract_set.go
similarity index 99%
rename from deployment/keystone/contract_set.go
rename to deployment/keystone/changeset/internal/contract_set.go
index ee503a54b4d..e60f37d6f76 100644
--- a/deployment/keystone/contract_set.go
+++ b/deployment/keystone/changeset/internal/contract_set.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"fmt"
diff --git a/deployment/keystone/deploy.go b/deployment/keystone/changeset/internal/deploy.go
similarity index 88%
rename from deployment/keystone/deploy.go
rename to deployment/keystone/changeset/internal/deploy.go
index 7d3e5391219..acaabd22131 100644
--- a/deployment/keystone/deploy.go
+++ b/deployment/keystone/changeset/internal/deploy.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"bytes"
@@ -14,7 +14,7 @@ import (
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/rpc"
+ "github.com/ethereum/go-ethereum/common"
"golang.org/x/exp/maps"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
@@ -29,9 +29,8 @@ import (
capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb"
"github.com/smartcontractkit/chainlink-common/pkg/values"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
- kf "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
+ capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
+ kf "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
)
@@ -68,7 +67,7 @@ func (r ConfigureContractsRequest) Validate() error {
type ConfigureContractsResponse struct {
Changeset *deployment.ChangesetOutput
- DonInfos map[string]kcr.CapabilitiesRegistryDONInfo
+ DonInfos map[string]capabilities_registry.CapabilitiesRegistryDONInfo
}
// ConfigureContracts configures contracts them with the given DONS and their capabilities. It optionally deploys the contracts
@@ -142,7 +141,7 @@ type DonInfo struct {
Name string
F uint8
Nodes []deployment.Node
- Capabilities []kcr.CapabilitiesRegistryCapability // every capability is hosted on each node
+ Capabilities []capabilities_registry.CapabilitiesRegistryCapability // every capability is hosted on each node
}
func DonInfos(dons []DonCapabilities, jd deployment.OffchainClient) ([]DonInfo, error) {
@@ -166,7 +165,7 @@ func DonInfos(dons []DonCapabilities, jd deployment.OffchainClient) ([]DonInfo,
return donInfos, nil
}
-func GetRegistryContract(e *deployment.Environment, registryChainSel uint64) (*kcr.CapabilitiesRegistry, deployment.Chain, error) {
+func GetRegistryContract(e *deployment.Environment, registryChainSel uint64) (*capabilities_registry.CapabilitiesRegistry, deployment.Chain, error) {
registryChain, ok := e.Chains[registryChainSel]
if !ok {
return nil, deployment.Chain{}, fmt.Errorf("chain %d not found in environment", registryChainSel)
@@ -181,7 +180,7 @@ func GetRegistryContract(e *deployment.Environment, registryChainSel uint64) (*k
}
// ensure registry is deployed and get the registry contract and chain
- var registry *kcr.CapabilitiesRegistry
+ var registry *capabilities_registry.CapabilitiesRegistry
registryChainContracts, ok := contractSetsResp.ContractSets[registryChainSel]
if !ok {
return nil, deployment.Chain{}, fmt.Errorf("failed to deploy registry chain contracts. expected chain %d", registryChainSel)
@@ -323,12 +322,14 @@ func ConfigureOCR3Contract(env *deployment.Environment, chainSel uint64, dons []
if !ok {
return fmt.Errorf("failed to get contract set for chain %d", chainSel)
}
- contract := contracts.OCR3
- if contract == nil {
- return fmt.Errorf("no ocr3 contract found for chain %d", chainSel)
+
+ contract, err := contracts.GetOCR3Contract(nil)
+ if err != nil {
+ env.Logger.Errorf("failed to get OCR3 contract: %s", err)
+ return fmt.Errorf("failed to get OCR3 contract: %w", err)
}
- _, err := configureOCR3contract(configureOCR3Request{
+ _, err = configureOCR3contract(configureOCR3Request{
cfg: cfg,
chain: registryChain,
contract: contract,
@@ -351,6 +352,7 @@ type ConfigureOCR3Resp struct {
type ConfigureOCR3Config struct {
ChainSel uint64
NodeIDs []string
+ Address *common.Address // address of the OCR3 contract to configure
OCR3Config *OracleConfig
DryRun bool
@@ -379,10 +381,13 @@ func ConfigureOCR3ContractFromJD(env *deployment.Environment, cfg ConfigureOCR3C
if !ok {
return nil, fmt.Errorf("failed to get contract set for chain %d", cfg.ChainSel)
}
- contract := contracts.OCR3
- if contract == nil {
- return nil, fmt.Errorf("no ocr3 contract found for chain %d", cfg.ChainSel)
+
+ contract, err := contracts.GetOCR3Contract(cfg.Address)
+ if err != nil {
+ env.Logger.Errorf("%sfailed to get OCR3 contract at %s : %s", prefix, cfg.Address, err)
+ return nil, fmt.Errorf("failed to get OCR3 contract: %w", err)
}
+
nodes, err := deployment.NodeInfo(cfg.NodeIDs, env.Offchain)
if err != nil {
return nil, err
@@ -410,7 +415,7 @@ func ConfigureOCR3ContractFromJD(env *deployment.Environment, cfg ConfigureOCR3C
type RegisterCapabilitiesRequest struct {
Env *deployment.Environment
RegistryChainSelector uint64
- DonToCapabilities map[string][]kcr.CapabilitiesRegistryCapability
+ DonToCapabilities map[string][]capabilities_registry.CapabilitiesRegistryCapability
}
type RegisterCapabilitiesResponse struct {
@@ -418,11 +423,11 @@ type RegisterCapabilitiesResponse struct {
}
type RegisteredCapability struct {
- kcr.CapabilitiesRegistryCapability
+ capabilities_registry.CapabilitiesRegistryCapability
ID [32]byte
}
-func FromCapabilitiesRegistryCapability(cap *kcr.CapabilitiesRegistryCapability, e deployment.Environment, registryChainSelector uint64) (*RegisteredCapability, error) {
+func FromCapabilitiesRegistryCapability(cap *capabilities_registry.CapabilitiesRegistryCapability, e deployment.Environment, registryChainSelector uint64) (*RegisteredCapability, error) {
registry, _, err := GetRegistryContract(&e, registryChainSelector)
if err != nil {
return nil, fmt.Errorf("failed to get registry: %w", err)
@@ -456,7 +461,7 @@ func RegisterCapabilities(lggr logger.Logger, req RegisterCapabilitiesRequest) (
}
// capability could be hosted on multiple dons. need to deduplicate
- uniqueCaps := make(map[kcr.CapabilitiesRegistryCapability][32]byte)
+ uniqueCaps := make(map[capabilities_registry.CapabilitiesRegistryCapability][32]byte)
for don, caps := range req.DonToCapabilities {
var registerCaps []RegisteredCapability
for _, cap := range caps {
@@ -479,10 +484,14 @@ func RegisterCapabilities(lggr logger.Logger, req RegisterCapabilitiesRequest) (
resp.DonToCapabilities[don] = registerCaps
}
- var capabilities []kcr.CapabilitiesRegistryCapability
+ var capabilities []capabilities_registry.CapabilitiesRegistryCapability
for cap := range uniqueCaps {
capabilities = append(capabilities, cap)
}
+ if len(capabilities) == 0 {
+ lggr.Warn("no new capabilities to register")
+ return &RegisterCapabilitiesResponse{}, nil
+ }
// not using mcms; ignore proposals
_, err = AddCapabilities(lggr, &contracts, registryChain, capabilities, false)
if err != nil {
@@ -494,11 +503,11 @@ func RegisterCapabilities(lggr logger.Logger, req RegisterCapabilitiesRequest) (
type RegisterNOPSRequest struct {
Env *deployment.Environment
RegistryChainSelector uint64
- Nops []kcr.CapabilitiesRegistryNodeOperator
+ Nops []capabilities_registry.CapabilitiesRegistryNodeOperator
}
type RegisterNOPSResponse struct {
- Nops []*kcr.CapabilitiesRegistryNodeOperatorAdded
+ Nops []*capabilities_registry.CapabilitiesRegistryNodeOperatorAdded
}
func RegisterNOPS(ctx context.Context, lggr logger.Logger, req RegisterNOPSRequest) (*RegisterNOPSResponse, error) {
@@ -517,15 +526,15 @@ func RegisterNOPS(ctx context.Context, lggr logger.Logger, req RegisterNOPSReque
}
lggr.Infow("fetched existing node operators", "len", len(existingNopsAddrToID))
resp := &RegisterNOPSResponse{
- Nops: []*kcr.CapabilitiesRegistryNodeOperatorAdded{},
+ Nops: []*capabilities_registry.CapabilitiesRegistryNodeOperatorAdded{},
}
- nops := []kcr.CapabilitiesRegistryNodeOperator{}
+ nops := []capabilities_registry.CapabilitiesRegistryNodeOperator{}
for _, nop := range req.Nops {
if id, ok := existingNopsAddrToID[nop]; !ok {
nops = append(nops, nop)
} else {
lggr.Debugw("node operator already exists", "name", nop.Name, "admin", nop.Admin.String(), "id", id)
- resp.Nops = append(resp.Nops, &kcr.CapabilitiesRegistryNodeOperatorAdded{
+ resp.Nops = append(resp.Nops, &capabilities_registry.CapabilitiesRegistryNodeOperatorAdded{
NodeOperatorId: id,
Name: nop.Name,
Admin: nop.Admin,
@@ -538,7 +547,7 @@ func RegisterNOPS(ctx context.Context, lggr logger.Logger, req RegisterNOPSReque
}
tx, err := registry.AddNodeOperators(registryChain.DeployerKey, nops)
if err != nil {
- err = DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to call AddNodeOperators: %w", err)
}
// for some reason that i don't understand, the confirm must be called before the WaitMined or the latter will hang
@@ -601,45 +610,21 @@ func DefaultCapConfig(capType uint8, nNodes int) *capabilitiespb.CapabilityConfi
}
}
-func DecodeErr(encodedABI string, err error) error {
- if err == nil {
- return nil
- }
-
- //revive:disable
- var d rpc.DataError
- ok := errors.As(err, &d)
- if ok {
- encErr, ok := d.ErrorData().(string)
- if !ok {
- return fmt.Errorf("error without error data: %s", d.Error())
- }
- errStr, parseErr := deployment.ParseErrorFromABI(encErr, encodedABI)
- if parseErr != nil {
- return fmt.Errorf("failed to decode error '%s' with abi: %w", encErr, parseErr)
- }
- return fmt.Errorf("contract error: %s", errStr)
-
- }
- return fmt.Errorf("cannot decode error with abi: %w", err)
-}
-
// register nodes
type RegisterNodesRequest struct {
Env *deployment.Environment
RegistryChainSelector uint64
- NopToNodeIDs map[kcr.CapabilitiesRegistryNodeOperator][]string
+ NopToNodeIDs map[capabilities_registry.CapabilitiesRegistryNodeOperator][]string
DonToNodes map[string][]deployment.Node
DonToCapabilities map[string][]RegisteredCapability
- Nops []*kcr.CapabilitiesRegistryNodeOperatorAdded
+ Nops []*capabilities_registry.CapabilitiesRegistryNodeOperatorAdded
}
type RegisterNodesResponse struct {
- nodeIDToParams map[string]kcr.CapabilitiesRegistryNodeParams
+ nodeIDToParams map[string]capabilities_registry.CapabilitiesRegistryNodeParams
}
// registerNodes registers the nodes with the registry. it assumes that the deployer key in the Chain
// can sign the transactions update the contract state
-// TODO: 467 refactor to support MCMS. Specifically need to separate the call data generation from the actual contract call
func RegisterNodes(lggr logger.Logger, req *RegisterNodesRequest) (*RegisterNodesResponse, error) {
registry, registryChain, err := GetRegistryContract(req.Env, req.RegistryChainSelector)
if err != nil {
@@ -651,9 +636,9 @@ func RegisterNodes(lggr logger.Logger, req *RegisterNodesRequest) (*RegisterNode
count += len(nodes)
}
lggr.Infow("registering nodes...", "len", count)
- nodeToRegisterNop := make(map[string]*kcr.CapabilitiesRegistryNodeOperatorAdded)
+ nodeToRegisterNop := make(map[string]*capabilities_registry.CapabilitiesRegistryNodeOperatorAdded)
for _, nop := range req.Nops {
- n := kcr.CapabilitiesRegistryNodeOperator{
+ n := capabilities_registry.CapabilitiesRegistryNodeOperator{
Name: nop.Name,
Admin: nop.Admin,
}
@@ -676,7 +661,7 @@ func RegisterNodes(lggr logger.Logger, req *RegisterNodesRequest) (*RegisterNode
return nil, err
}
- nodeIDToParams := make(map[string]kcr.CapabilitiesRegistryNodeParams)
+ nodeIDToParams := make(map[string]capabilities_registry.CapabilitiesRegistryNodeParams)
for don, nodes := range req.DonToNodes {
caps, ok := req.DonToCapabilities[don]
if !ok {
@@ -707,7 +692,7 @@ func RegisterNodes(lggr logger.Logger, req *RegisterNodesRequest) (*RegisterNode
copy(signer[:], evmCC.OnchainPublicKey)
var csakey [32]byte
copy(csakey[:], evmCC.ConfigEncryptionPublicKey[:])
- params = kcr.CapabilitiesRegistryNodeParams{
+ params = capabilities_registry.CapabilitiesRegistryNodeParams{
NodeOperatorId: nop.NodeOperatorId,
Signer: signer,
P2pId: n.PeerID,
@@ -735,14 +720,14 @@ func RegisterNodes(lggr logger.Logger, req *RegisterNodesRequest) (*RegisterNode
}
}
- var uniqueNodeParams []kcr.CapabilitiesRegistryNodeParams
+ var uniqueNodeParams []capabilities_registry.CapabilitiesRegistryNodeParams
for _, v := range nodeIDToParams {
uniqueNodeParams = append(uniqueNodeParams, v)
}
lggr.Debugw("unique node params to add", "count", len(uniqueNodeParams), "params", uniqueNodeParams)
tx, err := registry.AddNodes(registryChain.DeployerKey, uniqueNodeParams)
if err != nil {
- err = DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
// no typed errors in the abi, so we have to do string matching
// try to add all nodes in one go, if that fails, fall back to 1-by-1
if !strings.Contains(err.Error(), "NodeAlreadyExists") {
@@ -750,9 +735,9 @@ func RegisterNodes(lggr logger.Logger, req *RegisterNodesRequest) (*RegisterNode
}
lggr.Warn("nodes already exist, falling back to 1-by-1")
for _, singleNodeParams := range uniqueNodeParams {
- tx, err = registry.AddNodes(registryChain.DeployerKey, []kcr.CapabilitiesRegistryNodeParams{singleNodeParams})
+ tx, err = registry.AddNodes(registryChain.DeployerKey, []capabilities_registry.CapabilitiesRegistryNodeParams{singleNodeParams})
if err != nil {
- err = DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
if strings.Contains(err.Error(), "NodeAlreadyExists") {
lggr.Warnw("node already exists, skipping", "p2pid", hex.EncodeToString(singleNodeParams.P2pId[:]))
continue
@@ -794,7 +779,7 @@ type RegisterDonsRequest struct {
}
type RegisterDonsResponse struct {
- DonInfos map[string]kcr.CapabilitiesRegistryDONInfo
+ DonInfos map[string]capabilities_registry.CapabilitiesRegistryDONInfo
}
func sortedHash(p2pids [][32]byte) string {
@@ -821,7 +806,7 @@ func RegisterDons(lggr logger.Logger, req RegisterDonsRequest) (*RegisterDonsRes
donInfos, err := registry.GetDONs(&bind.CallOpts{})
if err != nil {
- err = DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to call GetDONs: %w", err)
}
existingDONs := make(map[string]struct{})
@@ -856,7 +841,7 @@ func RegisterDons(lggr logger.Logger, req RegisterDonsRequest) (*RegisterDonsRes
return nil, fmt.Errorf("capabilities not found for DON %s", don.Name)
}
wfSupported := false
- var cfgs []kcr.CapabilitiesRegistryCapabilityConfiguration
+ var cfgs []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration
for _, cap := range caps {
if cap.CapabilityType == 2 { // OCR3 capability => WF supported
wfSupported = true
@@ -867,7 +852,7 @@ func RegisterDons(lggr logger.Logger, req RegisterDonsRequest) (*RegisterDonsRes
if err != nil {
return nil, fmt.Errorf("failed to marshal capability config for %v: %w", cap, err)
}
- cfgs = append(cfgs, kcr.CapabilitiesRegistryCapabilityConfiguration{
+ cfgs = append(cfgs, capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
CapabilityId: cap.ID,
Config: cfgb,
})
@@ -875,7 +860,7 @@ func RegisterDons(lggr logger.Logger, req RegisterDonsRequest) (*RegisterDonsRes
tx, err := registry.AddDON(registryChain.DeployerKey, p2pIds, cfgs, true, wfSupported, don.F)
if err != nil {
- err = DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to call AddDON for don '%s' p2p2Id hash %s capability %v: %w", don.Name, p2pSortedHash, cfgs, err)
}
_, err = registryChain.Confirm(tx)
@@ -902,7 +887,7 @@ func RegisterDons(lggr logger.Logger, req RegisterDonsRequest) (*RegisterDonsRes
}
}
if err != nil {
- err = DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to call GetDONs: %w", err)
}
if !foundAll {
@@ -910,7 +895,7 @@ func RegisterDons(lggr logger.Logger, req RegisterDonsRequest) (*RegisterDonsRes
}
resp := RegisterDonsResponse{
- DonInfos: make(map[string]kcr.CapabilitiesRegistryDONInfo),
+ DonInfos: make(map[string]capabilities_registry.CapabilitiesRegistryDONInfo),
}
for i, donInfo := range donInfos {
donName, ok := p2pIdsToDon[sortedHash(donInfo.NodeP2PIds)]
@@ -925,7 +910,7 @@ func RegisterDons(lggr logger.Logger, req RegisterDonsRequest) (*RegisterDonsRes
}
// are all DONs from p2pIdsToDon in donInfos
-func containsAllDONs(donInfos []kcr.CapabilitiesRegistryDONInfo, p2pIdsToDon map[string]string) bool {
+func containsAllDONs(donInfos []capabilities_registry.CapabilitiesRegistryDONInfo, p2pIdsToDon map[string]string) bool {
found := make(map[string]struct{})
for _, donInfo := range donInfos {
hash := sortedHash(donInfo.NodeP2PIds)
@@ -958,13 +943,13 @@ func configureForwarder(lggr logger.Logger, chain deployment.Chain, contractSet
}
tx, err := fwdr.SetConfig(txOpts, dn.Info.Id, ver, dn.Info.F, signers)
if err != nil {
- err = DecodeErr(kf.KeystoneForwarderABI, err)
+ err = deployment.DecodeErr(kf.KeystoneForwarderABI, err)
return nil, fmt.Errorf("failed to call SetConfig for forwarder %s on chain %d: %w", fwdr.Address().String(), chain.Selector, err)
}
if !useMCMS {
_, err = chain.Confirm(tx)
if err != nil {
- err = DecodeErr(kf.KeystoneForwarderABI, err)
+ err = deployment.DecodeErr(kf.KeystoneForwarderABI, err)
return nil, fmt.Errorf("failed to confirm SetConfig for forwarder %s: %w", fwdr.Address().String(), err)
}
} else {
diff --git a/deployment/keystone/forwarder_deployer.go b/deployment/keystone/changeset/internal/forwarder_deployer.go
similarity index 96%
rename from deployment/keystone/forwarder_deployer.go
rename to deployment/keystone/changeset/internal/forwarder_deployer.go
index 7c7b3a1ed93..2ce3ae88146 100644
--- a/deployment/keystone/forwarder_deployer.go
+++ b/deployment/keystone/changeset/internal/forwarder_deployer.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"fmt"
@@ -8,7 +8,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
+ forwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0"
)
type KeystoneForwarderDeployer struct {
diff --git a/deployment/keystone/ocr3_deployer.go b/deployment/keystone/changeset/internal/ocr3_deployer.go
similarity index 91%
rename from deployment/keystone/ocr3_deployer.go
rename to deployment/keystone/changeset/internal/ocr3_deployer.go
index 227894f7c67..beafe9bb9e2 100644
--- a/deployment/keystone/ocr3_deployer.go
+++ b/deployment/keystone/changeset/internal/ocr3_deployer.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"fmt"
@@ -7,7 +7,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability"
+ ocr3_capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0"
)
type OCR3Deployer struct {
diff --git a/deployment/keystone/ocr3config.go b/deployment/keystone/changeset/internal/ocr3config.go
similarity index 98%
rename from deployment/keystone/ocr3config.go
rename to deployment/keystone/changeset/internal/ocr3config.go
index aed142ea116..74f8a9dabd5 100644
--- a/deployment/keystone/ocr3config.go
+++ b/deployment/keystone/changeset/internal/ocr3config.go
@@ -1,6 +1,6 @@
// TODO: KS-458 copied from https://github.com/smartcontractkit/chainlink/blob/65924811dc53a211613927c814d7f04fd85439a4/core/scripts/keystone/src/88_gen_ocr3_config.go#L1
// to unblock go mod issues when trying to import the scripts package
-package keystone
+package internal
import (
"crypto/ed25519"
@@ -22,7 +22,7 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"github.com/smartcontractkit/chainlink/deployment"
- kocr3 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability"
+ kocr3 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype"
"github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
@@ -327,7 +327,7 @@ func configureOCR3contract(req configureOCR3Request) (*configureOCR3Response, er
ocrConfig.OffchainConfig,
)
if err != nil {
- err = DecodeErr(kocr3.OCR3CapabilityABI, err)
+ err = deployment.DecodeErr(kocr3.OCR3CapabilityABI, err)
return nil, fmt.Errorf("failed to call SetConfig for OCR3 contract %s using mcms: %T: %w", req.contract.Address().String(), req.useMCMS, err)
}
@@ -335,7 +335,7 @@ func configureOCR3contract(req configureOCR3Request) (*configureOCR3Response, er
if !req.useMCMS {
_, err = req.chain.Confirm(tx)
if err != nil {
- err = DecodeErr(kocr3.OCR3CapabilityABI, err)
+ err = deployment.DecodeErr(kocr3.OCR3CapabilityABI, err)
return nil, fmt.Errorf("failed to confirm SetConfig for OCR3 contract %s: %w", req.contract.Address().String(), err)
}
} else {
diff --git a/deployment/keystone/ocr3config_test.go b/deployment/keystone/changeset/internal/ocr3config_test.go
similarity index 99%
rename from deployment/keystone/ocr3config_test.go
rename to deployment/keystone/changeset/internal/ocr3config_test.go
index 55fa16af68c..b412a727eb9 100644
--- a/deployment/keystone/ocr3config_test.go
+++ b/deployment/keystone/changeset/internal/ocr3config_test.go
@@ -1,6 +1,6 @@
// TODO: KS-458 copied from https://github.com/smartcontractkit/chainlink/blob/65924811dc53a211613927c814d7f04fd85439a4/core/scripts/keystone/src/88_gen_ocr3_config.go#L1
// to unblock go mod issues when trying to import the scripts package
-package keystone
+package internal
import (
"encoding/json"
diff --git a/deployment/keystone/state.go b/deployment/keystone/changeset/internal/state.go
similarity index 56%
rename from deployment/keystone/state.go
rename to deployment/keystone/changeset/internal/state.go
index cbf449c7f31..3253acaf4e4 100644
--- a/deployment/keystone/state.go
+++ b/deployment/keystone/changeset/internal/state.go
@@ -1,6 +1,7 @@
-package keystone
+package internal
import (
+ "errors"
"fmt"
"github.com/ethereum/go-ethereum/common"
@@ -11,9 +12,10 @@ import (
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
common_v1_0 "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0"
"github.com/smartcontractkit/chainlink/deployment/keystone/view"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability"
+ capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
+ forwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0"
+ ocr3_capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0"
+ workflow_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper"
)
type GetContractSetsRequest struct {
@@ -27,15 +29,18 @@ type GetContractSetsResponse struct {
type ContractSet struct {
commonchangeset.MCMSWithTimelockState
- OCR3 *ocr3_capability.OCR3Capability
+ OCR3 map[common.Address]*ocr3_capability.OCR3Capability
Forwarder *forwarder.KeystoneForwarder
CapabilitiesRegistry *capabilities_registry.CapabilitiesRegistry
+ WorkflowRegistry *workflow_registry.WorkflowRegistry
}
func (cs ContractSet) TransferableContracts() []common.Address {
var out []common.Address
if cs.OCR3 != nil {
- out = append(out, cs.OCR3.Address())
+ for _, ocr := range cs.OCR3 {
+ out = append(out, ocr.Address())
+ }
}
if cs.Forwarder != nil {
out = append(out, cs.Forwarder.Address())
@@ -43,6 +48,9 @@ func (cs ContractSet) TransferableContracts() []common.Address {
if cs.CapabilitiesRegistry != nil {
out = append(out, cs.CapabilitiesRegistry.Address())
}
+ if cs.WorkflowRegistry != nil {
+ out = append(out, cs.WorkflowRegistry.Address())
+ }
return out
}
@@ -58,6 +66,10 @@ func (cs ContractSet) View() (view.KeystoneChainView, error) {
return out, nil
}
+func (cs ContractSet) GetOCR3Contract(addr *common.Address) (*ocr3_capability.OCR3Capability, error) {
+ return getOCR3Contract(cs.OCR3, addr)
+}
+
func GetContractSets(lggr logger.Logger, req *GetContractSetsRequest) (*GetContractSetsResponse, error) {
resp := &GetContractSetsResponse{
ContractSets: make(map[uint64]ContractSet),
@@ -78,7 +90,7 @@ func GetContractSets(lggr logger.Logger, req *GetContractSetsRequest) (*GetContr
func loadContractSet(lggr logger.Logger, chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*ContractSet, error) {
var out ContractSet
- mcmsWithTimelock, err := commonchangeset.MaybeLoadMCMSWithTimelockState(chain, addresses)
+ mcmsWithTimelock, err := commonchangeset.MaybeLoadMCMSWithTimelockChainState(chain, addresses)
if err != nil {
return nil, fmt.Errorf("failed to load mcms contract: %w", err)
}
@@ -104,7 +116,16 @@ func loadContractSet(lggr logger.Logger, chain deployment.Chain, addresses map[s
if err != nil {
return nil, fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err)
}
- out.OCR3 = c
+ if out.OCR3 == nil {
+ out.OCR3 = make(map[common.Address]*ocr3_capability.OCR3Capability)
+ }
+ out.OCR3[common.HexToAddress(addr)] = c
+ case WorkflowRegistry:
+ c, err := workflow_registry.NewWorkflowRegistry(common.HexToAddress(addr), chain.Client)
+ if err != nil {
+ return nil, fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err)
+ }
+ out.WorkflowRegistry = c
default:
lggr.Warnw("unknown contract type", "type", tv.Type)
// ignore unknown contract types
@@ -112,3 +133,35 @@ func loadContractSet(lggr logger.Logger, chain deployment.Chain, addresses map[s
}
return &out, nil
}
+
+// getOCR3Contract returns the OCR3 contract from the contract set. By default, it returns the only
+// contract in the set if there is no address specified. If an address is specified, it returns the
+// contract with that address. If the address is specified but not found in the contract set, it returns
+// an error.
+func getOCR3Contract(contracts map[common.Address]*ocr3_capability.OCR3Capability, addr *common.Address) (*ocr3_capability.OCR3Capability, error) {
+ // Fail if the OCR3 contract address is unspecified and there are multiple OCR3 contracts
+ if addr == nil && len(contracts) > 1 {
+ return nil, errors.New("OCR contract address is unspecified")
+ }
+
+ // Use the first OCR3 contract if the address is unspecified
+ if addr == nil && len(contracts) == 1 {
+ // use the first OCR3 contract
+ for _, c := range contracts {
+ return c, nil
+ }
+ }
+
+ // Select the OCR3 contract by address
+ if contract, ok := contracts[*addr]; ok {
+ return contract, nil
+ }
+
+ addrSet := make([]string, 0, len(contracts))
+ for a := range contracts {
+ addrSet = append(addrSet, a.String())
+ }
+
+ // Fail if the OCR3 contract address is specified but not found in the contract set
+ return nil, fmt.Errorf("OCR3 contract address %s not found in contract set %v", *addr, addrSet)
+}
diff --git a/deployment/keystone/changeset/internal/test/utils.go b/deployment/keystone/changeset/internal/test/utils.go
index 0a23f7e60a7..cc7e3b27160 100644
--- a/deployment/keystone/changeset/internal/test/utils.go
+++ b/deployment/keystone/changeset/internal/test/utils.go
@@ -17,10 +17,8 @@ import (
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -29,18 +27,19 @@ type Don struct {
P2PIDs []p2pkey.PeerID
CapabilityConfigs []internal.CapabilityConfig
}
+
type SetupTestRegistryRequest struct {
- P2pToCapabilities map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability
- NopToNodes map[kcr.CapabilitiesRegistryNodeOperator][]*internal.P2PSignerEnc
+ P2pToCapabilities map[p2pkey.PeerID][]capabilities_registry.CapabilitiesRegistryCapability
+ NopToNodes map[capabilities_registry.CapabilitiesRegistryNodeOperator][]*internal.P2PSignerEnc
Dons []Don
// TODO maybe add support for MCMS at this level
}
type SetupTestRegistryResponse struct {
- Registry *kcr.CapabilitiesRegistry
+ Registry *capabilities_registry.CapabilitiesRegistry
Chain deployment.Chain
RegistrySelector uint64
- ContractSet *kslib.ContractSet
+ ContractSet *internal.ContractSet
}
func SetupTestRegistry(t *testing.T, lggr logger.Logger, req *SetupTestRegistryRequest) *SetupTestRegistryResponse {
@@ -48,7 +47,7 @@ func SetupTestRegistry(t *testing.T, lggr logger.Logger, req *SetupTestRegistryR
// deploy the registry
registry := deployCapReg(t, chain)
// convert req to nodeoperators
- nops := make([]kcr.CapabilitiesRegistryNodeOperator, 0)
+ nops := make([]capabilities_registry.CapabilitiesRegistryNodeOperator, 0)
for nop := range req.NopToNodes {
nops = append(nops, nop)
}
@@ -60,19 +59,19 @@ func SetupTestRegistry(t *testing.T, lggr logger.Logger, req *SetupTestRegistryR
// add capabilities to registry
capCache := NewCapabiltyCache(t)
- var capabilities []kcr.CapabilitiesRegistryCapability
+ var capabilities []capabilities_registry.CapabilitiesRegistryCapability
for _, caps := range req.P2pToCapabilities {
capabilities = append(capabilities, caps...)
}
registeredCapabilities := capCache.AddCapabilities(lggr, chain, registry, capabilities)
- expectedDeduped := make(map[kcr.CapabilitiesRegistryCapability]struct{})
+ expectedDeduped := make(map[capabilities_registry.CapabilitiesRegistryCapability]struct{})
for _, cap := range capabilities {
expectedDeduped[cap] = struct{}{}
}
require.Len(t, registeredCapabilities, len(expectedDeduped))
// make the nodes and register node
- var nodeParams []kcr.CapabilitiesRegistryNodeParams
+ var nodeParams []capabilities_registry.CapabilitiesRegistryNodeParams
initialp2pToCapabilities := make(map[p2pkey.PeerID][][32]byte)
for p2pID := range req.P2pToCapabilities {
initialp2pToCapabilities[p2pID] = mustCapabilityIds(t, registry, registeredCapabilities)
@@ -83,7 +82,7 @@ func SetupTestRegistry(t *testing.T, lggr logger.Logger, req *SetupTestRegistryR
require.Fail(t, "missing nopToNodes for %s", nop.Name)
}
for _, p2pSignerEnc := range req.NopToNodes[nop] {
- nodeParams = append(nodeParams, kcr.CapabilitiesRegistryNodeParams{
+ nodeParams = append(nodeParams, capabilities_registry.CapabilitiesRegistryNodeParams{
Signer: p2pSignerEnc.Signer,
P2pId: p2pSignerEnc.P2PKey,
EncryptionPublicKey: p2pSignerEnc.EncryptionPublicKey,
@@ -101,21 +100,21 @@ func SetupTestRegistry(t *testing.T, lggr logger.Logger, req *SetupTestRegistryR
Registry: registry,
Chain: chain,
RegistrySelector: chain.Selector,
- ContractSet: &kslib.ContractSet{
+ ContractSet: &internal.ContractSet{
CapabilitiesRegistry: registry,
},
}
}
-func deployCapReg(t *testing.T, chain deployment.Chain) *kcr.CapabilitiesRegistry {
- capabilitiesRegistryDeployer, err := kslib.NewCapabilitiesRegistryDeployer()
+func deployCapReg(t *testing.T, chain deployment.Chain) *capabilities_registry.CapabilitiesRegistry {
+ capabilitiesRegistryDeployer, err := internal.NewCapabilitiesRegistryDeployer()
require.NoError(t, err)
- _, err = capabilitiesRegistryDeployer.Deploy(kslib.DeployRequest{Chain: chain})
+ _, err = capabilitiesRegistryDeployer.Deploy(internal.DeployRequest{Chain: chain})
require.NoError(t, err)
return capabilitiesRegistryDeployer.Contract()
}
-func addNops(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry *kcr.CapabilitiesRegistry, nops []kcr.CapabilitiesRegistryNodeOperator) *kslib.RegisterNOPSResponse {
+func addNops(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry *capabilities_registry.CapabilitiesRegistry, nops []capabilities_registry.CapabilitiesRegistryNodeOperator) *internal.RegisterNOPSResponse {
env := &deployment.Environment{
Logger: lggr,
Chains: map[uint64]deployment.Chain{
@@ -124,13 +123,13 @@ func addNops(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry
ExistingAddresses: deployment.NewMemoryAddressBookFromMap(map[uint64]map[string]deployment.TypeAndVersion{
chain.Selector: {
registry.Address().String(): deployment.TypeAndVersion{
- Type: kslib.CapabilitiesRegistry,
+ Type: internal.CapabilitiesRegistry,
Version: deployment.Version1_0_0,
},
},
}),
}
- resp, err := kslib.RegisterNOPS(context.TODO(), lggr, kslib.RegisterNOPSRequest{
+ resp, err := internal.RegisterNOPS(context.TODO(), lggr, internal.RegisterNOPSRequest{
Env: env,
RegistryChainSelector: chain.Selector,
Nops: nops,
@@ -139,23 +138,23 @@ func addNops(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry
return resp
}
-func addNodes(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry *kcr.CapabilitiesRegistry, nodes []kcr.CapabilitiesRegistryNodeParams) {
+func addNodes(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry *capabilities_registry.CapabilitiesRegistry, nodes []capabilities_registry.CapabilitiesRegistryNodeParams) {
tx, err := registry.AddNodes(chain.DeployerKey, nodes)
if err != nil {
- err2 := kslib.DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err2 := deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
require.Fail(t, fmt.Sprintf("failed to call AddNodes: %s: %s", err, err2))
}
_, err = chain.Confirm(tx)
require.NoError(t, err)
}
-func addDons(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry *kcr.CapabilitiesRegistry, capCache *CapabilityCache, dons []Don) {
+func addDons(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry *capabilities_registry.CapabilitiesRegistry, capCache *CapabilityCache, dons []Don) {
for _, don := range dons {
acceptsWorkflows := false
// lookup the capabilities
- var capConfigs []kcr.CapabilitiesRegistryCapabilityConfiguration
+ var capConfigs []capabilities_registry.CapabilitiesRegistryCapabilityConfiguration
for _, ccfg := range don.CapabilityConfigs {
- var cc = kcr.CapabilitiesRegistryCapabilityConfiguration{
+ var cc = capabilities_registry.CapabilitiesRegistryCapabilityConfiguration{
CapabilityId: [32]byte{},
Config: ccfg.Config,
}
@@ -175,7 +174,7 @@ func addDons(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry
f := len(don.P2PIDs)/3 + 1
tx, err := registry.AddDON(chain.DeployerKey, internal.PeerIDsToBytes(don.P2PIDs), capConfigs, isPublic, acceptsWorkflows, uint8(f))
if err != nil {
- err2 := kslib.DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err2 := deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
require.Fail(t, fmt.Sprintf("failed to call AddDON: %s: %s", err, err2))
}
_, err = chain.Confirm(tx)
@@ -183,7 +182,7 @@ func addDons(t *testing.T, lggr logger.Logger, chain deployment.Chain, registry
}
}
-func defaultCapConfig(t *testing.T, cap kcr.CapabilitiesRegistryCapability) []byte {
+func defaultCapConfig(t *testing.T, cap capabilities_registry.CapabilitiesRegistryCapability) []byte {
empty := &capabilitiespb.CapabilityConfig{
DefaultConfig: values.Proto(values.EmptyMap()).GetMapValue(),
}
@@ -204,24 +203,24 @@ func NewCapabiltyCache(t *testing.T) *CapabilityCache {
nameToId: make(map[string][32]byte),
}
}
-func (cc *CapabilityCache) Get(cap kcr.CapabilitiesRegistryCapability) ([32]byte, bool) {
- id, exists := cc.nameToId[kslib.CapabilityID(cap)]
+func (cc *CapabilityCache) Get(cap capabilities_registry.CapabilitiesRegistryCapability) ([32]byte, bool) {
+ id, exists := cc.nameToId[internal.CapabilityID(cap)]
return id, exists
}
// AddCapabilities adds the capabilities to the registry and returns the registered capabilities
// if the capability is already registered, it will not be re-registered
// if duplicate capabilities are passed, they will be deduped
-func (cc *CapabilityCache) AddCapabilities(lggr logger.Logger, chain deployment.Chain, registry *kcr.CapabilitiesRegistry, capabilities []kcr.CapabilitiesRegistryCapability) []kslib.RegisteredCapability {
+func (cc *CapabilityCache) AddCapabilities(lggr logger.Logger, chain deployment.Chain, registry *capabilities_registry.CapabilitiesRegistry, capabilities []capabilities_registry.CapabilitiesRegistryCapability) []internal.RegisteredCapability {
t := cc.t
- var out []kslib.RegisteredCapability
+ var out []internal.RegisteredCapability
// get the registered capabilities & dedup
- seen := make(map[kcr.CapabilitiesRegistryCapability]struct{})
- var toRegister []kcr.CapabilitiesRegistryCapability
+ seen := make(map[capabilities_registry.CapabilitiesRegistryCapability]struct{})
+ var toRegister []capabilities_registry.CapabilitiesRegistryCapability
for _, cap := range capabilities {
- id, cached := cc.nameToId[kslib.CapabilityID(cap)]
+ id, cached := cc.nameToId[internal.CapabilityID(cap)]
if cached {
- out = append(out, kslib.RegisteredCapability{
+ out = append(out, internal.RegisteredCapability{
CapabilitiesRegistryCapability: cap,
ID: id,
})
@@ -238,7 +237,7 @@ func (cc *CapabilityCache) AddCapabilities(lggr logger.Logger, chain deployment.
}
tx, err := registry.AddCapabilities(chain.DeployerKey, toRegister)
if err != nil {
- err2 := kslib.DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err2 := deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)
require.Fail(t, fmt.Sprintf("failed to call AddCapabilities: %s: %s", err, err2))
}
_, err = chain.Confirm(tx)
@@ -249,12 +248,12 @@ func (cc *CapabilityCache) AddCapabilities(lggr logger.Logger, chain deployment.
capb := capb
id, err := registry.GetHashedCapabilityId(&bind.CallOpts{}, capb.LabelledName, capb.Version)
require.NoError(t, err)
- out = append(out, kslib.RegisteredCapability{
+ out = append(out, internal.RegisteredCapability{
CapabilitiesRegistryCapability: capb,
ID: id,
})
// cache the id
- cc.nameToId[kslib.CapabilityID(capb)] = id
+ cc.nameToId[internal.CapabilityID(capb)] = id
}
return out
}
@@ -270,7 +269,7 @@ func testChain(t *testing.T) deployment.Chain {
return chain
}
-func capabilityIds(registry *capabilities_registry.CapabilitiesRegistry, rcs []kslib.RegisteredCapability) ([][32]byte, error) {
+func capabilityIds(registry *capabilities_registry.CapabilitiesRegistry, rcs []internal.RegisteredCapability) ([][32]byte, error) {
out := make([][32]byte, len(rcs))
for i := range rcs {
id, err := registry.GetHashedCapabilityId(&bind.CallOpts{}, rcs[i].LabelledName, rcs[i].Version)
@@ -282,7 +281,7 @@ func capabilityIds(registry *capabilities_registry.CapabilitiesRegistry, rcs []k
return out, nil
}
-func mustCapabilityIds(t *testing.T, registry *capabilities_registry.CapabilitiesRegistry, rcs []kslib.RegisteredCapability) [][32]byte {
+func mustCapabilityIds(t *testing.T, registry *capabilities_registry.CapabilitiesRegistry, rcs []internal.RegisteredCapability) [][32]byte {
t.Helper()
out, err := capabilityIds(registry, rcs)
require.NoError(t, err)
diff --git a/deployment/keystone/testdata/testnet_wf_view.json b/deployment/keystone/changeset/internal/testdata/testnet_wf_view.json
similarity index 100%
rename from deployment/keystone/testdata/testnet_wf_view.json
rename to deployment/keystone/changeset/internal/testdata/testnet_wf_view.json
diff --git a/deployment/keystone/types.go b/deployment/keystone/changeset/internal/types.go
similarity index 97%
rename from deployment/keystone/types.go
rename to deployment/keystone/changeset/internal/types.go
index d406487043c..173e3ba1ad0 100644
--- a/deployment/keystone/types.go
+++ b/deployment/keystone/changeset/internal/types.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"errors"
@@ -14,13 +14,14 @@ import (
"github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
var (
CapabilitiesRegistry deployment.ContractType = "CapabilitiesRegistry" // https://github.com/smartcontractkit/chainlink/blob/50c1b3dbf31bd145b312739b08967600a5c67f30/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol#L392
+ WorkflowRegistry deployment.ContractType = "WorkflowRegistry" // https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/workflow/dev/WorkflowRegistry.sol
KeystoneForwarder deployment.ContractType = "KeystoneForwarder" // https://github.com/smartcontractkit/chainlink/blob/50c1b3dbf31bd145b312739b08967600a5c67f30/contracts/src/v0.8/keystone/KeystoneForwarder.sol#L90
OCR3Capability deployment.ContractType = "OCR3Capability" // https://github.com/smartcontractkit/chainlink/blob/50c1b3dbf31bd145b312739b08967600a5c67f30/contracts/src/v0.8/keystone/OCR3Capability.sol#L12
FeedConsumer deployment.ContractType = "FeedConsumer" // no type and a version in contract https://github.com/smartcontractkit/chainlink/blob/89183a8a5d22b1aeca0ade3b76d16aa84067aa57/contracts/src/v0.8/keystone/KeystoneFeedsConsumer.sol#L1
diff --git a/deployment/keystone/types_test.go b/deployment/keystone/changeset/internal/types_test.go
similarity index 99%
rename from deployment/keystone/types_test.go
rename to deployment/keystone/changeset/internal/types_test.go
index ea122837aa6..cfc953d6126 100644
--- a/deployment/keystone/types_test.go
+++ b/deployment/keystone/changeset/internal/types_test.go
@@ -1,4 +1,4 @@
-package keystone
+package internal
import (
"encoding/hex"
diff --git a/deployment/keystone/changeset/internal/update_don.go b/deployment/keystone/changeset/internal/update_don.go
index fc7e410e540..3cfc386b2ba 100644
--- a/deployment/keystone/changeset/internal/update_don.go
+++ b/deployment/keystone/changeset/internal/update_don.go
@@ -17,9 +17,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
"google.golang.org/protobuf/proto"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
-
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
// CapabilityConfig is a struct that holds a capability and its configuration
@@ -30,7 +28,7 @@ type CapabilityConfig struct {
type UpdateDonRequest struct {
Chain deployment.Chain
- ContractSet *kslib.ContractSet // contract set for the given chain
+ ContractSet *ContractSet // contract set for the given chain
P2PIDs []p2pkey.PeerID // this is the unique identifier for the don
CapabilityConfigs []CapabilityConfig // if Config subfield is nil, a default config is used
@@ -97,7 +95,7 @@ func UpdateDon(lggr logger.Logger, req *UpdateDonRequest) (*UpdateDonResponse, e
}
tx, err := registry.UpdateDON(txOpts, don.Id, don.NodeP2PIds, cfgs, don.IsPublic, don.F)
if err != nil {
- err = kslib.DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(kcr.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to call UpdateDON: %w", err)
}
var ops *timelock.BatchChainOperation
@@ -150,7 +148,7 @@ func computeConfigs(registry *kcr.CapabilitiesRegistry, caps []CapabilityConfig,
}
out[i].CapabilityId = id
if out[i].Config == nil {
- c := kslib.DefaultCapConfig(cap.Capability.CapabilityType, int(donInfo.F))
+ c := DefaultCapConfig(cap.Capability.CapabilityType, int(donInfo.F))
cb, err := proto.Marshal(c)
if err != nil {
return nil, fmt.Errorf("failed to marshal capability config for %v: %w", c, err)
diff --git a/deployment/keystone/changeset/internal/update_don_test.go b/deployment/keystone/changeset/internal/update_don_test.go
index 93857b26f78..57b15138538 100644
--- a/deployment/keystone/changeset/internal/update_don_test.go
+++ b/deployment/keystone/changeset/internal/update_don_test.go
@@ -13,12 +13,10 @@ import (
chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/deployment/keystone"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
kscs "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
kstest "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal/test"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -100,14 +98,14 @@ func TestUpdateDon(t *testing.T) {
t.Run("empty", func(t *testing.T) {
cfg := setupUpdateDonTestConfig{
- dons: []kslib.DonInfo{
+ dons: []internal.DonInfo{
{
Name: "don 1",
Nodes: []deployment.Node{node_1, node_2, node_3, node_4},
Capabilities: []kcr.CapabilitiesRegistryCapability{initialCap},
},
},
- nops: []keystone.NOP{
+ nops: []internal.NOP{
{
Name: "nop 1",
Nodes: []string{node_1.NodeID, node_2.NodeID, node_3.NodeID, node_4.NodeID},
@@ -223,8 +221,8 @@ func newNode(t *testing.T, cfg minimalNodeCfg) deployment.Node {
}
type setupUpdateDonTestConfig struct {
- dons []kslib.DonInfo
- nops []keystone.NOP
+ dons []internal.DonInfo
+ nops []internal.NOP
}
type setupUpdateDonTestResult struct {
@@ -239,7 +237,7 @@ func registerTestDon(t *testing.T, lggr logger.Logger, cfg setupUpdateDonTestCon
}
-func newSetupTestRegistryRequest(t *testing.T, dons []kslib.DonInfo, nops []keystone.NOP) *kstest.SetupTestRegistryRequest {
+func newSetupTestRegistryRequest(t *testing.T, dons []internal.DonInfo, nops []internal.NOP) *kstest.SetupTestRegistryRequest {
t.Helper()
nodes := make(map[string]deployment.Node)
for _, don := range dons {
@@ -258,7 +256,7 @@ func newSetupTestRegistryRequest(t *testing.T, dons []kslib.DonInfo, nops []keys
return req
}
-func makeNopToNodes(t *testing.T, nops []keystone.NOP, nodes map[string]deployment.Node) map[kcr.CapabilitiesRegistryNodeOperator][]*internal.P2PSignerEnc {
+func makeNopToNodes(t *testing.T, nops []internal.NOP, nodes map[string]deployment.Node) map[kcr.CapabilitiesRegistryNodeOperator][]*internal.P2PSignerEnc {
nopToNodes := make(map[kcr.CapabilitiesRegistryNodeOperator][]*internal.P2PSignerEnc)
for _, nop := range nops {
@@ -282,7 +280,7 @@ func makeNopToNodes(t *testing.T, nops []keystone.NOP, nodes map[string]deployme
return nopToNodes
}
-func makeP2PToCapabilities(t *testing.T, dons []kslib.DonInfo) map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability {
+func makeP2PToCapabilities(t *testing.T, dons []internal.DonInfo) map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability {
p2pToCapabilities := make(map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability)
for _, don := range dons {
for _, node := range don.Nodes {
@@ -296,7 +294,7 @@ func makeP2PToCapabilities(t *testing.T, dons []kslib.DonInfo) map[p2pkey.PeerID
return p2pToCapabilities
}
-func makeTestDon(t *testing.T, dons []kslib.DonInfo) []kstest.Don {
+func makeTestDon(t *testing.T, dons []internal.DonInfo) []kstest.Don {
out := make([]kstest.Don, len(dons))
for i, don := range dons {
out[i] = testDon(t, don)
@@ -304,7 +302,7 @@ func makeTestDon(t *testing.T, dons []kslib.DonInfo) []kstest.Don {
return out
}
-func testDon(t *testing.T, don kslib.DonInfo) kstest.Don {
+func testDon(t *testing.T, don internal.DonInfo) kstest.Don {
var p2pids []p2pkey.PeerID
for _, node := range don.Nodes {
// all chain configs are the same wrt admin address & node keys
diff --git a/deployment/keystone/changeset/internal/update_node_capabilities.go b/deployment/keystone/changeset/internal/update_node_capabilities.go
index fe101c90296..16c37267060 100644
--- a/deployment/keystone/changeset/internal/update_node_capabilities.go
+++ b/deployment/keystone/changeset/internal/update_node_capabilities.go
@@ -5,14 +5,13 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
type UpdateNodeCapabilitiesImplRequest struct {
Chain deployment.Chain
- ContractSet *kslib.ContractSet
+ ContractSet *ContractSet
P2pToCapabilities map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability
UseMCMS bool
@@ -38,7 +37,7 @@ func UpdateNodeCapabilitiesImpl(lggr logger.Logger, req *UpdateNodeCapabilitiesI
for _, cap := range req.P2pToCapabilities {
capabilities = append(capabilities, cap...)
}
- op, err := kslib.AddCapabilities(lggr, req.ContractSet, req.Chain, capabilities, req.UseMCMS)
+ op, err := AddCapabilities(lggr, req.ContractSet, req.Chain, capabilities, req.UseMCMS)
if err != nil {
return nil, fmt.Errorf("failed to add capabilities: %w", err)
}
diff --git a/deployment/keystone/changeset/internal/update_node_capabilities_test.go b/deployment/keystone/changeset/internal/update_node_capabilities_test.go
index ac39e57b32d..65da264dd01 100644
--- a/deployment/keystone/changeset/internal/update_node_capabilities_test.go
+++ b/deployment/keystone/changeset/internal/update_node_capabilities_test.go
@@ -8,9 +8,9 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
kstest "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal/test"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -25,9 +25,9 @@ func TestUpdateNodeCapabilities(t *testing.T) {
},
},
}
- nopToNodes = map[kcr.CapabilitiesRegistryNodeOperator][]*kslib.P2PSignerEnc{
- testNop(t, "testNop"): []*kslib.P2PSignerEnc{
- &kslib.P2PSignerEnc{
+ nopToNodes = map[kcr.CapabilitiesRegistryNodeOperator][]*internal.P2PSignerEnc{
+ testNop(t, "testNop"): []*internal.P2PSignerEnc{
+ &internal.P2PSignerEnc{
Signer: [32]byte{0: 1},
P2PKey: testPeerID(t, "0x1"),
EncryptionPublicKey: [32]byte{3: 16, 4: 2},
@@ -40,7 +40,7 @@ func TestUpdateNodeCapabilities(t *testing.T) {
type args struct {
lggr logger.Logger
- req *kslib.UpdateNodeCapabilitiesImplRequest // chain and registry are set in the test setup
+ req *internal.UpdateNodeCapabilitiesImplRequest // chain and registry are set in the test setup
initialState *kstest.SetupTestRegistryRequest
}
tests := []struct {
@@ -53,7 +53,7 @@ func TestUpdateNodeCapabilities(t *testing.T) {
name: "invalid request",
args: args{
lggr: lggr,
- req: &kslib.UpdateNodeCapabilitiesImplRequest{
+ req: &internal.UpdateNodeCapabilitiesImplRequest{
Chain: deployment.Chain{},
},
initialState: &kstest.SetupTestRegistryRequest{},
@@ -68,7 +68,7 @@ func TestUpdateNodeCapabilities(t *testing.T) {
P2pToCapabilities: initialp2pToCapabilities,
NopToNodes: nopToNodes,
},
- req: &kslib.UpdateNodeCapabilitiesImplRequest{
+ req: &internal.UpdateNodeCapabilitiesImplRequest{
P2pToCapabilities: map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability{
testPeerID(t, "0x1"): []kcr.CapabilitiesRegistryCapability{
{
@@ -95,7 +95,7 @@ func TestUpdateNodeCapabilities(t *testing.T) {
tt.args.req.Chain = setupResp.Chain
tt.args.req.ContractSet = setupResp.ContractSet
- got, err := kslib.UpdateNodeCapabilitiesImpl(tt.args.lggr, tt.args.req)
+ got, err := internal.UpdateNodeCapabilitiesImpl(tt.args.lggr, tt.args.req)
if (err != nil) != tt.wantErr {
t.Errorf("UpdateNodeCapabilities() error = %v, wantErr %v", err, tt.wantErr)
return
diff --git a/deployment/keystone/changeset/internal/update_nodes.go b/deployment/keystone/changeset/internal/update_nodes.go
index 3480f39b084..b27c17ad19f 100644
--- a/deployment/keystone/changeset/internal/update_nodes.go
+++ b/deployment/keystone/changeset/internal/update_nodes.go
@@ -13,11 +13,10 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
)
type NodeUpdate struct {
@@ -30,7 +29,7 @@ type NodeUpdate struct {
type UpdateNodesRequest struct {
Chain deployment.Chain
- ContractSet *kslib.ContractSet // contract set for the given chain
+ ContractSet *ContractSet // contract set for the given chain
P2pToUpdates map[p2pkey.PeerID]NodeUpdate
@@ -60,7 +59,7 @@ func (req *UpdateNodesRequest) Validate() error {
for peer, updates := range req.P2pToUpdates {
seen := make(map[string]struct{})
for _, cap := range updates.Capabilities {
- id := kslib.CapabilityID(cap)
+ id := CapabilityID(cap)
if _, exists := seen[id]; exists {
return fmt.Errorf("duplicate capability %s for %s", id, peer)
}
@@ -103,7 +102,7 @@ func UpdateNodes(lggr logger.Logger, req *UpdateNodesRequest) (*UpdateNodesRespo
params, err := req.NodeParams()
if err != nil {
- err = kslib.DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(kcr.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to make node params: %w", err)
}
txOpts := req.Chain.DeployerKey
@@ -113,7 +112,7 @@ func UpdateNodes(lggr logger.Logger, req *UpdateNodesRequest) (*UpdateNodesRespo
registry := req.ContractSet.CapabilitiesRegistry
tx, err := registry.UpdateNodes(txOpts, params)
if err != nil {
- err = kslib.DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(kcr.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to call UpdateNodes: %w", err)
}
@@ -183,8 +182,8 @@ func AppendCapabilities(lggr logger.Logger, registry *kcr.CapabilitiesRegistry,
var deduped []kcr.CapabilitiesRegistryCapability
seen := make(map[string]struct{})
for _, cap := range mergedCaps {
- if _, ok := seen[kslib.CapabilityID(cap)]; !ok {
- seen[kslib.CapabilityID(cap)] = struct{}{}
+ if _, ok := seen[CapabilityID(cap)]; !ok {
+ seen[CapabilityID(cap)] = struct{}{}
deduped = append(deduped, cap)
}
}
@@ -204,7 +203,7 @@ func makeNodeParams(registry *kcr.CapabilitiesRegistry,
nodes, err := registry.GetNodesByP2PIds(&bind.CallOpts{}, PeerIDsToBytes(p2pIds))
if err != nil {
- err = kslib.DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err = deployment.DecodeErr(kcr.CapabilitiesRegistryABI, err)
return nil, fmt.Errorf("failed to get nodes by p2p ids: %w", err)
}
for _, node := range nodes {
@@ -261,11 +260,11 @@ func makeNodeParams(registry *kcr.CapabilitiesRegistry,
}
-// fetchkslib.CapabilityIDs fetches the capability ids for the given capabilities
+// fetchCapabilityIDs fetches the capability ids for the given capabilities
func fetchCapabilityIDs(registry *kcr.CapabilitiesRegistry, caps []kcr.CapabilitiesRegistryCapability) (map[string][32]byte, error) {
out := make(map[string][32]byte)
for _, cap := range caps {
- name := kslib.CapabilityID(cap)
+ name := CapabilityID(cap)
if _, exists := out[name]; exists {
continue
}
diff --git a/deployment/keystone/changeset/internal/update_nodes_test.go b/deployment/keystone/changeset/internal/update_nodes_test.go
index e730668f806..0f22120998a 100644
--- a/deployment/keystone/changeset/internal/update_nodes_test.go
+++ b/deployment/keystone/changeset/internal/update_nodes_test.go
@@ -16,12 +16,11 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
kstest "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal/test"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -30,7 +29,7 @@ func Test_UpdateNodesRequest_validate(t *testing.T) {
p2pToUpdates map[p2pkey.PeerID]internal.NodeUpdate
nopToNodes map[kcr.CapabilitiesRegistryNodeOperator][]*internal.P2PSignerEnc
chain deployment.Chain
- contractSet *kslib.ContractSet
+ contractSet *internal.ContractSet
}
tests := []struct {
name string
@@ -465,14 +464,14 @@ func TestUpdateNodes(t *testing.T) {
require.NoError(t, err)
// register the capabilities that the Update will use
- expectedUpdatedCaps := make(map[p2pkey.PeerID][]kslib.RegisteredCapability)
+ expectedUpdatedCaps := make(map[p2pkey.PeerID][]internal.RegisteredCapability)
capCache := kstest.NewCapabiltyCache(t)
for p2p, update := range tt.args.req.P2pToUpdates {
if len(update.Capabilities) > 0 {
expectedCaps := capCache.AddCapabilities(tt.args.lggr, tt.args.req.Chain, registry, update.Capabilities)
expectedUpdatedCaps[p2p] = expectedCaps
} else {
- expectedUpdatedCaps[p2p] = []kslib.RegisteredCapability{
+ expectedUpdatedCaps[p2p] = []internal.RegisteredCapability{
{CapabilitiesRegistryCapability: phonyCap, ID: id},
}
}
@@ -564,7 +563,7 @@ func TestUpdateNodes(t *testing.T) {
toRegister := p2pToCapabilitiesUpdated[testPeerID(t, "peerID_1")]
tx, err := registry.AddCapabilities(chain.DeployerKey, toRegister)
if err != nil {
- err2 := kslib.DecodeErr(kcr.CapabilitiesRegistryABI, err)
+ err2 := deployment.DecodeErr(kcr.CapabilitiesRegistryABI, err)
require.Fail(t, fmt.Sprintf("failed to call AddCapabilities: %s: %s", err, err2))
}
_, err = chain.Confirm(tx)
@@ -654,7 +653,7 @@ func TestAppendCapabilities(t *testing.T) {
wantCaps = append(wantCaps, newCaps...)
for i, got := range gotCaps {
- assert.Equal(t, kslib.CapabilityID(wantCaps[i]), kslib.CapabilityID(got))
+ assert.Equal(t, internal.CapabilityID(wantCaps[i]), internal.CapabilityID(got))
}
// trying to append an existing capability should not change the result
diff --git a/deployment/keystone/changeset/helpers_test.go b/deployment/keystone/changeset/test/helpers.go
similarity index 81%
rename from deployment/keystone/changeset/helpers_test.go
rename to deployment/keystone/changeset/test/helpers.go
index 4e7553d0b8e..5ddaeda524e 100644
--- a/deployment/keystone/changeset/helpers_test.go
+++ b/deployment/keystone/changeset/test/helpers.go
@@ -1,4 +1,4 @@
-package changeset_test
+package test
import (
"bytes"
@@ -6,53 +6,29 @@ import (
"crypto/sha256"
"encoding/hex"
"errors"
- "fmt"
"math"
- "math/big"
"sort"
"testing"
- "github.com/smartcontractkit/chainlink-common/pkg/logger"
- "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
- "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zapcore"
"golang.org/x/exp/maps"
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
"github.com/smartcontractkit/chainlink/deployment"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
"github.com/smartcontractkit/chainlink/deployment/environment/memory"
- "github.com/smartcontractkit/chainlink/deployment/keystone"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
kschangeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/workflowregistry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
-func TestSetupTestEnv(t *testing.T) {
- t.Parallel()
- ctx := tests.Context(t)
- for _, useMCMS := range []bool{true, false} {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
- NumChains: 3,
- UseMCMS: useMCMS,
- })
- t.Run(fmt.Sprintf("set up test env using MCMS: %T", useMCMS), func(t *testing.T) {
- require.NotNil(t, te.Env.ExistingAddresses)
- require.Len(t, te.Env.Chains, 3)
- require.NotEmpty(t, te.RegistrySelector)
- require.NotNil(t, te.Env.Offchain)
- r, err := te.Env.Offchain.ListNodes(ctx, &node.ListNodesRequest{})
- require.NoError(t, err)
- require.Len(t, r.Nodes, 12)
- })
- }
-}
-
type DonConfig struct {
N int
}
@@ -104,8 +80,8 @@ type TestEnv struct {
AssetNodes map[string]memory.Node
}
-func (te TestEnv) ContractSets() map[uint64]kslib.ContractSet {
- r, err := kslib.GetContractSets(te.Env.Logger, &kslib.GetContractSetsRequest{
+func (te TestEnv) ContractSets() map[uint64]internal.ContractSet {
+ r, err := internal.GetContractSets(te.Env.Logger, &internal.GetContractSetsRequest{
Chains: te.Env.Chains,
AddressBook: te.Env.ExistingAddresses,
})
@@ -141,6 +117,10 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv {
},
{
Changeset: commonchangeset.WrapChangeSet(kschangeset.DeployForwarder),
+ Config: kschangeset.DeployForwarderRequest{},
+ },
+ {
+ Changeset: commonchangeset.WrapChangeSet(workflowregistry.Deploy),
Config: registryChainSel,
},
})
@@ -172,35 +152,35 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv {
// TODO: partition nodes into multiple nops
- wfDon := keystone.DonCapabilities{
- Name: keystone.WFDonName,
- Nops: []keystone.NOP{
+ wfDon := internal.DonCapabilities{
+ Name: internal.WFDonName,
+ Nops: []internal.NOP{
{
Name: "nop 1",
Nodes: maps.Keys(wfNodes),
},
},
- Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.OCR3Cap},
+ Capabilities: []kcr.CapabilitiesRegistryCapability{internal.OCR3Cap},
}
- cwDon := keystone.DonCapabilities{
- Name: keystone.TargetDonName,
- Nops: []keystone.NOP{
+ cwDon := internal.DonCapabilities{
+ Name: internal.TargetDonName,
+ Nops: []internal.NOP{
{
Name: "nop 2",
Nodes: maps.Keys(cwNodes),
},
},
- Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.WriteChainCap},
+ Capabilities: []kcr.CapabilitiesRegistryCapability{internal.WriteChainCap},
}
- assetDon := keystone.DonCapabilities{
- Name: keystone.StreamDonName,
- Nops: []keystone.NOP{
+ assetDon := internal.DonCapabilities{
+ Name: internal.StreamDonName,
+ Nops: []internal.NOP{
{
Name: "nop 3",
Nodes: maps.Keys(assetNodes),
},
},
- Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.StreamTriggerCap},
+ Capabilities: []kcr.CapabilitiesRegistryCapability{internal.StreamTriggerCap},
}
allChains := make(map[uint64]deployment.Chain)
@@ -215,10 +195,10 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv {
err = env.ExistingAddresses.Merge(e.ExistingAddresses)
require.NoError(t, err)
- var ocr3Config = keystone.OracleConfig{
+ var ocr3Config = internal.OracleConfig{
MaxFaultyOracles: len(wfNodes) / 3,
}
- var allDons = []keystone.DonCapabilities{wfDon, cwDon, assetDon}
+ var allDons = []internal.DonCapabilities{wfDon, cwDon, assetDon}
csOut, err := kschangeset.ConfigureInitialContractsChangeset(env, kschangeset.InitialContractsCfg{
RegistryChainSel: registryChainSel,
@@ -228,12 +208,12 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv {
require.NoError(t, err)
require.Nil(t, csOut.AddressBook, "no new addresses should be created in configure initial contracts")
- req := &keystone.GetContractSetsRequest{
+ req := &internal.GetContractSetsRequest{
Chains: env.Chains,
AddressBook: env.ExistingAddresses,
}
- contractSetsResp, err := keystone.GetContractSets(lggr, req)
+ contractSetsResp, err := internal.GetContractSets(lggr, req)
require.NoError(t, err)
require.Len(t, contractSetsResp.ContractSets, len(env.Chains))
// check the registry
@@ -258,12 +238,7 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv {
timelockCfgs := make(map[uint64]commontypes.MCMSWithTimelockConfig)
for sel := range env.Chains {
t.Logf("Enabling MCMS on chain %d", sel)
- timelockCfgs[sel] = commontypes.MCMSWithTimelockConfig{
- Canceller: commonchangeset.SingleGroupMCMS(t),
- Bypasser: commonchangeset.SingleGroupMCMS(t),
- Proposer: commonchangeset.SingleGroupMCMS(t),
- TimelockMinDelay: big.NewInt(0),
- }
+ timelockCfgs[sel] = proposalutils.SingleGroupTimelockConfig(t)
}
env, err = commonchangeset.ApplyChangesets(t, env, nil, []commonchangeset.ChangesetApplication{
{
@@ -273,7 +248,7 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv {
})
require.NoError(t, err)
// extract the MCMS address
- r, err := kslib.GetContractSets(lggr, &kslib.GetContractSetsRequest{
+ r, err := internal.GetContractSets(lggr, &internal.GetContractSetsRequest{
Chains: env.Chains,
AddressBook: env.ExistingAddresses,
})
@@ -284,7 +259,7 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv {
require.NoError(t, mcms.Validate())
// transfer ownership of all contracts to the MCMS
- env, err = commonchangeset.ApplyChangesets(t, env, map[uint64]*commonchangeset.TimelockExecutionContracts{sel: {Timelock: mcms.Timelock, CallProxy: mcms.CallProxy}}, []commonchangeset.ChangesetApplication{
+ env, err = commonchangeset.ApplyChangesets(t, env, map[uint64]*proposalutils.TimelockExecutionContracts{sel: {Timelock: mcms.Timelock, CallProxy: mcms.CallProxy}}, []commonchangeset.ChangesetApplication{
{
Changeset: commonchangeset.WrapChangeSet(kschangeset.AcceptAllOwnershipsProposal),
Config: &kschangeset.AcceptAllOwnershipRequest{
@@ -323,7 +298,7 @@ func validateInitialChainState(t *testing.T, env deployment.Environment, registr
// all contracts on registry chain
registryChainAddrs, err := ad.AddressesForChain(registryChainSel)
require.NoError(t, err)
- require.Len(t, registryChainAddrs, 3) // registry, ocr3, forwarder
+ require.Len(t, registryChainAddrs, 4) // registry, ocr3, forwarder, workflowRegistry
// only forwarder on non-home chain
for sel := range env.Chains {
chainAddrs, err := ad.AddressesForChain(sel)
@@ -331,11 +306,11 @@ func validateInitialChainState(t *testing.T, env deployment.Environment, registr
if sel != registryChainSel {
require.Len(t, chainAddrs, 1)
} else {
- require.Len(t, chainAddrs, 3)
+ require.Len(t, chainAddrs, 4)
}
containsForwarder := false
for _, tv := range chainAddrs {
- if tv.Type == keystone.KeystoneForwarder {
+ if tv.Type == internal.KeystoneForwarder {
containsForwarder = true
break
}
@@ -355,7 +330,7 @@ func validateNodes(t *testing.T, gotRegistry *kcr.CapabilitiesRegistry, nodes ma
}
// validateDon checks that the don exists and has the expected capabilities
-func validateDon(t *testing.T, gotRegistry *kcr.CapabilitiesRegistry, nodes map[string]memory.Node, don kslib.DonCapabilities) {
+func validateDon(t *testing.T, gotRegistry *kcr.CapabilitiesRegistry, nodes map[string]memory.Node, don internal.DonCapabilities) {
gotDons, err := gotRegistry.GetDONs(nil)
require.NoError(t, err)
wantP2PID := sortedHash(p2pIDs(t, maps.Keys(nodes)))
@@ -394,7 +369,7 @@ func p2pIDs(t *testing.T, vals []string) [][32]byte {
return out
}
-func expectedHashedCapabilities(t *testing.T, registry *kcr.CapabilitiesRegistry, don kslib.DonCapabilities) [][32]byte {
+func expectedHashedCapabilities(t *testing.T, registry *kcr.CapabilitiesRegistry, don internal.DonCapabilities) [][32]byte {
out := make([][32]byte, len(don.Capabilities))
var err error
for i, cap := range don.Capabilities {
diff --git a/deployment/keystone/changeset/test/helpers_test.go b/deployment/keystone/changeset/test/helpers_test.go
new file mode 100644
index 00000000000..2d06e087db0
--- /dev/null
+++ b/deployment/keystone/changeset/test/helpers_test.go
@@ -0,0 +1,34 @@
+package test
+
+import (
+ "fmt"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+ "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node"
+)
+
+func TestSetupTestEnv(t *testing.T) {
+ t.Parallel()
+ ctx := tests.Context(t)
+ for _, useMCMS := range []bool{true, false} {
+ te := SetupTestEnv(t, TestConfig{
+ WFDonConfig: DonConfig{N: 4},
+ AssetDonConfig: DonConfig{N: 4},
+ WriterDonConfig: DonConfig{N: 4},
+ NumChains: 3,
+ UseMCMS: useMCMS,
+ })
+ t.Run(fmt.Sprintf("set up test env using MCMS: %t", useMCMS), func(t *testing.T) {
+ require.NotNil(t, te.Env.ExistingAddresses)
+ require.Len(t, te.Env.Chains, 3)
+ require.NotEmpty(t, te.RegistrySelector)
+ require.NotNil(t, te.Env.Offchain)
+ r, err := te.Env.Offchain.ListNodes(ctx, &node.ListNodesRequest{})
+ require.NoError(t, err)
+ require.Len(t, r.Nodes, 12)
+ })
+ }
+}
diff --git a/deployment/keystone/changeset/update_don.go b/deployment/keystone/changeset/update_don.go
index 3f43ea513be..5b381a4e498 100644
--- a/deployment/keystone/changeset/update_don.go
+++ b/deployment/keystone/changeset/update_don.go
@@ -4,10 +4,9 @@ import (
"fmt"
"github.com/smartcontractkit/chainlink/deployment"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -100,7 +99,7 @@ func appendRequest(r *UpdateDonRequest) *AppendNodeCapabilitiesRequest {
}
func updateDonRequest(env deployment.Environment, r *UpdateDonRequest) (*internal.UpdateDonRequest, error) {
- resp, err := kslib.GetContractSets(env.Logger, &kslib.GetContractSetsRequest{
+ resp, err := internal.GetContractSets(env.Logger, &internal.GetContractSetsRequest{
Chains: env.Chains,
AddressBook: env.ExistingAddresses,
})
diff --git a/deployment/keystone/changeset/update_don_test.go b/deployment/keystone/changeset/update_don_test.go
index 18287da6887..2487087e235 100644
--- a/deployment/keystone/changeset/update_don_test.go
+++ b/deployment/keystone/changeset/update_don_test.go
@@ -7,9 +7,11 @@ import (
"github.com/stretchr/testify/require"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -28,10 +30,10 @@ func TestUpdateDon(t *testing.T) {
caps = []kcr.CapabilitiesRegistryCapability{capA, capB}
)
t.Run("no mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
})
@@ -69,10 +71,10 @@ func TestUpdateDon(t *testing.T) {
})
})
t.Run("with mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
UseMCMS: true,
})
@@ -103,22 +105,14 @@ func TestUpdateDon(t *testing.T) {
csOut, err := changeset.UpdateDon(te.Env, &cfg)
require.NoError(t, err)
- if true {
- require.Len(t, csOut.Proposals, 1)
- require.Len(t, csOut.Proposals[0].Transactions, 1) // append node capabilties cs, update don
- require.Len(t, csOut.Proposals[0].Transactions[0].Batch, 3) // add capabilities, update nodes, update don
- require.Nil(t, csOut.AddressBook)
- } else {
- require.Len(t, csOut.Proposals, 1)
- require.Len(t, csOut.Proposals[0].Transactions, 2) // append node capabilties cs, update don
- require.Len(t, csOut.Proposals[0].Transactions[0].Batch, 2) // add capabilities, update nodes
- require.Len(t, csOut.Proposals[0].Transactions[1].Batch, 1) // update don
- require.Nil(t, csOut.AddressBook)
- }
+ require.Len(t, csOut.Proposals, 1)
+ require.Len(t, csOut.Proposals[0].Transactions, 1) // append node capabilties cs, update don
+ require.Len(t, csOut.Proposals[0].Transactions[0].Batch, 3) // add capabilities, update nodes, update don
+ require.Nil(t, csOut.AddressBook)
// now apply the changeset such that the proposal is signed and execed
contracts := te.ContractSets()[te.RegistrySelector]
- timelockContracts := map[uint64]*commonchangeset.TimelockExecutionContracts{
+ timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{
te.RegistrySelector: {
Timelock: contracts.Timelock,
CallProxy: contracts.CallProxy,
diff --git a/deployment/keystone/changeset/update_node_capabilities.go b/deployment/keystone/changeset/update_node_capabilities.go
index 9c9d5585fc2..8c4d01159ed 100644
--- a/deployment/keystone/changeset/update_node_capabilities.go
+++ b/deployment/keystone/changeset/update_node_capabilities.go
@@ -11,10 +11,9 @@ import (
"github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -84,7 +83,7 @@ func (req *MutateNodeCapabilitiesRequest) updateNodeCapabilitiesImplRequest(e de
if !ok {
return nil, fmt.Errorf("registry chain selector %d does not exist in environment", req.RegistryChainSel)
}
- resp, err := kslib.GetContractSets(e.Logger, &kslib.GetContractSetsRequest{
+ resp, err := internal.GetContractSets(e.Logger, &internal.GetContractSetsRequest{
Chains: map[uint64]deployment.Chain{req.RegistryChainSel: registryChain},
AddressBook: e.ExistingAddresses,
})
diff --git a/deployment/keystone/changeset/update_node_capabilities_test.go b/deployment/keystone/changeset/update_node_capabilities_test.go
index cb5588ff3d1..cf6b9601039 100644
--- a/deployment/keystone/changeset/update_node_capabilities_test.go
+++ b/deployment/keystone/changeset/update_node_capabilities_test.go
@@ -8,8 +8,10 @@ import (
"golang.org/x/exp/maps"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test"
+ kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -28,10 +30,10 @@ func TestUpdateNodeCapabilities(t *testing.T) {
caps = []kcr.CapabilitiesRegistryCapability{capA, capB}
)
t.Run("no mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
})
@@ -78,10 +80,10 @@ func TestUpdateNodeCapabilities(t *testing.T) {
})
})
t.Run("with mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
UseMCMS: true,
})
@@ -118,7 +120,7 @@ func TestUpdateNodeCapabilities(t *testing.T) {
// now apply the changeset such that the proposal is signed and execed
contracts := te.ContractSets()[te.RegistrySelector]
- timelockContracts := map[uint64]*commonchangeset.TimelockExecutionContracts{
+ timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{
te.RegistrySelector: {
Timelock: contracts.Timelock,
CallProxy: contracts.CallProxy,
@@ -139,7 +141,7 @@ func TestUpdateNodeCapabilities(t *testing.T) {
}
// validateUpdate checks reads nodes from the registry and checks they have the expected updates
-func validateCapabilityUpdates(t *testing.T, te TestEnv, expected map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) {
+func validateCapabilityUpdates(t *testing.T, te test.TestEnv, expected map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) {
registry := te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry
wfP2PIDs := p2pIDs(t, maps.Keys(te.WFNodes))
nodes, err := registry.GetNodesByP2PIds(nil, wfP2PIDs)
diff --git a/deployment/keystone/changeset/update_nodes.go b/deployment/keystone/changeset/update_nodes.go
index bb12f32cb94..10a7ad4e441 100644
--- a/deployment/keystone/changeset/update_nodes.go
+++ b/deployment/keystone/changeset/update_nodes.go
@@ -10,7 +10,6 @@ import (
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
- kslib "github.com/smartcontractkit/chainlink/deployment/keystone"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -50,7 +49,7 @@ func UpdateNodes(env deployment.Environment, req *UpdateNodesRequest) (deploymen
if !ok {
return deployment.ChangesetOutput{}, fmt.Errorf("registry chain selector %d does not exist in environment", req.RegistryChainSel)
}
- cresp, err := kslib.GetContractSets(env.Logger, &kslib.GetContractSetsRequest{
+ cresp, err := internal.GetContractSets(env.Logger, &internal.GetContractSetsRequest{
Chains: env.Chains,
AddressBook: env.ExistingAddresses,
})
diff --git a/deployment/keystone/changeset/update_nodes_test.go b/deployment/keystone/changeset/update_nodes_test.go
index be3bfb12ee6..33662aa669d 100644
--- a/deployment/keystone/changeset/update_nodes_test.go
+++ b/deployment/keystone/changeset/update_nodes_test.go
@@ -9,7 +9,9 @@ import (
"golang.org/x/exp/maps"
commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
)
@@ -17,10 +19,10 @@ func TestUpdateNodes(t *testing.T) {
t.Parallel()
t.Run("no mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
})
@@ -53,10 +55,10 @@ func TestUpdateNodes(t *testing.T) {
})
t.Run("with mcms", func(t *testing.T) {
- te := SetupTestEnv(t, TestConfig{
- WFDonConfig: DonConfig{N: 4},
- AssetDonConfig: DonConfig{N: 4},
- WriterDonConfig: DonConfig{N: 4},
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
NumChains: 1,
UseMCMS: true,
})
@@ -89,7 +91,7 @@ func TestUpdateNodes(t *testing.T) {
// now apply the changeset such that the proposal is signed and execed
contracts := te.ContractSets()[te.RegistrySelector]
- timelockContracts := map[uint64]*commonchangeset.TimelockExecutionContracts{
+ timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{
te.RegistrySelector: {
Timelock: contracts.Timelock,
CallProxy: contracts.CallProxy,
@@ -113,7 +115,7 @@ func TestUpdateNodes(t *testing.T) {
}
// validateUpdate checks reads nodes from the registry and checks they have the expected updates
-func validateUpdate(t *testing.T, te TestEnv, expected map[p2pkey.PeerID]changeset.NodeUpdate) {
+func validateUpdate(t *testing.T, te test.TestEnv, expected map[p2pkey.PeerID]changeset.NodeUpdate) {
registry := te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry
wfP2PIDs := p2pIDs(t, maps.Keys(te.WFNodes))
nodes, err := registry.GetNodesByP2PIds(nil, wfP2PIDs)
@@ -125,3 +127,13 @@ func validateUpdate(t *testing.T, te TestEnv, expected map[p2pkey.PeerID]changes
assert.Equal(t, expected[node.P2pId].Signer, node.Signer)
}
}
+
+func p2pIDs(t *testing.T, vals []string) [][32]byte {
+ var out [][32]byte
+ for _, v := range vals {
+ id, err := p2pkey.MakePeerID(v)
+ require.NoError(t, err)
+ out = append(out, id)
+ }
+ return out
+}
diff --git a/deployment/keystone/changeset/view.go b/deployment/keystone/changeset/view.go
index 417484ed6aa..9c8678d8778 100644
--- a/deployment/keystone/changeset/view.go
+++ b/deployment/keystone/changeset/view.go
@@ -8,14 +8,14 @@ import (
"github.com/smartcontractkit/chainlink/deployment"
commonview "github.com/smartcontractkit/chainlink/deployment/common/view"
- "github.com/smartcontractkit/chainlink/deployment/keystone"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal"
"github.com/smartcontractkit/chainlink/deployment/keystone/view"
)
var _ deployment.ViewState = ViewKeystone
func ViewKeystone(e deployment.Environment) (json.Marshaler, error) {
- state, err := keystone.GetContractSets(e.Logger, &keystone.GetContractSetsRequest{
+ state, err := internal.GetContractSets(e.Logger, &internal.GetContractSetsRequest{
Chains: e.Chains,
AddressBook: e.ExistingAddresses,
})
diff --git a/deployment/keystone/changeset/view_test.go b/deployment/keystone/changeset/view_test.go
index 023b4462549..5b32699fd89 100644
--- a/deployment/keystone/changeset/view_test.go
+++ b/deployment/keystone/changeset/view_test.go
@@ -26,7 +26,7 @@ func TestKeystoneView(t *testing.T) {
require.NoError(t, err)
require.NotNil(t, resp)
require.NoError(t, env.ExistingAddresses.Merge(resp.AddressBook))
- resp, err = DeployForwarder(env, registryChain)
+ resp, err = DeployForwarder(env, DeployForwarderRequest{})
require.NoError(t, err)
require.NotNil(t, resp)
require.NoError(t, env.ExistingAddresses.Merge(resp.AddressBook))
diff --git a/deployment/keystone/changeset/workflowregistry/deploy.go b/deployment/keystone/changeset/workflowregistry/deploy.go
new file mode 100644
index 00000000000..e55484aa711
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/deploy.go
@@ -0,0 +1,25 @@
+package workflowregistry
+
+import (
+ "fmt"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+)
+
+var _ deployment.ChangeSet[uint64] = Deploy
+
+func Deploy(env deployment.Environment, registrySelector uint64) (deployment.ChangesetOutput, error) {
+ lggr := env.Logger
+ chain, ok := env.Chains[registrySelector]
+ if !ok {
+ return deployment.ChangesetOutput{}, fmt.Errorf("chain not found in environment")
+ }
+ ab := deployment.NewMemoryAddressBook()
+ wrResp, err := deployWorkflowRegistry(chain, ab)
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy CapabilitiesRegistry: %w", err)
+ }
+ lggr.Infof("Deployed %s chain selector %d addr %s", wrResp.Tv.String(), chain.Selector, wrResp.Address.String())
+
+ return deployment.ChangesetOutput{AddressBook: ab}, nil
+}
diff --git a/deployment/keystone/changeset/workflowregistry/deploy_test.go b/deployment/keystone/changeset/workflowregistry/deploy_test.go
new file mode 100644
index 00000000000..16eb6fa8512
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/deploy_test.go
@@ -0,0 +1,38 @@
+package workflowregistry
+
+import (
+ "testing"
+
+ "go.uber.org/zap/zapcore"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+ "github.com/smartcontractkit/chainlink/deployment/environment/memory"
+)
+
+func Test_Deploy(t *testing.T) {
+ t.Parallel()
+ lggr := logger.Test(t)
+ cfg := memory.MemoryEnvironmentConfig{
+ Nodes: 1, // nodes unused but required in config
+ Chains: 2,
+ }
+ env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg)
+
+ registrySel := env.AllChainSelectors()[0]
+
+ resp, err := Deploy(env, registrySel)
+ require.NoError(t, err)
+ require.NotNil(t, resp)
+ // OCR3 should be deployed on chain 0
+ addrs, err := resp.AddressBook.AddressesForChain(registrySel)
+ require.NoError(t, err)
+ require.Len(t, addrs, 1)
+
+ // nothing on chain 1
+ require.NotEqual(t, registrySel, env.AllChainSelectors()[1])
+ oaddrs, _ := resp.AddressBook.AddressesForChain(env.AllChainSelectors()[1])
+ assert.Len(t, oaddrs, 0)
+}
diff --git a/deployment/keystone/changeset/workflowregistry/setup_test.go b/deployment/keystone/changeset/workflowregistry/setup_test.go
new file mode 100644
index 00000000000..78e7d852080
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/setup_test.go
@@ -0,0 +1,54 @@
+package workflowregistry
+
+import (
+ "testing"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/environment/memory"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ workflow_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper"
+ "github.com/stretchr/testify/require"
+)
+
+type SetupTestWorkflowRegistryResponse struct {
+ Registry *workflow_registry.WorkflowRegistry
+ Chain deployment.Chain
+ RegistrySelector uint64
+ AddressBook deployment.AddressBook
+}
+
+func SetupTestWorkflowRegistry(t *testing.T, lggr logger.Logger, chainSel uint64) *SetupTestWorkflowRegistryResponse {
+ chain := testChain(t)
+
+ deployer, err := newWorkflowRegistryDeployer()
+ require.NoError(t, err)
+ resp, err := deployer.Deploy(changeset.DeployRequest{Chain: chain})
+ require.NoError(t, err)
+
+ addressBook := deployment.NewMemoryAddressBookFromMap(
+ map[uint64]map[string]deployment.TypeAndVersion{
+ chainSel: map[string]deployment.TypeAndVersion{
+ resp.Address.Hex(): resp.Tv,
+ },
+ },
+ )
+
+ return &SetupTestWorkflowRegistryResponse{
+ Registry: deployer.Contract(),
+ Chain: chain,
+ RegistrySelector: chain.Selector,
+ AddressBook: addressBook,
+ }
+}
+
+func testChain(t *testing.T) deployment.Chain {
+ chains, _ := memory.NewMemoryChains(t, 1, 5)
+ var chain deployment.Chain
+ for _, c := range chains {
+ chain = c
+ break
+ }
+ require.NotEmpty(t, chain)
+ return chain
+}
diff --git a/deployment/keystone/changeset/workflowregistry/strategies.go b/deployment/keystone/changeset/workflowregistry/strategies.go
new file mode 100644
index 00000000000..617d6e6e8dc
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/strategies.go
@@ -0,0 +1,85 @@
+package workflowregistry
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms"
+ "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+)
+
+type strategy interface {
+ Apply(callFn func(opts *bind.TransactOpts) (*types.Transaction, error)) (deployment.ChangesetOutput, error)
+}
+
+type simpleTransaction struct {
+ chain deployment.Chain
+}
+
+func (s *simpleTransaction) Apply(callFn func(opts *bind.TransactOpts) (*types.Transaction, error)) (deployment.ChangesetOutput, error) {
+ tx, err := callFn(s.chain.DeployerKey)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ _, err = s.chain.Confirm(tx)
+ return deployment.ChangesetOutput{}, err
+}
+
+type mcmsTransaction struct {
+ Config *changeset.MCMSConfig
+ Description string
+ Address common.Address
+ ChainSel uint64
+ ContractSet *changeset.ContractSet
+}
+
+func (m *mcmsTransaction) Apply(callFn func(opts *bind.TransactOpts) (*types.Transaction, error)) (deployment.ChangesetOutput, error) {
+ opts := deployment.SimTransactOpts()
+
+ tx, err := callFn(opts)
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ op := timelock.BatchChainOperation{
+ ChainIdentifier: mcms.ChainIdentifier(m.ChainSel),
+ Batch: []mcms.Operation{
+ {
+ Data: tx.Data(),
+ To: m.Address,
+ Value: big.NewInt(0),
+ },
+ },
+ }
+
+ timelocksPerChain := map[uint64]common.Address{
+ m.ChainSel: m.ContractSet.Timelock.Address(),
+ }
+ proposerMCMSes := map[uint64]*gethwrappers.ManyChainMultiSig{
+ m.ChainSel: m.ContractSet.ProposerMcm,
+ }
+
+ proposal, err := proposalutils.BuildProposalFromBatches(
+ timelocksPerChain,
+ proposerMCMSes,
+ []timelock.BatchChainOperation{op},
+ m.Description,
+ m.Config.MinDuration,
+ )
+ if err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ return deployment.ChangesetOutput{
+ Proposals: []timelock.MCMSWithTimelockProposal{*proposal},
+ }, nil
+}
diff --git a/deployment/keystone/changeset/workflowregistry/update_allowed_dons.go b/deployment/keystone/changeset/workflowregistry/update_allowed_dons.go
new file mode 100644
index 00000000000..5001370b552
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/update_allowed_dons.go
@@ -0,0 +1,80 @@
+package workflowregistry
+
+import (
+ "errors"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/core/types"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ workflow_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper"
+)
+
+var _ deployment.ChangeSet[*UpdateAllowedDonsRequest] = UpdateAllowedDons
+
+type UpdateAllowedDonsRequest struct {
+ RegistryChainSel uint64
+ DonIDs []uint32
+ Allowed bool
+
+ MCMSConfig *changeset.MCMSConfig
+}
+
+func (r *UpdateAllowedDonsRequest) Validate() error {
+ if len(r.DonIDs) == 0 {
+ return errors.New("Must provide at least one DonID")
+ }
+ return nil
+}
+
+// UpdateAllowedDons updates the list of DONs that workflows can be sent to.
+func UpdateAllowedDons(env deployment.Environment, req *UpdateAllowedDonsRequest) (deployment.ChangesetOutput, error) {
+ if err := req.Validate(); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ resp, err := changeset.GetContractSets(env.Logger, &changeset.GetContractSetsRequest{
+ Chains: env.Chains,
+ AddressBook: env.ExistingAddresses,
+ })
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to get contract sets: %w", err)
+ }
+
+ cs := resp.ContractSets[req.RegistryChainSel]
+ if cs.WorkflowRegistry == nil {
+ return deployment.ChangesetOutput{}, errors.New("could not find workflow registry")
+ }
+ registry := cs.WorkflowRegistry
+
+ chain, ok := env.Chains[req.RegistryChainSel]
+ if !ok {
+ return deployment.ChangesetOutput{}, fmt.Errorf("registry chain selector %d does not exist in environment", req.RegistryChainSel)
+ }
+
+ var s strategy
+ if req.MCMSConfig != nil {
+ s = &mcmsTransaction{
+ Config: req.MCMSConfig,
+ Description: "proposal to update allowed dons",
+ Address: registry.Address(),
+ ChainSel: req.RegistryChainSel,
+ ContractSet: &cs,
+ }
+ } else {
+ s = &simpleTransaction{
+ chain: chain,
+ }
+ }
+
+ return s.Apply(func(opts *bind.TransactOpts) (*types.Transaction, error) {
+ tx, err := registry.UpdateAllowedDONs(opts, req.DonIDs, req.Allowed)
+ if err != nil {
+ err = deployment.DecodeErr(workflow_registry.WorkflowRegistryABI, err)
+ }
+ return tx, err
+ })
+}
diff --git a/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go b/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go
new file mode 100644
index 00000000000..f24db609553
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go
@@ -0,0 +1,110 @@
+package workflowregistry_test
+
+import (
+ "testing"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/workflowregistry"
+)
+
+func TestUpdateAllowedDons(t *testing.T) {
+ lggr := logger.Test(t)
+
+ chainSel := chain_selectors.ETHEREUM_TESTNET_SEPOLIA.Selector
+ resp := workflowregistry.SetupTestWorkflowRegistry(t, lggr, chainSel)
+ registry := resp.Registry
+
+ dons, err := registry.GetAllAllowedDONs(&bind.CallOpts{})
+ require.NoError(t, err)
+
+ assert.Len(t, dons, 0)
+
+ env := deployment.Environment{
+ Logger: lggr,
+ Chains: map[uint64]deployment.Chain{
+ chainSel: resp.Chain,
+ },
+ ExistingAddresses: resp.AddressBook,
+ }
+
+ _, err = workflowregistry.UpdateAllowedDons(
+ env,
+ &workflowregistry.UpdateAllowedDonsRequest{
+ RegistryChainSel: chainSel,
+ DonIDs: []uint32{1},
+ Allowed: true,
+ },
+ )
+ require.NoError(t, err)
+
+ dons, err = registry.GetAllAllowedDONs(&bind.CallOpts{})
+ require.NoError(t, err)
+
+ assert.Len(t, dons, 1)
+ assert.Equal(t, dons[0], uint32(1))
+
+ _, err = workflowregistry.UpdateAllowedDons(
+ env,
+ &workflowregistry.UpdateAllowedDonsRequest{
+ RegistryChainSel: chainSel,
+ DonIDs: []uint32{1},
+ Allowed: false,
+ },
+ )
+ require.NoError(t, err)
+
+ dons, err = registry.GetAllAllowedDONs(&bind.CallOpts{})
+ require.NoError(t, err)
+
+ assert.Len(t, dons, 0)
+}
+
+func Test_UpdateAllowedDons_WithMCMS(t *testing.T) {
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
+ NumChains: 1,
+ UseMCMS: true,
+ })
+
+ req := &workflowregistry.UpdateAllowedDonsRequest{
+ RegistryChainSel: te.RegistrySelector,
+ DonIDs: []uint32{1},
+ Allowed: true,
+ MCMSConfig: &changeset.MCMSConfig{MinDuration: 0},
+ }
+
+ out, err := workflowregistry.UpdateAllowedDons(te.Env, req)
+ require.NoError(t, err)
+ require.Len(t, out.Proposals, 1)
+ require.Nil(t, out.AddressBook)
+
+ contracts := te.ContractSets()[te.RegistrySelector]
+ timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{
+ te.RegistrySelector: {
+ Timelock: contracts.Timelock,
+ CallProxy: contracts.CallProxy,
+ },
+ }
+
+ _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(workflowregistry.UpdateAllowedDons),
+ Config: req,
+ },
+ })
+ require.NoError(t, err)
+}
diff --git a/deployment/keystone/changeset/workflowregistry/update_authorized_addresses.go b/deployment/keystone/changeset/workflowregistry/update_authorized_addresses.go
new file mode 100644
index 00000000000..b2d5ffcce1e
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/update_authorized_addresses.go
@@ -0,0 +1,105 @@
+package workflowregistry
+
+import (
+ "errors"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/types"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ workflow_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper"
+)
+
+var _ deployment.ChangeSet[*UpdateAuthorizedAddressesRequest] = UpdateAuthorizedAddresses
+
+type UpdateAuthorizedAddressesRequest struct {
+ RegistryChainSel uint64
+
+ Addresses []string
+ Allowed bool
+
+ MCMSConfig *changeset.MCMSConfig
+}
+
+func (r *UpdateAuthorizedAddressesRequest) Validate() error {
+ if len(r.Addresses) == 0 {
+ return errors.New("Must provide at least 1 address")
+ }
+
+ return nil
+}
+
+func getWorkflowRegistry(env deployment.Environment, chainSel uint64) (*workflow_registry.WorkflowRegistry, error) {
+ resp, err := changeset.GetContractSets(env.Logger, &changeset.GetContractSetsRequest{
+ Chains: env.Chains,
+ AddressBook: env.ExistingAddresses,
+ })
+ if err != nil {
+ return nil, fmt.Errorf("failed to get contract sets: %w", err)
+ }
+
+ cs := resp.ContractSets[chainSel]
+ if cs.WorkflowRegistry == nil {
+ return nil, errors.New("could not find workflow registry")
+ }
+
+ return cs.WorkflowRegistry, nil
+}
+
+// UpdateAuthorizedAddresses updates the list of DONs that workflows can be sent to.
+func UpdateAuthorizedAddresses(env deployment.Environment, req *UpdateAuthorizedAddressesRequest) (deployment.ChangesetOutput, error) {
+ if err := req.Validate(); err != nil {
+ return deployment.ChangesetOutput{}, err
+ }
+
+ resp, err := changeset.GetContractSets(env.Logger, &changeset.GetContractSetsRequest{
+ Chains: env.Chains,
+ AddressBook: env.ExistingAddresses,
+ })
+ if err != nil {
+ return deployment.ChangesetOutput{}, fmt.Errorf("failed to get contract sets: %w", err)
+ }
+
+ cs := resp.ContractSets[req.RegistryChainSel]
+ if cs.WorkflowRegistry == nil {
+ return deployment.ChangesetOutput{}, errors.New("could not find workflow registry")
+ }
+ registry := cs.WorkflowRegistry
+
+ chain, ok := env.Chains[req.RegistryChainSel]
+ if !ok {
+ return deployment.ChangesetOutput{}, fmt.Errorf("registry chain selector %d does not exist in environment", req.RegistryChainSel)
+ }
+
+ var addr []common.Address
+ for _, a := range req.Addresses {
+ addr = append(addr, common.HexToAddress(a))
+ }
+
+ var s strategy
+ if req.MCMSConfig != nil {
+ s = &mcmsTransaction{
+ Config: req.MCMSConfig,
+ Description: "proposal to update authorized addresses",
+ Address: registry.Address(),
+ ChainSel: chain.Selector,
+ ContractSet: &cs,
+ }
+ } else {
+ s = &simpleTransaction{
+ chain: chain,
+ }
+ }
+
+ return s.Apply(func(opts *bind.TransactOpts) (*types.Transaction, error) {
+ tx, err := registry.UpdateAuthorizedAddresses(opts, addr, req.Allowed)
+ if err != nil {
+ err = deployment.DecodeErr(workflow_registry.WorkflowRegistryABI, err)
+ }
+ return tx, err
+ })
+}
diff --git a/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go b/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go
new file mode 100644
index 00000000000..a8d969fce0c
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go
@@ -0,0 +1,113 @@
+package workflowregistry_test
+
+import (
+ "testing"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ chain_selectors "github.com/smartcontractkit/chain-selectors"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/workflowregistry"
+)
+
+func TestUpdateAuthorizedAddresses(t *testing.T) {
+ lggr := logger.Test(t)
+
+ chainSel := chain_selectors.ETHEREUM_TESTNET_SEPOLIA.Selector
+ resp := workflowregistry.SetupTestWorkflowRegistry(t, lggr, chainSel)
+ registry := resp.Registry
+
+ dons, err := registry.GetAllAuthorizedAddresses(&bind.CallOpts{})
+ require.NoError(t, err)
+
+ assert.Len(t, dons, 0)
+
+ env := deployment.Environment{
+ Logger: lggr,
+ Chains: map[uint64]deployment.Chain{
+ chainSel: resp.Chain,
+ },
+ ExistingAddresses: resp.AddressBook,
+ }
+
+ addr := "0xc0ffee254729296a45a3885639AC7E10F9d54979"
+ _, err = workflowregistry.UpdateAuthorizedAddresses(
+ env,
+ &workflowregistry.UpdateAuthorizedAddressesRequest{
+ RegistryChainSel: chainSel,
+ Addresses: []string{addr},
+ Allowed: true,
+ },
+ )
+ require.NoError(t, err)
+
+ dons, err = registry.GetAllAuthorizedAddresses(&bind.CallOpts{})
+ require.NoError(t, err)
+
+ assert.Len(t, dons, 1)
+ assert.Equal(t, dons[0], common.HexToAddress(addr))
+
+ _, err = workflowregistry.UpdateAuthorizedAddresses(
+ env,
+ &workflowregistry.UpdateAuthorizedAddressesRequest{
+ RegistryChainSel: chainSel,
+ Addresses: []string{addr},
+ Allowed: false,
+ },
+ )
+ require.NoError(t, err)
+
+ dons, err = registry.GetAllAuthorizedAddresses(&bind.CallOpts{})
+ require.NoError(t, err)
+
+ assert.Len(t, dons, 0)
+}
+
+func Test_UpdateAuthorizedAddresses_WithMCMS(t *testing.T) {
+ te := test.SetupTestEnv(t, test.TestConfig{
+ WFDonConfig: test.DonConfig{N: 4},
+ AssetDonConfig: test.DonConfig{N: 4},
+ WriterDonConfig: test.DonConfig{N: 4},
+ NumChains: 1,
+ UseMCMS: true,
+ })
+
+ addr := "0xc0ffee254729296a45a3885639AC7E10F9d54979"
+ req := &workflowregistry.UpdateAuthorizedAddressesRequest{
+ RegistryChainSel: te.RegistrySelector,
+ Addresses: []string{addr},
+ Allowed: true,
+ MCMSConfig: &changeset.MCMSConfig{MinDuration: 0},
+ }
+
+ out, err := workflowregistry.UpdateAuthorizedAddresses(te.Env, req)
+ require.NoError(t, err)
+ require.Len(t, out.Proposals, 1)
+ require.Nil(t, out.AddressBook)
+
+ contracts := te.ContractSets()[te.RegistrySelector]
+ timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{
+ te.RegistrySelector: {
+ Timelock: contracts.Timelock,
+ CallProxy: contracts.CallProxy,
+ },
+ }
+
+ _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{
+ {
+ Changeset: commonchangeset.WrapChangeSet(workflowregistry.UpdateAuthorizedAddresses),
+ Config: req,
+ },
+ })
+ require.NoError(t, err)
+}
diff --git a/deployment/keystone/changeset/workflowregistry/workflow_registry_deployer.go b/deployment/keystone/changeset/workflowregistry/workflow_registry_deployer.go
new file mode 100644
index 00000000000..ac5bbd16cc8
--- /dev/null
+++ b/deployment/keystone/changeset/workflowregistry/workflow_registry_deployer.go
@@ -0,0 +1,76 @@
+package workflowregistry
+
+import (
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/logger"
+
+ "github.com/smartcontractkit/chainlink/deployment"
+ "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+ workflow_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper"
+)
+
+type workflowRegistryDeployer struct {
+ lggr logger.Logger
+ contract *workflow_registry.WorkflowRegistry
+}
+
+func newWorkflowRegistryDeployer() (*workflowRegistryDeployer, error) {
+ lggr, err := logger.New()
+ if err != nil {
+ return nil, err
+ }
+ return &workflowRegistryDeployer{lggr: lggr}, nil
+}
+
+func (c *workflowRegistryDeployer) Contract() *workflow_registry.WorkflowRegistry {
+ return c.contract
+}
+
+func (c *workflowRegistryDeployer) Deploy(req changeset.DeployRequest) (*changeset.DeployResponse, error) {
+
+ addr, tx, wr, err := workflow_registry.DeployWorkflowRegistry(
+ req.Chain.DeployerKey,
+ req.Chain.Client)
+ if err != nil {
+ return nil, deployment.DecodeErr(workflow_registry.WorkflowRegistryABI, err)
+ }
+
+ _, err = req.Chain.Confirm(tx)
+ if err != nil {
+ return nil, fmt.Errorf("failed to confirm and save WorkflowRegistry: %w", err)
+ }
+ tvStr, err := wr.TypeAndVersion(&bind.CallOpts{})
+ if err != nil {
+ return nil, fmt.Errorf("failed to get type and version: %w", err)
+ }
+
+ tv, err := deployment.TypeAndVersionFromString(tvStr)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse type and version from %s: %w", tvStr, err)
+ }
+ resp := &changeset.DeployResponse{
+ Address: addr,
+ Tx: tx.Hash(),
+ Tv: tv,
+ }
+ c.contract = wr
+ return resp, nil
+}
+
+// deployWorkflowRegistry deploys the WorkflowRegistry contract to the chain
+// and saves the address in the address book. This mutates the address book.
+func deployWorkflowRegistry(chain deployment.Chain, ab deployment.AddressBook) (*changeset.DeployResponse, error) {
+ deployer, err := newWorkflowRegistryDeployer()
+ resp, err := deployer.Deploy(changeset.DeployRequest{Chain: chain})
+ if err != nil {
+ return nil, fmt.Errorf("failed to deploy WorkflowRegistry: %w", err)
+ }
+ err = ab.Save(chain.Selector, resp.Address.String(), resp.Tv)
+ if err != nil {
+ return nil, fmt.Errorf("failed to save WorkflowRegistry: %w", err)
+ }
+ return resp, nil
+}
diff --git a/deployment/keystone/deploy_test.go b/deployment/keystone/deploy_test.go
deleted file mode 100644
index eb167ed60fb..00000000000
--- a/deployment/keystone/deploy_test.go
+++ /dev/null
@@ -1,252 +0,0 @@
-package keystone_test
-
-import (
- "encoding/json"
- "fmt"
- "os"
- "strconv"
- "testing"
-
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- chainsel "github.com/smartcontractkit/chain-selectors"
-
- "github.com/smartcontractkit/chainlink-common/pkg/logger"
- "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
-
- "github.com/smartcontractkit/chainlink/deployment"
- "github.com/smartcontractkit/chainlink/deployment/environment/clo"
- "github.com/smartcontractkit/chainlink/deployment/environment/clo/models"
- "github.com/smartcontractkit/chainlink/deployment/environment/memory"
- "github.com/smartcontractkit/chainlink/deployment/keystone"
- kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-// TODO: Deprecated, remove everything below that leverages CLO
-
-func nodeOperatorsToIDs(t *testing.T, nops []*models.NodeOperator) (nodeIDs []keystone.NOP) {
- for _, nop := range nops {
- nodeOperator := keystone.NOP{
- Name: nop.Name,
- }
- for _, node := range nop.Nodes {
- p2pID, err := clo.NodeP2PId(node)
- require.NoError(t, err)
-
- nodeOperator.Nodes = append(nodeOperator.Nodes, p2pID)
- }
- nodeIDs = append(nodeIDs, nodeOperator)
- }
- return nodeIDs
-}
-
-func TestDeployCLO(t *testing.T) {
- lggr := logger.Test(t)
-
- wfNops := loadTestNops(t, "testdata/workflow_nodes.json")
- cwNops := loadTestNops(t, "testdata/chain_writer_nodes.json")
- assetNops := loadTestNops(t, "testdata/asset_nodes.json")
- require.Len(t, wfNops, 10)
- requireChains(t, wfNops, []models.ChainType{models.ChainTypeEvm, models.ChainTypeAptos})
- require.Len(t, cwNops, 10)
- requireChains(t, cwNops, []models.ChainType{models.ChainTypeEvm, models.ChainTypeEvm})
- require.Len(t, assetNops, 16)
- requireChains(t, assetNops, []models.ChainType{models.ChainTypeEvm})
-
- wfNodes := nodeOperatorsToIDs(t, wfNops)
- cwNodes := nodeOperatorsToIDs(t, cwNops)
- assetNodes := nodeOperatorsToIDs(t, assetNops)
-
- wfDon := keystone.DonCapabilities{
- Name: keystone.WFDonName,
- Nops: wfNodes,
- Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.OCR3Cap},
- }
- cwDon := keystone.DonCapabilities{
- Name: keystone.TargetDonName,
- Nops: cwNodes,
- Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.WriteChainCap},
- }
- assetDon := keystone.DonCapabilities{
- Name: keystone.StreamDonName,
- Nops: assetNodes,
- Capabilities: []kcr.CapabilitiesRegistryCapability{keystone.StreamTriggerCap},
- }
-
- var allNops []*models.NodeOperator
- allNops = append(allNops, wfNops...)
- allNops = append(allNops, cwNops...)
- allNops = append(allNops, assetNops...)
-
- chains := make(map[uint64]struct{})
- for _, nop := range allNops {
- for _, node := range nop.Nodes {
- for _, chain := range node.ChainConfigs {
- // chain selector lib doesn't support chain id 2 and we don't use it in tests
- // because it's not an evm chain
- if chain.Network.ChainID == "2" { // aptos chain
- continue
- }
- id, err := strconv.ParseUint(chain.Network.ChainID, 10, 64)
- require.NoError(t, err, "failed to parse chain id to uint64")
- chains[id] = struct{}{}
- }
- }
- }
- var chainIDs []uint64
- for c := range chains {
- chainIDs = append(chainIDs, c)
- }
- allChains := memory.NewMemoryChainsWithChainIDs(t, chainIDs)
-
- env := &deployment.Environment{
- Name: "CLO",
- ExistingAddresses: deployment.NewMemoryAddressBook(),
- Offchain: clo.NewJobClient(lggr, clo.JobClientConfig{Nops: allNops}),
- Chains: allChains,
- Logger: lggr,
- OCRSecrets: deployment.XXXGenerateTestOCRSecrets(),
- }
- // assume that all the nodes in the provided input nops are part of the don
- for _, nop := range allNops {
- for _, node := range nop.Nodes {
- env.NodeIDs = append(env.NodeIDs, node.ID)
- }
- }
-
- // sepolia; all nodes are on the this chain
- registryChainSel, err := chainsel.SelectorFromChainId(11155111)
- require.NoError(t, err)
-
- var ocr3Config = keystone.OracleConfig{
- MaxFaultyOracles: len(wfNops) / 3,
- }
-
- ctx := tests.Context(t)
- // explicitly deploy the contracts
- cs, err := keystone.DeployContracts(env, registryChainSel)
- require.NoError(t, err)
- // Deploy successful these are now part of our env.
- require.NoError(t, env.ExistingAddresses.Merge(cs.AddressBook))
-
- deployReq := keystone.ConfigureContractsRequest{
- RegistryChainSel: registryChainSel,
- Env: env,
- OCR3Config: &ocr3Config,
- Dons: []keystone.DonCapabilities{wfDon, cwDon, assetDon},
- DoContractDeploy: false,
- }
- deployResp, err := keystone.ConfigureContracts(ctx, lggr, deployReq)
- require.NoError(t, err)
- ad := env.ExistingAddresses
-
- // all contracts on home chain
- homeChainAddrs, err := ad.AddressesForChain(registryChainSel)
- require.NoError(t, err)
- require.Len(t, homeChainAddrs, 3)
- // only forwarder on non-home chain
- for sel := range env.Chains {
- chainAddrs, err := ad.AddressesForChain(sel)
- require.NoError(t, err)
- if sel != registryChainSel {
- require.Len(t, chainAddrs, 1)
- } else {
- require.Len(t, chainAddrs, 3)
- }
- containsForwarder := false
- for _, tv := range chainAddrs {
- if tv.Type == keystone.KeystoneForwarder {
- containsForwarder = true
- break
- }
- }
- require.True(t, containsForwarder, "no forwarder found in %v on chain %d for target don", chainAddrs, sel)
- }
- req := &keystone.GetContractSetsRequest{
- Chains: env.Chains,
- AddressBook: ad,
- }
-
- contractSetsResp, err := keystone.GetContractSets(lggr, req)
- require.NoError(t, err)
- require.Len(t, contractSetsResp.ContractSets, len(env.Chains))
- // check the registry
- regChainContracts, ok := contractSetsResp.ContractSets[registryChainSel]
- require.True(t, ok)
- gotRegistry := regChainContracts.CapabilitiesRegistry
- require.NotNil(t, gotRegistry)
- // check DONs
- gotDons, err := gotRegistry.GetDONs(&bind.CallOpts{})
- if err != nil {
- err = keystone.DecodeErr(kcr.CapabilitiesRegistryABI, err)
- require.Fail(t, fmt.Sprintf("failed to get DONs from registry at %s: %s", gotRegistry.Address().String(), err))
- }
- require.NoError(t, err)
- assert.Len(t, gotDons, len(deployReq.Dons))
- // check NOPs
- nops, err := gotRegistry.GetNodeOperators(&bind.CallOpts{})
- if err != nil {
- err = keystone.DecodeErr(kcr.CapabilitiesRegistryABI, err)
- require.Fail(t, fmt.Sprintf("failed to get NOPs from registry at %s: %s", gotRegistry.Address().String(), err))
- }
- require.NoError(t, err)
- assert.Len(t, nops, 26) // 10 NOPs owning workflow & writer DONs + 16 NOPs owning Asset DON
-
- for n, info := range deployResp.DonInfos {
- found := false
- for _, gdon := range gotDons {
- if gdon.Id == info.Id {
- found = true
- assert.EqualValues(t, info, gdon)
- break
- }
- }
- require.True(t, found, "don %s not found in registry", n)
- }
- // check the forwarder
- for _, cs := range contractSetsResp.ContractSets {
- forwarder := cs.Forwarder
- require.NotNil(t, forwarder)
- // any read to ensure that the contract is deployed correctly
- _, err := forwarder.Owner(&bind.CallOpts{})
- require.NoError(t, err)
- // TODO expand this test; there is no get method on the forwarder so unclear how to test it
- }
- // check the ocr3 contract
- for chainSel, cs := range contractSetsResp.ContractSets {
- if chainSel != registryChainSel {
- require.Nil(t, cs.OCR3)
- continue
- }
- require.NotNil(t, cs.OCR3)
- // any read to ensure that the contract is deployed correctly
- _, err := cs.OCR3.LatestConfigDetails(&bind.CallOpts{})
- require.NoError(t, err)
- }
-}
-
-func requireChains(t *testing.T, donNops []*models.NodeOperator, cs []models.ChainType) {
- got := make(map[models.ChainType]struct{})
- want := make(map[models.ChainType]struct{})
- for _, c := range cs {
- want[c] = struct{}{}
- }
- for _, nop := range donNops {
- for _, node := range nop.Nodes {
- for _, cc := range node.ChainConfigs {
- got[cc.Network.ChainType] = struct{}{}
- }
- }
- require.EqualValues(t, want, got, "did not find all chains in node %s", nop.Name)
- }
-}
-
-func loadTestNops(t *testing.T, pth string) []*models.NodeOperator {
- f, err := os.ReadFile(pth)
- require.NoError(t, err)
- var nops []*models.NodeOperator
- require.NoError(t, json.Unmarshal(f, &nops))
- return nops
-}
diff --git a/deployment/keystone/deprecated.go b/deployment/keystone/deprecated.go
new file mode 100644
index 00000000000..0e85cbedb17
--- /dev/null
+++ b/deployment/keystone/deprecated.go
@@ -0,0 +1,127 @@
+package keystone
+
+import "github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
+
+//TODO: delete this after the downstream migration is done
+
+// DEPRECATED: Use changeset package instead
+// OracleConfig is the configuration for an oracle
+type OracleConfig = changeset.OracleConfig
+
+// DEPRECATED: Use changeset package instead
+// OCR3OnchainConfig is the onchain configuration of an OCR2 contract
+type OCR2OracleConfig = changeset.OCR3OnchainConfig
+
+// DEPRECATED: Use changeset package instead
+// NodeKeys is a set of public keys for a node
+type NodeKeys = changeset.NodeKeys
+
+// DEPRECATED: Use changeset package instead
+// TopLevelConfigSource is the top level configuration source
+type TopLevelConfigSource = changeset.TopLevelConfigSource
+
+// DEPRECATED: Use changeset package instead
+// GenerateOCR3Config generates an OCR3 config
+var GenerateOCR3Config = changeset.GenerateOCR3Config
+
+// DEPRECATED: Use changeset package instead
+// FeedConsumer is a feed consumer contract type
+var FeedConsumer = changeset.FeedConsumer
+
+// DEPRECATED: Use changeset package instead
+// KeystoneForwarder is a keystone forwarder contract type
+var KeystoneForwarder = changeset.KeystoneForwarder
+
+// DEPRECATED: Use changeset package instead
+// GetContractSetsRequest is a request to get contract sets
+type GetContractSetsRequest = changeset.GetContractSetsRequest
+
+// DEPRECATED: Use changeset package instead
+// GetContractSetsResponse is a response to get contract sets
+type GetContractSetsResponse = changeset.GetContractSetsResponse
+
+// DEPRECATED: Use changeset package instead
+// GetContractSets gets contract sets
+var GetContractSets = changeset.GetContractSets
+
+// DEPRECATED: Use changeset package instead
+// RegisterCapabilitiesRequest is a request to register capabilities
+type RegisterCapabilitiesRequest = changeset.RegisterCapabilitiesRequest
+
+// DEPRECATED: Use changeset package instead
+// RegisterCapabilitiesResponse is a response to register capabilities
+type RegisterCapabilitiesResponse = changeset.RegisterCapabilitiesResponse
+
+// DEPRECATED: Use changeset package instead
+// RegisterCapabilities registers capabilities
+var RegisterCapabilities = changeset.RegisterCapabilities
+
+// DEPRECATED: Use changeset package instead
+// RegisterNOPSRequest is a request to register NOPS
+type RegisterNOPSRequest = changeset.RegisterNOPSRequest
+
+// DEPRECATED: Use changeset package instead
+// RegisterNOPSResponse is a response to register NOPS
+type RegisterNOPSResponse = changeset.RegisterNOPSResponse
+
+// DEPRECATED: Use changeset package instead
+// RegisterNOPS registers NOPS
+var RegisterNOPS = changeset.RegisterNOPS
+
+// DEPRECATED: Use changeset package instead
+// RegisterNodesRequest is a request to register nodes with the capabilities registry
+type RegisterNodesRequest = changeset.RegisterNodesRequest
+
+// DEPRECATED: Use changeset package instead
+// RegisterNodesResponse is a response to register nodes with the capabilities registry
+type RegisterNodesResponse = changeset.RegisterNodesResponse
+
+// DEPRECATED: Use changeset package instead
+// RegisterNodes registers nodes with the capabilities registry
+var RegisterNodes = changeset.RegisterNodes
+
+// DEPRECATED: Use changeset package instead
+// RegisteredCapability is a wrapper of a capability and its ID
+type RegisteredCapability = changeset.RegisteredCapability
+
+// DEPRECATED: Use changeset package instead
+// FromCapabilitiesRegistryCapability converts a capabilities registry capability to a registered capability
+var FromCapabilitiesRegistryCapability = changeset.FromCapabilitiesRegistryCapability
+
+// DEPRECATED: Use changeset package instead
+// RegisterDonsRequest is a request to register Dons with the capabilities registry
+type RegisterDonsRequest = changeset.RegisterDonsRequest
+
+// DEPRECATED: Use changeset package instead
+// RegisterDonsResponse is a response to register Dons with the capabilities registry
+type RegisterDonsResponse = changeset.RegisterDonsResponse
+
+// DEPRECATED: Use changeset package instead
+// RegisterDons registers Dons with the capabilities registry
+var RegisterDons = changeset.RegisterDons
+
+// DEPRECATED: Use changeset package instead
+// DONToRegister is the minimal information needed to register a DON with the capabilities registry
+type DONToRegister = changeset.DONToRegister
+
+// DEPRECATED: Use changeset package instead
+// ConfigureContractsRequest is a request to configure ALL the contracts
+type ConfigureContractsRequest = changeset.ConfigureContractsRequest
+
+// DEPRECATED: Use changeset package instead
+// ConfigureContractsResponse is a response to configure ALL the contracts
+type ConfigureContractsResponse = changeset.ConfigureContractsResponse
+
+// DEPRECATED: Use changeset package instead
+// DonCapabilities is a set of capabilities hosted by a set of node operators
+// in is in a convenient form to handle the CLO representation of the nop data
+type DonCapabilities = changeset.DonCapabilities
+
+// DEPRECATED: Use changeset package instead
+type DeployRequest = changeset.DeployRequest
+
+// DEPRECATED: Use changeset package instead
+type DeployResponse = changeset.DeployResponse
+
+// DEPRECATED: Use changeset package instead
+type ContractSet = changeset.ContractSet
diff --git a/deployment/keystone/test/changeset/capability_registry.go b/deployment/keystone/test/changeset/capability_registry.go
index 28ee711dc75..98f1e752f5a 100644
--- a/deployment/keystone/test/changeset/capability_registry.go
+++ b/deployment/keystone/test/changeset/capability_registry.go
@@ -7,10 +7,11 @@ import (
chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/chainlink/deployment"
+
"github.com/smartcontractkit/chainlink/deployment/common/view/v1_0"
- "github.com/smartcontractkit/chainlink/deployment/keystone"
+
"github.com/smartcontractkit/chainlink/deployment/keystone/changeset"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0"
)
type HydrateConfig struct {
@@ -33,7 +34,7 @@ func HydrateCapabilityRegistry(t *testing.T, v v1_0.CapabilityRegistryView, env
return nil, fmt.Errorf("failed to deploy contract: %w", err)
}
- resp, err := keystone.GetContractSets(env.Logger, &keystone.GetContractSetsRequest{
+ resp, err := changeset.GetContractSets(env.Logger, &changeset.GetContractSetsRequest{
Chains: env.Chains,
AddressBook: changesetOutput.AddressBook,
})
@@ -49,13 +50,13 @@ func HydrateCapabilityRegistry(t *testing.T, v v1_0.CapabilityRegistryView, env
nopsParams := v.NopsToNopsParams()
tx, err := deployedContract.AddNodeOperators(chain.DeployerKey, nopsParams)
- if _, err = deployment.ConfirmIfNoError(chain, tx, keystone.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)); err != nil {
+ if _, err = deployment.ConfirmIfNoError(chain, tx, deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)); err != nil {
return nil, fmt.Errorf("failed to add node operators: %w", err)
}
capabilitiesParams := v.CapabilitiesToCapabilitiesParams()
tx, err = deployedContract.AddCapabilities(chain.DeployerKey, capabilitiesParams)
- if _, err = deployment.ConfirmIfNoError(chain, tx, keystone.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)); err != nil {
+ if _, err = deployment.ConfirmIfNoError(chain, tx, deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)); err != nil {
return nil, fmt.Errorf("failed to add capabilities: %w", err)
}
@@ -64,7 +65,7 @@ func HydrateCapabilityRegistry(t *testing.T, v v1_0.CapabilityRegistryView, env
return nil, fmt.Errorf("failed to convert nodes to nodes params: %w", err)
}
tx, err = deployedContract.AddNodes(chain.DeployerKey, nodesParams)
- if _, err = deployment.ConfirmIfNoError(chain, tx, keystone.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)); err != nil {
+ if _, err = deployment.ConfirmIfNoError(chain, tx, deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)); err != nil {
return nil, fmt.Errorf("failed to add nodes: %w", err)
}
@@ -78,7 +79,7 @@ func HydrateCapabilityRegistry(t *testing.T, v v1_0.CapabilityRegistryView, env
peerIds = append(peerIds, id)
}
tx, err = deployedContract.AddDON(chain.DeployerKey, peerIds, cfgs, don.IsPublic, don.AcceptsWorkflows, don.F)
- if _, err = deployment.ConfirmIfNoError(chain, tx, keystone.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)); err != nil {
+ if _, err = deployment.ConfirmIfNoError(chain, tx, deployment.DecodeErr(capabilities_registry.CapabilitiesRegistryABI, err)); err != nil {
return nil, fmt.Errorf("failed to add don: %w", err)
}
}
diff --git a/deployment/keystone/testdata/asset_nodes.json b/deployment/keystone/testdata/asset_nodes.json
deleted file mode 100644
index 9ad2ba4e0e8..00000000000
--- a/deployment/keystone/testdata/asset_nodes.json
+++ /dev/null
@@ -1,978 +0,0 @@
-[
- {
- "id": "81",
- "keys": [
- "cl-df-asset-don-testnet-0"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 0",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 18
- },
- "nodes": [
- {
- "id": "831",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 0",
- "publicKey": "d791dad33f1aeff811f3364088993053d5d08fa595ba48f73aecd4ee2d5035a1",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xe826b8D7f57b1c08E2d0C9477006244AECB280c3",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWDh47EiK5TzG4yApEEwLecgRkqZKQif3fcnsztfhQNzNh",
- "publicKey": "398f42d12c7f3445341e42ce4ea555c87d84db68c808c76a0655e5d993d7a2a6"
- },
- "ocrKeyBundle": {
- "bundleID": "c8dee638c00194cf38bd0c30306fffd14b561601828085ceaaf0ab5fe451ec23",
- "configPublicKey": "dbd5d1f5aa4921fd1e7b16f26dc75aff5cc08fee6e74324e947654ba78791e7e",
- "offchainPublicKey": "66a599cda37e6fb5dc50e16d7c81e6967e010a25bbeaabf20752e228a26f5bc3",
- "onchainSigningAddress": "9184c1c20da57f2f747a60909d0152c289e8518f"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:19:34.127102Z"
- },
- {
- "id": "82",
- "keys": [
- "cl-df-asset-don-testnet-1"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 1",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "832",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 1",
- "publicKey": "eb410038ba7847a729c4e40c1d4afdbcce9ad33cc71e459883cd98f0883a5366",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xCE154165b0d60D1efA9b3c7a172ED77712Cb82f9",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWG7WEsQjxXQdn5WAEQSDh77qxjMoWxz3rGYrRC9pPB7qx",
- "publicKey": "5d8a1f11ecd0cd2cdd95fec35b8ea6386af567bc96aa2c2ea47e91d22b1f12bf"
- },
- "ocrKeyBundle": {
- "bundleID": "a6dda044db7fa1fa652ec9ff60a44fb31ee99d33db35599848b21e34ce33c343",
- "configPublicKey": "586fb9935401e8907ead91e7a3423a0c0676d4669bac619f71c99913e14b362a",
- "offchainPublicKey": "9557c0c4c6c8aeb41ecaa84f0aa7d0e1be7ffa9e4a08da27b23bd64b2d0c0fe9",
- "onchainSigningAddress": "bd3e16dda612f543c0f79fafc03fa35f3f300e30"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:19:48.159926Z"
- },
- {
- "id": "83",
- "keys": [
- "cl-df-asset-don-testnet-2"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 2",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "833",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 2",
- "publicKey": "daf14b79caa585c3dacf550688aeed5371f8fd39cbfb6e33add2fb82538626b0",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xbb16a69A7bb8778dc52a2D081EE1B2Dde0237F3b",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBWms38viHaptUHTXXNdN4Qm2ZxDWtuaZviZtq1WzWWcq",
- "publicKey": "1935b60309f79e7fd1bfd4736df5729b7532bcd435be2a707dd28519e9ae6e6a"
- },
- "ocrKeyBundle": {
- "bundleID": "9c63a332ff254cd2cda8bcf2c3f0e46ee95d4991595019619a0c60907437d98c",
- "configPublicKey": "29b9b6f61db8e72df13e17e274bdf5450987953079b9dee2745f2d288dc7e86d",
- "offchainPublicKey": "c3b08d0b68baf68da2c8446f6a9dc552af3ab2014b900d75ca9e2122b6fc9eb0",
- "onchainSigningAddress": "cb66494d66922ad00708bce7c83ada133ddb8994"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:20:01.151494Z"
- },
- {
- "id": "84",
- "keys": [
- "cl-df-asset-don-testnet-3"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 3",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "834",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 3",
- "publicKey": "0e1f9462a8b326d746fde2d5016faa9f2e017f7e6e5969aaf3281519d2e31dbc",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xA64f65e0c12ab015792c34867BE5b80b4D4C551A",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMhHZTVHz23gCQAEzFyeBLxR9ghVqMQHk18VND4TbAc1U",
- "publicKey": "b07bf77b2b1d8964915d4871b4cd0173e13bc1d0590731a8969393a6e80aef8f"
- },
- "ocrKeyBundle": {
- "bundleID": "87770ad41d54661a6dee424612f4338b49cd4fd20bdab1f11c308c76efeb56f8",
- "configPublicKey": "dd0edc91d1476a0a4c554e8fe8050dadba679ba42f53973bf181d85eed1b6821",
- "offchainPublicKey": "2ba2cc779c8e1460d9ff823d594708a344bb7a9d84aa3aa3833d539852511a88",
- "onchainSigningAddress": "5e5b1a602c5a79ec6cdeb67e6f855d58061f785f"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:20:10.382565Z"
- },
- {
- "id": "85",
- "keys": [
- "cl-df-asset-don-testnet-4"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 4",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "835",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 4",
- "publicKey": "1d5f6ef3443e48bd471efdb47a5b9c6c900a14f35253c2b562908186f5b8b457",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x7284bBa5C8090Ac99d55b14db015a291C017275c",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMrkkbkFYJydLhcYKr8AnxNcNGmwfVXMQGdn8uoSpYoJs",
- "publicKey": "b2e8f0b25c7334e8082cb82eee29bc4f48ae086b8fe4a2fd5eb4e08195a0e06c"
- },
- "ocrKeyBundle": {
- "bundleID": "1ceac31d893d21e95a62419d94b1a88805fa4f056b1636ccd79ab0ca8b4fe68c",
- "configPublicKey": "4c94f49461fd0fd9d4da5cda4590a2cf80fba2ea27c422b92ee18a3aaaa51321",
- "offchainPublicKey": "d1649b393614e01811979340d2726280f9ea57fd7a1ee28958adbbaf71b41bf5",
- "onchainSigningAddress": "e47d17607054e9899d3fb7fa5b4b3e01b85b8fc9"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:20:21.050174Z"
- },
- {
- "id": "86",
- "keys": [
- "cl-df-asset-don-testnet-5"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 5",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "837",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 5",
- "publicKey": "d87dfbb7444036e0654578afdb11864e31a0de1824ca2780f24b16116a85463d",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x6c75DB65540ca889803a092d4C1497D3337cDE30",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWH8q69DtEqahJdwKfYXnkRHHH6E4jTqevZSAZzGsrnsTB",
- "publicKey": "6cbcb3cc0a48ec9d94bb1424beea5e1b7cf57fda2dbfc519afd9221cbeac3b8e"
- },
- "ocrKeyBundle": {
- "bundleID": "6e088c00e61fea95a5a808a56e7e55c58ec0d61c3207383a2c63abc705bd120c",
- "configPublicKey": "0728ce40c95155853ecd31bc213ed2b39d4ecf2e62dc95334f008181ad010848",
- "offchainPublicKey": "521d4c291fe8ef245b2e497982b0a07127cd3c65439a10784d914e03ba24328d",
- "onchainSigningAddress": "d32a6ed4be6656fd988a0e43e71ce43fab3faba4"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:21:21.831183Z"
- },
- {
- "id": "87",
- "keys": [
- "cl-df-asset-don-testnet-6"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 6",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "838",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 6",
- "publicKey": "294f58723d4049af0dcd63eedfcda957287401a10070db509ede7a799bb70654",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xa2788731913cc2deBC061F8594AEaa8e99B4FCCE",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWD7URmTzSeotMvEzkJTiFrwUHhcGMBeaS9GY8763Sqqnf",
- "publicKey": "30f502f9fb19b54e8644f038f57f9a43582f76b86bace61759fff12886ccf1a8"
- },
- "ocrKeyBundle": {
- "bundleID": "57bc2a8a62ed96e6aa7b9bbe56f93abeef938a1766cb8a6d18e42ebf71101646",
- "configPublicKey": "36c882b0cdcec84aa85f00ea43cd31254406cec84d31f6dded69b4fbb3f17449",
- "offchainPublicKey": "46951e1e18cee25cd417b3fa7feb25fb53623a249e1c09491bb978dccc2ea76e",
- "onchainSigningAddress": "abcd8be3952a84fb10947dbeb768a255ead58ca2"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:21:34.93501Z"
- },
- {
- "id": "88",
- "keys": [
- "cl-df-asset-don-testnet-7"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 7",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "839",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 7",
- "publicKey": "55b0ec5d90de973c00efce233334a9d3c5a94062ea010575bb248eb6804a9cfe",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x14dAF00DaD855089A6586690d5C1fD2779302736",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBbo44H5CLACV3yGyDWrtMuSWRdN5sQcDsnPC4WfLr6Jo",
- "publicKey": "1a7ef5e7420434fcf06de3d15a0191f7499e00e15427679616ce800779ceb514"
- },
- "ocrKeyBundle": {
- "bundleID": "f87acde2c1c21e8859d84813034d84a3f3bb1d49596e13ac66731d50750b9436",
- "configPublicKey": "e75f21bc1dc6eac12358277caf18a216ed54f8dc84285941ef1f5fb1047f8d5b",
- "offchainPublicKey": "c7b86dfbdf31a3b13c44305cd6fc88c402653198201006083414223ffc36950d",
- "onchainSigningAddress": "93fbb113f191959f8ab5e052395676e0038f2f1f"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:21:45.063449Z"
- },
- {
- "id": "89",
- "keys": [
- "cl-df-asset-don-testnet-8"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 8",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "840",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 8",
- "publicKey": "8f9f327ac7ad823a0f3297f3505591bcd40adc8fb1309f99874c26663cbd5914",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xb0C0168905C07F00A141494eaeFc0bD9F153fc16",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWGVroAehJh33SBns9MohmctNPZSDh89KRQM1J6TSCnT1v",
- "publicKey": "63442493270891409900afd3bb868d03fd07c775bb38c56e56a624b674a68b35"
- },
- "ocrKeyBundle": {
- "bundleID": "4413e0a3080c3dfa7709b16c3ee68c04359e2dd66d107fd3be6ba7c615c4b3b6",
- "configPublicKey": "8f3975b19fc6f02e241119b2132331ed9ed0d19221bd0cfd6f54b5859090a741",
- "offchainPublicKey": "f4f182c889668d8951932c49e1ffb1252b8a33a9875d3f19aea7bb805b65c7a6",
- "onchainSigningAddress": "b257e9efe637f38b5462a170737571ea0f0e2e05"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:21:55.09098Z"
- },
- {
- "id": "90",
- "keys": [
- "cl-df-asset-don-testnet-9"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 9",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "841",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 9",
- "publicKey": "1d79884071dfec1f39dc62f4868f4a143ae39cb03ad9d14142b184686c2b5a93",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x2F5E08a5b9D893e9dA2d68Ef605fBa6f8Ebfd0cB",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWEBn9tWmMWrSxRZe2VQ56RcSHRUPdcFoD3Ep88wqTT9zP",
- "publicKey": "40eb109d9f28e8754dfff419a9175d6714405907413d2f77657355721c3b2bd0"
- },
- "ocrKeyBundle": {
- "bundleID": "6d4da72b1daad0b9ea47a7daa6cde81c1608b7bd199c05b18b989d10c5d7b99e",
- "configPublicKey": "7e1c66bfa23c270770401d0dd739adad5a52827ecb40a0668f7e014d53f38059",
- "offchainPublicKey": "712561a10b1f7dd96f0ae0f0d3e6cdf83fdd0837d333cf9bbae0090126ae7f39",
- "onchainSigningAddress": "2ef8cea7dae7bd1e876a59a44ca59b89adf8abb4"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:22:09.476108Z"
- },
- {
- "id": "91",
- "keys": [
- "cl-df-asset-don-testnet-10"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 10",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "842",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 10",
- "publicKey": "cf6c47ad934518f5947ce8f1a48c2df8c93bd585788a3a82229fd4d723efa706",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x4794743bB8f159954Efa31642609ebfD4D2b9EdC",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNXZCbQe4Ao7KEciJGY6Ec4oZLZNGcMTPyZ7XpFhLPyLo",
- "publicKey": "bcd987b3b2b20d9effe30598850ddfd33023339dab012c4aee4cdc4246111bfc"
- },
- "ocrKeyBundle": {
- "bundleID": "a8d9929327d89cfabd8c583d250dfddbc14e947e9253f7471191886ca5197786",
- "configPublicKey": "a1a390e756bce818d1786dca6ba3e45013085087e5a3be6253d8bbbd6479255a",
- "offchainPublicKey": "76522fec251ce6130c03a816025f2054eb3ac83b7d30347f42b73a77e7b9a511",
- "onchainSigningAddress": "179d48901e5e9c3c11dd947c001f8a2ee887c8eb"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:22:30.732346Z"
- },
- {
- "id": "92",
- "keys": [
- "cl-df-asset-don-testnet-11"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 11",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "843",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 11",
- "publicKey": "c239c23670224558a64ea3165eae8d67a17b75b1874fbccf8a4dd98e953820ad",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x27AFd92F391dFD7BA1bbC89e3bd13ceC9A667c11",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWSSzLfwq7QSdJcpDLFiBznA1XR58dwg1xre4b88SbP7VF",
- "publicKey": "f71ccc7f7b73f1499f72987679a94a11e8564f01415acdb958c008c5bfe21eae"
- },
- "ocrKeyBundle": {
- "bundleID": "3e691b13aa702631fba25f6e128a566bdff3982cc3438af29acc2a819b9d6e02",
- "configPublicKey": "149d81dce137d0874b477ad6c19dc72801f335200622fa34f1c660623febed22",
- "offchainPublicKey": "b0d0d8e3c62abc7236e6539413ef82e568dd24f0c39ff6e8e2babe513590a522",
- "onchainSigningAddress": "a0f2feab4d03899eb2e830bd4abc3fd5babef3e1"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:22:42.314654Z"
- },
- {
- "id": "93",
- "keys": [
- "cl-df-asset-don-testnet-12"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 12",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "844",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 12",
- "publicKey": "71b29eb63daa6ac2e48b46669936eff5606879b102bae78afc929554c435dd0b",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x13d5b27d71B4C4697874177Ff43DEB1884Cff49e",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWT1LMqEW51UfxBynzjYjuybQzVkmf4rH9js9e16QAbU3X",
- "publicKey": "ff66057a6c96779134a6527364cddcce43b69e3d1820f59dde5e6b38d1d32fde"
- },
- "ocrKeyBundle": {
- "bundleID": "4854ee3fc7ac4591eea33c5d0d1cefd4ad819d2c374a2f86267a9999228a967a",
- "configPublicKey": "470225644f274147b5b80c862a3f3cd7a19fed4ff915e9c18ac80e06003ecc6a",
- "offchainPublicKey": "e7d89e196f5f6d92f4c42ab34f9a2f21f3201314be65b819872c4609b87866c7",
- "onchainSigningAddress": "c84f2f60ccb1d7e6c6e4ae4bc3cab8bb85db8977"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:22:52.838595Z"
- },
- {
- "id": "94",
- "keys": [
- "cl-df-asset-don-testnet-13"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 13",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "845",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 13",
- "publicKey": "c098264a552125355804b903de06400621f2d1de357c2bed94586727fe8a3502",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x5647A091F2a09915c1C0F6ac95630Be87114881F",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWRjg2KoP6jKVWU2BczeduWsdnfN69tHN2YGEAGtETvc9P",
- "publicKey": "ec87467a512f8218bb63f7fcf46cf0b8fd8ebb14bd5f3b670908d505a5af801a"
- },
- "ocrKeyBundle": {
- "bundleID": "20626049a1e24912a14d186645ba70fea4860efcc987b3ec7c9ddc881b5057db",
- "configPublicKey": "d84d4653db0caca062d4058e9937ae618a53bbd1b41a673c5f13bebc24e7aa3a",
- "offchainPublicKey": "156c8ab52099386377fe27bbd50dafa368ff2790245f1407579f590b0bae7a1e",
- "onchainSigningAddress": "4f4b7bff5d32d62326b575d8c951d34e54888e31"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:23:19.587619Z"
- },
- {
- "id": "95",
- "keys": [
- "cl-df-asset-don-testnet-14"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 14",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "846",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 14",
- "publicKey": "12681ec137cd2d25e7c71638f564404dd764061921c870bbcddf683d048eed21",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x0419E70d32c3972930c99aaaDF20dCB473c56d22",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCdEG68z5kwYuD1xp1aJsFBtpw2HYh1K3ffVM6keVrJnT",
- "publicKey": "29b8bafebdef5e11ec3556fbcacdfb626d2f80cf178406e38664775e8b1ace78"
- },
- "ocrKeyBundle": {
- "bundleID": "80b1304898d5cea3c684790a0f01158468c7fa7770675edef33e4b137232ddc9",
- "configPublicKey": "15552ecb6ff10103a534f02594a7b7cbab686d76d5e7b32a9c67059e8c856861",
- "offchainPublicKey": "b561b7df3bdfe70f1af9395dbc00ef796774aa352c9a30d9c7e2f7e74d438073",
- "onchainSigningAddress": "fb1ca65bf473b4443d7359becc0de67a2d96228d"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:23:44.73219Z"
- },
- {
- "id": "96",
- "keys": [
- "cl-df-asset-don-testnet-15"
- ],
- "name": "Chainlink Keystone Asset DON Node Operator 15",
- "metadata": {
- "nodeCount": 1,
- "jobCount": 9
- },
- "nodes": [
- {
- "id": "847",
- "name": "Chainlink Sepolia Prod Keystone Asset Node 15",
- "publicKey": "a9a5d084f9cbbbd291eb43c33dd137cd6140e33c53cebb260463bf52795ec579",
- "chainConfigs": [
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x931900764a585D7a01e500976B630B4747216c8c",
- "adminAddress": "0x900FDC4d45297A743e4508986d4C1aa1BAf89A83",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQyZ9A9ScBpcoRww1gJVBNB2brNkjJhaqze6ehuv6bmfQ",
- "publicKey": "e139f020ae4bc9efaa77da9cfd54339d36176479028f849b9e64ad2cf29acba3"
- },
- "ocrKeyBundle": {
- "bundleID": "5c1c69eb1d6619b2c9b93bdfdd9c1b87c28101d6fc88bf7979ad52ceda459908",
- "configPublicKey": "33f2107ab22b3dd5c19d5de0c5b1e6e038f2275ba455eed7997485caec421925",
- "offchainPublicKey": "bb91b077c135cbdd1f4422c6021cf56d78326710c8bb8c4a87b3e7415e48915f",
- "onchainSigningAddress": "b94e3de607033d03e3f0cc3ef1f09edd2592b440"
- },
- "plugins": {
- "mercury": true
- }
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-09-18T19:24:01.875231Z"
- }
-]
diff --git a/deployment/keystone/testdata/chain_writer_nodes.json b/deployment/keystone/testdata/chain_writer_nodes.json
deleted file mode 100644
index 807730451ad..00000000000
--- a/deployment/keystone/testdata/chain_writer_nodes.json
+++ /dev/null
@@ -1,1447 +0,0 @@
-
-[
- {
- "id": "67",
- "keys": [
- "keystone-09"
- ],
- "name": "Chainlink Keystone Node Operator 9",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "818",
- "name": "Chainlink Sepolia Prod Keystone Cap One 9",
- "publicKey": "3f5bbcb4b0409e6ea39d824f1837787484475fffb12e5e4a70509756ef6c7f9a",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x9b74f08bD7269919C0597C0E00e70ef2A66829db",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz",
- "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f"
- },
- "ocrKeyBundle": {
- "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf",
- "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44",
- "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c",
- "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x662B6B119f7fc9Dc2A526395A9EA88AE79A1192F",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz",
- "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f"
- },
- "ocrKeyBundle": {
- "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf",
- "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44",
- "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c",
- "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x34431021e0E07c75816226697Af6Ef02725e36af",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz",
- "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f"
- },
- "ocrKeyBundle": {
- "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf",
- "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44",
- "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c",
- "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xB5988d5d9ADd3d98CF45211bE37cf9b3372054C9",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPG6X2RgqoSWtM3kvETV6kK4ki8FftaBkwvFWk8yKRBkz",
- "publicKey": "c7bf55cf625a55470b0c56c3e51ad175c9dd0d42ca48246c205c715b7495937f"
- },
- "ocrKeyBundle": {
- "bundleID": "aa717effd7d28374c5980dbd9583dcff5e0800e7100051c6c8418899648dffbf",
- "configPublicKey": "3fd95a3839f15adcdff573e6fbf07d06d78fbfeac5eb683f67e70226c1983c44",
- "offchainPublicKey": "2b8b8d091c6f4446365f463e6132d699206bbddd38284e8e14ae0443382f297c",
- "onchainSigningAddress": "b05b138a987fceffa68f79bdbb36a1faf8d3d964"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T19:00:07.113658Z"
- },
- {
- "id": "68",
- "keys": [
- "keystone-08"
- ],
- "name": "Chainlink Keystone Node Operator 8",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "817",
- "name": "Chainlink Sepolia Prod Keystone Cap One 8",
- "publicKey": "2346da196a82c88fe6c315d2e4d0dddacf4590a172b20adb6f27a8601ca0540d",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xa5C7133aBD35F9d742bD2997D693A507c5eBf4Ac",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT",
- "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690"
- },
- "ocrKeyBundle": {
- "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2",
- "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713",
- "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139",
- "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x9fd869f5baADb79F9b7C58c0855fcAc0384e1d4B",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT",
- "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690"
- },
- "ocrKeyBundle": {
- "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2",
- "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713",
- "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139",
- "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0xe477E4C2e335E9b839665d710dE77CFECa9C43A7",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT",
- "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690"
- },
- "ocrKeyBundle": {
- "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2",
- "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713",
- "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139",
- "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x056A1275DD670205aba10D8fC9bB597777a65030",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNfg9cYxEri1zGbdCZ87DekmruYY6J1wUobEwNNVewMpT",
- "publicKey": "beee088bccea272eb6473fcc1cd3e22f2fc8d3a253a6398b69f5aab94070e690"
- },
- "ocrKeyBundle": {
- "bundleID": "9fba2d29874bb06b07272bd9141f096c1987d790bb0f81c3ffaf66d11cdac4f2",
- "configPublicKey": "66dec87065de79e64ed4edd2478ec40a66f955af56e7b837729f464f8487d713",
- "offchainPublicKey": "a0f59d50078c77812da8d3077f552209adfb58e76b635e008b6b0f872ce52139",
- "onchainSigningAddress": "ed25406f1ef2e1381f6e1e04341f1a6e8b4eacea"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:26:37.622463Z"
- },
- {
- "id": "69",
- "keys": [
- "keystone-07"
- ],
- "name": "Chainlink Keystone Node Operator 7",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "816",
- "name": "Chainlink Sepolia Prod Keystone Cap One 7",
- "publicKey": "50d4e3393516d1998e5c39874d7c0da2291e4e3727f8baac4380e9f5573cc648",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x0ba7c1096B701A862bBCe7F13E9D33eED7e33c1D",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb",
- "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e"
- },
- "ocrKeyBundle": {
- "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd",
- "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c",
- "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f",
- "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0xcC44eD47023Bd88B82092A708c38609e8Fc2D197",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb",
- "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e"
- },
- "ocrKeyBundle": {
- "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd",
- "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c",
- "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f",
- "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x0E8F4E699cd331022FaA2Ad75E500e70303C8767",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb",
- "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e"
- },
- "ocrKeyBundle": {
- "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd",
- "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c",
- "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f",
- "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x49c36b3BEc6b6e0e77305273FAFC68f479630535",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQswQr8fxJG5ieMrayptGV4rvCjDWPCFtfkqm4L6NZbbb",
- "publicKey": "dfc9a26dc022bd244c13d62ca88bbe62ca996065bd23224e1f1b77128914d84e"
- },
- "ocrKeyBundle": {
- "bundleID": "d4566a0c2f256e59733ad2a6dff9f388a1e00b2e65ec1cff7590cb59028888cd",
- "configPublicKey": "58db0da621471e616615b8c1c1658ee3b7afbfa64662ce28b38272a95964052c",
- "offchainPublicKey": "262fee9de8dd0c8758ba78de8873fdb6705c45ce331bc16ac81dc5b5f0b9680f",
- "onchainSigningAddress": "516a9990d3a202b25c2cdd2f6316f4d066543e5d"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:30:51.07624Z"
- },
- {
- "id": "70",
- "keys": [
- "keystone-06"
- ],
- "name": "Chainlink Keystone Node Operator 6",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "815",
- "name": "Chainlink Sepolia Prod Keystone Cap One 6",
- "publicKey": "2669981add3071fae5dfd760fe97e7d2b90157f86b40227f306f1f3906099fc3",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x405eE4ad3E79786f899810ff6de16a83A920Db5D",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu",
- "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98"
- },
- "ocrKeyBundle": {
- "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b",
- "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c",
- "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3",
- "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x58D39d629ae9f904b0Ae509179b9e7c9B0184cee",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu",
- "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98"
- },
- "ocrKeyBundle": {
- "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b",
- "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c",
- "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3",
- "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x34bFe10F4f4e1101b019639ABd5E5eE5186B80E6",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu",
- "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98"
- },
- "ocrKeyBundle": {
- "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b",
- "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c",
- "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3",
- "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x1741EB7468A490b4A9BA6f4CC7A47B82EcD65c4c",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHB1ucYgRqrocS6t834wL5XaB11JSPgKwzB6QwRPzRayu",
- "publicKey": "6d4c18afa813bf7eec73e98a260294bce4b0b26eb9f6efceb2c9402eead56c98"
- },
- "ocrKeyBundle": {
- "bundleID": "d55283594d4e2c3e507f81ea9ad96261ebec1b1e8579bb1392ca22f7dc9b471b",
- "configPublicKey": "32d5b6d38147fa23ec1dc4eeb240e2e70ea768b9a5182676075acd5a2ab2794c",
- "offchainPublicKey": "9922cb5c0ae08f0b917979593824bde7ddad0935950e2835914acc34f6cd62f3",
- "onchainSigningAddress": "bca900017893ea1366c110941d698d078c2b93ca"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:32:14.024795Z"
- },
- {
- "id": "71",
- "keys": [
- "keystone-05"
- ],
- "name": "Chainlink Keystone Node Operator 5",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "814",
- "name": "Chainlink Sepolia Prod Keystone Cap One 5",
- "publicKey": "94e9ee398547f1564b8b5f72c6148e511919ed0e59b94ae848d63685108f2ab4",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xbd1ee3165178D3A3E38458a9Fb1d6BF7fb5C443e",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1",
- "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0"
- },
- "ocrKeyBundle": {
- "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13",
- "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a",
- "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5",
- "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x9b6284B5775E46fB02C1a589596EF07c35b55377",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1",
- "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0"
- },
- "ocrKeyBundle": {
- "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13",
- "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a",
- "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5",
- "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0xD83DCED517E4df64e913B97b3d0A906e4CA63d43",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1",
- "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0"
- },
- "ocrKeyBundle": {
- "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13",
- "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a",
- "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5",
- "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xFF1218066b4b5Cd9dE2A73639862082bcC98bf0D",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCiwWc97Q3Z9YUGZcAf46TMLg1uMvrEDa4gT6HZUFFCB1",
- "publicKey": "2b2f46bf3b7ab2f39a7fec18166a6ebbc0a72209e920c33933f9adf07b101cc0"
- },
- "ocrKeyBundle": {
- "bundleID": "bf1736a09452daa0923f2c680f3fa6362ae652294e80ce72d923b304b0dcbb13",
- "configPublicKey": "4ebd2a563c458485d2698d06142daa37ea2bee706b4a1a71c8435f2ec254506a",
- "offchainPublicKey": "8577b96b270b36e74eb5d411caa14353cdadea599d6d6aa9cccf534ce31f1ef5",
- "onchainSigningAddress": "b6727a31772b71d15e3120bfd618545292e1f9df"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:38:35.588611Z"
- },
- {
- "id": "72",
- "keys": [
- "keystone-04"
- ],
- "name": "Chainlink Keystone Node Operator 4",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "813",
- "name": "Chainlink Sepolia Prod Keystone Cap One 4",
- "publicKey": "a618fe2d3260151957d105d2dd593dddaad20c45dc6ae8eab265504e6585a02c",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xE73E4D047DA32De40C7008075aEb9F60C8AF3C90",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT",
- "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2"
- },
- "ocrKeyBundle": {
- "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b",
- "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878",
- "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6",
- "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x7501ff3462fd2133f2E1F93DB7Ec514988B43E56",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT",
- "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2"
- },
- "ocrKeyBundle": {
- "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b",
- "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878",
- "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6",
- "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0xef080765890a3F697C4920609621fe301Dd34A70",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT",
- "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2"
- },
- "ocrKeyBundle": {
- "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b",
- "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878",
- "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6",
- "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x860235D5Db42eF568665900BBD6bA3DB2fA4f33f",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWPMfQRpMy3wYzSMe3BLS8GFuC3fauk7FhTtgfbtp6T6jT",
- "publicKey": "c92c6c81f3dff17c05577b9f87177d735d797a3ceedc0fa1395682dfbb66a8d2"
- },
- "ocrKeyBundle": {
- "bundleID": "fbcfd8420c2ebc450c81fcf72c6673fdd786702c881467e69817c20350bf819b",
- "configPublicKey": "282a47a24fd976134f25a99f6370e072f228098010d2594d849d0a4c2788f878",
- "offchainPublicKey": "1a7902a01e27818cda034637fdce603a265bc380934324b6f48cf23873234ec6",
- "onchainSigningAddress": "7e799378dda3dcdc503233735f09150f0684be19"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:39:26.24249Z"
- },
- {
- "id": "73",
- "keys": [
- "keystone-03",
- "keystone-bt-03"
- ],
- "name": "Chainlink Keystone Node Operator 3",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "812",
- "name": "Chainlink Sepolia Prod Keystone Cap One 3",
- "publicKey": "f4cf97438c3ad86003e5c0368ab52c70f7fbb7f39ae0d7bf6dacbe16807e8a36",
- "chainConfigs": [
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x646665317aF70313B3E83Ea1369A91de389DaCAe",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM",
- "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600"
- },
- "ocrKeyBundle": {
- "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd",
- "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e",
- "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439",
- "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x3Ab2A4e4765A0374F727a9a9eCE893734e2928ec",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM",
- "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600"
- },
- "ocrKeyBundle": {
- "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd",
- "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e",
- "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439",
- "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x9905E8C3A4f82037170a8c411CD8b11D4894066f",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM",
- "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600"
- },
- "ocrKeyBundle": {
- "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd",
- "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e",
- "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439",
- "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x762354eC86ea2253F5da27FF8b952Cb7Dec52B6D",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAvLkcnc8Zttykk6gGeTWFiT6TqgovRHnb6Ym6QqjnLVM",
- "publicKey": "1063921b717c3e32210d2803fe684cd818ea2a4a96e405373e5786c8a13c7600"
- },
- "ocrKeyBundle": {
- "bundleID": "5b46ab201ba66bd93bae6f41afc59c2e578e0f5682fbdf76e1b647fde6d6e8dd",
- "configPublicKey": "a01d7d13f3e67ff84ff208cc44c923fe245d02d6029c91dc38422ef44f2bb26e",
- "offchainPublicKey": "64eded06a47efc5e311799c1e1fa833cf78d17f079b2f6019c3247debe490439",
- "onchainSigningAddress": "afca74e3b850a9435b2dc479ca8bc8e1b45dd0b2"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:40:30.499914Z"
- },
- {
- "id": "74",
- "keys": [
- "keystone-02",
- "keystone-bt-02"
- ],
- "name": "Chainlink Keystone Node Operator 2",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "811",
- "name": "Chainlink Sepolia Prod Keystone Cap One 2",
- "publicKey": "a1f112923513f13ede1ca8f982ea0ab6221d584b40cd57f0c82307ab79c0e69f",
- "chainConfigs": [
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0xbF1Ad47D99A65e230235537b47C8D1Dddb22FD53",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA",
- "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed"
- },
- "ocrKeyBundle": {
- "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037",
- "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700",
- "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37",
- "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0xa8d4698f74a0A427c1b8ec4575d9dFdD17Be288c",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA",
- "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed"
- },
- "ocrKeyBundle": {
- "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037",
- "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700",
- "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37",
- "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xf286c79b4a613a1fE480C8e4fB17B837E7D8ba03",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA",
- "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed"
- },
- "ocrKeyBundle": {
- "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037",
- "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700",
- "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37",
- "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xfe85A25cE2CB58b280CC0316305fC678Bf570f5e",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQhLYuAxx4WDKafnuhZUTix8Y24gtB92vEUpAC4EdH4VA",
- "publicKey": "dd1268a3e7ed4b9c83b1227e5bf2558e6b77af585c66e88a06f1164a1a94f8ed"
- },
- "ocrKeyBundle": {
- "bundleID": "a11d9438035564bfe84fcfb513b579edbe173fa26c00331e71a010d00b856037",
- "configPublicKey": "407cab2a04fa868f645c6848a53abdb8136b08441c50b191651c4f1a348ee700",
- "offchainPublicKey": "64a3215839e5630f12ae66b4363f40d82e9c981118c304ca0c4ca5fc2c6e1f37",
- "onchainSigningAddress": "6579d77791ee8f8116495dbe6fa6586980177230"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:41:33.205484Z"
- },
- {
- "id": "75",
- "keys": [
- "keystone-01",
- "keystone-bt-01"
- ],
- "name": "Chainlink Keystone Node Operator 1",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "810",
- "name": "Chainlink Sepolia Prod Keystone Cap One 1",
- "publicKey": "9ef27cd1855a0ed6932be33c80d7cd9c178307e5a240dbeb9055946359dc5d7f",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xBB465BCa1b289269F2a95a36f5B6fD006Af56ede",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf",
- "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c"
- },
- "ocrKeyBundle": {
- "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067",
- "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c",
- "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c",
- "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x5e3618cFF8Ab337b3c73c2775d1a2EC65e5abEF0",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf",
- "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c"
- },
- "ocrKeyBundle": {
- "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067",
- "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c",
- "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c",
- "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x1796BbC2AbbAd5660C8a7812b313E1f48A99f1D1",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf",
- "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c"
- },
- "ocrKeyBundle": {
- "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067",
- "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c",
- "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c",
- "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xA2bfAc45e6878fbE04525C23dFbb11fFb224Ea60",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMNg1a7HvNWuHAPMdveWr1J6NNCVBU1Z4w5swzepT5Wvf",
- "publicKey": "abb750e04bee21d830c6ce0f08180853466139fc6055c6737614797c0704d59c"
- },
- "ocrKeyBundle": {
- "bundleID": "0d176a4c2d68c619d237e419c31a030e5b2162ee031baa8ebc8472623da9b067",
- "configPublicKey": "43e4dbf80a9c818a7d35c080f61b6f8f9b175fa1217b1d01168140da75322d5c",
- "offchainPublicKey": "707db88237aaaaddc22bf0fe914540ea7b8bbfbe5cf88349cabb26e34762237c",
- "onchainSigningAddress": "ac08f52ec257ddbb493e7b9e299dd2c166a7f090"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:42:05.709664Z"
- },
- {
- "id": "76",
- "keys": [
- "keystone-00",
- "keystone-bt-00"
- ],
- "name": "Chainlink Keystone Node Operator 0",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "809",
- "name": "Chainlink Sepolia Prod Keystone Cap One 0",
- "publicKey": "545197637db59b96b22528ff90960b9e7cdcea81c8a5a9f06ae6b728bcba35cb",
- "chainConfigs": [
- {
- "network": {
- "id": "10",
- "chainID": "43113",
- "chainType": "EVM",
- "name": "Avalanche Testnet (Fuji)"
- },
- "accountAddress": "0x66a88b0a23D8351e8F5e228eEe8439e65F423842",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH",
- "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e"
- },
- "ocrKeyBundle": {
- "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef",
- "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e",
- "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e",
- "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x36a46774A3743641D4C274b385608Cb455B5B6b8",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH",
- "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e"
- },
- "ocrKeyBundle": {
- "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef",
- "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e",
- "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e",
- "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "147",
- "chainID": "84532",
- "chainType": "EVM",
- "name": "Base Testnet (Sepolia)"
- },
- "accountAddress": "0x868ab67c00fF7e21aFf470C066798e5bE4240305",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH",
- "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e"
- },
- "ocrKeyBundle": {
- "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef",
- "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e",
- "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e",
- "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xa60bC482fCfcd12B752541a00555E4e448Bc1d16",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWFux8Vvs8CPfUSKitXwQsq81ZBhQYcbKRH5L5jkFbQ6nH",
- "publicKey": "5a946cfec8e3c33f6c88961dcab2bbd8bb9d05538c8f931bb62d59b1d7fd782e"
- },
- "ocrKeyBundle": {
- "bundleID": "d9a3c3afdb310ba11b058afd6ee3159edfbc740df4daefd65c257a7ed46ed9ef",
- "configPublicKey": "64fd95e7bcbb33e3dd548247352bb7be5ea6577a840e5e3b66336f710b5b272e",
- "offchainPublicKey": "216b1e3dc51ad21be806c010397cc2e0bf59b2a06ade89bc7d0c0a7299a4e01e",
- "onchainSigningAddress": "a4f0acbe902443aa842db278f421da99cdc47a8b"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "OCR3_CAPABILITY",
- "DATA_STREAMS_V03"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:42:49.446864Z"
- }
-]
diff --git a/deployment/keystone/testdata/ocr3config.json b/deployment/keystone/testdata/ocr3config.json
deleted file mode 100644
index 6835a4143f4..00000000000
--- a/deployment/keystone/testdata/ocr3config.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "OracleConfig": {
- "MaxQueryLengthBytes": 1000000,
- "MaxObservationLengthBytes": 1000000,
- "MaxReportLengthBytes": 1000000,
- "MaxRequestBatchSize": 1000,
- "UniqueReports": true,
-
- "DeltaProgressMillis": 5000,
- "DeltaResendMillis": 5000,
- "DeltaInitialMillis": 5000,
- "DeltaRoundMillis": 2000,
- "DeltaGraceMillis": 500,
- "DeltaCertifiedCommitRequestMillis": 1000,
- "DeltaStageMillis": 30000,
- "MaxRoundsPerEpoch": 10,
- "TransmissionSchedule": [1, 1, 1, 1],
-
- "MaxDurationQueryMillis": 1000,
- "MaxDurationObservationMillis": 1000,
- "MaxDurationReportMillis": 1000,
- "MaxDurationAcceptMillis": 1000,
- "MaxDurationTransmitMillis": 1000,
-
- "MaxFaultyOracles": 1
- }
-}
diff --git a/deployment/keystone/testdata/workflow_nodes.json b/deployment/keystone/testdata/workflow_nodes.json
deleted file mode 100644
index a5cf7de56fd..00000000000
--- a/deployment/keystone/testdata/workflow_nodes.json
+++ /dev/null
@@ -1,1107 +0,0 @@
-
-[
- {
- "id": "67",
- "keys": [
- "keystone-09"
- ],
- "name": "Chainlink Keystone Node Operator 9",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "780",
- "name": "Chainlink Sepolia Prod Keystone One 9",
- "publicKey": "412dc6fe48ea4e34baaa77da2e3b032d39b938597b6f3d61fe7ed183a827a431",
- "chainConfigs": [
- {
- "network": {
- "id": "1401",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9"
- },
- "ocrKeyBundle": {
- "bundleID": "d834cf7c830df7510228b33b138c018ff16b4eecf82273ed3bcd862bbbc046d4",
- "configPublicKey": "6a1f37f06833c55ecf46233439ea6179a835bac6f2b2dee725b747c121813149",
- "offchainPublicKey": "ff1144bbf648e6f76c58d0ce53a9a2cbe9a284d52db8691a714cac8e3a96b8b4",
- "onchainSigningAddress": "4fa557850e4d5c21b3963c97414c1f37792700c4d3b8abdb904b765fd47e39bf"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xbA8E21dFaa0501fCD43146d0b5F21c2B8E0eEdfB",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9"
- },
- "ocrKeyBundle": {
- "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x0b04cE574E80Da73191Ec141c0016a54A6404056",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWBCMCCZZ8x57AXvJvpCujqhZzTjWXbReaRE8TxNr5dM4U",
- "publicKey": "147d5cc651819b093cd2fdff9760f0f0f77b7ef7798d9e24fc6a350b7300e5d9"
- },
- "ocrKeyBundle": {
- "bundleID": "1c28e76d180d1ed1524e61845fa58a384415de7e51017edf1f8c553e28357772",
- "configPublicKey": "09fced0207611ed618bf0759ab128d9797e15b18e46436be1a56a91e4043ec0e",
- "offchainPublicKey": "c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f",
- "onchainSigningAddress": "679296b7c1eb4948efcc87efc550940a182e610c"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T19:00:07.113658Z"
- },
- {
- "id": "68",
- "keys": [
- "keystone-08"
- ],
- "name": "Chainlink Keystone Node Operator 8",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "781",
- "name": "Chainlink Sepolia Prod Keystone One 8",
- "publicKey": "1141dd1e46797ced9b0fbad49115f18507f6f6e6e3cc86e7e5ba169e58645adc",
- "chainConfigs": [
- {
- "network": {
- "id": "1402",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c",
- "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829"
- },
- "ocrKeyBundle": {
- "bundleID": "6726df46033038b724a4e6371807b6aa09efc829d0a3f7a5db4fd7df4b69fea7",
- "configPublicKey": "0874e6cd5c8e651ab0ff564a474832ed9eaf2c5025b553f908d04921d9777d50",
- "offchainPublicKey": "c791d2b9d3562f991af68ab7164a19734d551a9404d91c9571fdcdc5dcb237ca",
- "onchainSigningAddress": "bddafb20cc50d89e0ae2f244908c27b1d639615d8186b28c357669de3359f208"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xEa4bC3638660D78Da56f39f6680dCDD0cEAaD2c6",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c",
- "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829"
- },
- "ocrKeyBundle": {
- "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3",
- "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264",
- "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70",
- "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x31B179dcF8f9036C30f04bE578793e51bF14A39E",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWAUagqMycsro27kFznSQRHbhfCBLx8nKD4ptTiUGDe38c",
- "publicKey": "09ca39cd924653c72fbb0e458b629c3efebdad3e29e7cd0b5760754d919ed829"
- },
- "ocrKeyBundle": {
- "bundleID": "be0d639de3ae3cbeaa31ca369514f748ba1d271145cba6796bcc12aace2f64c3",
- "configPublicKey": "e3d4d7a7372a3b1110db0290ab3649eb5fbb0daf6cf3ae02cfe5f367700d9264",
- "offchainPublicKey": "ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70",
- "onchainSigningAddress": "8c2aa1e6fad88a6006dfb116eb866cbad2910314"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:26:37.622463Z"
- },
- {
- "id": "69",
- "keys": [
- "keystone-07"
- ],
- "name": "Chainlink Keystone Node Operator 7",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "782",
- "name": "Chainlink Sepolia Prod Keystone One 7",
- "publicKey": "b473091fe1d4dbbc26ad71c67b4432f8f4280e06bab5e2122a92f4ab8b6ff2f5",
- "chainConfigs": [
- {
- "network": {
- "id": "1403",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC",
- "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1"
- },
- "ocrKeyBundle": {
- "bundleID": "14082da0f33b4cec842bc1e1002e617a194ed4a81105603bd6c1edf784aa3743",
- "configPublicKey": "209eea27e73b0ecc1c49b3ea274e4a18a1f5ed62fd79f443f0b5b9cc6019356e",
- "offchainPublicKey": "cf0684a0e59399fe9b92cfc740d9696f925e78ee7d0273947e5f7b830070eaaa",
- "onchainSigningAddress": "96dc85670c49caa986de4ad288e680e9afb0f5491160dcbb4868ca718e194fc8"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x65bE4739E187a39b859766C143b569acd5BE234d",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC",
- "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1"
- },
- "ocrKeyBundle": {
- "bundleID": "e6d6ffec6cff01ac20d57bc42626c8e955293f232d383bf468351d867a7b8213",
- "configPublicKey": "4d2f75f98b911c20fe7808384312d8b913e6b7a98c34d05c6e461434c92b4502",
- "offchainPublicKey": "01496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3",
- "onchainSigningAddress": "213803bb9f9715379aaf11aadb0212369701dc0a"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x9ad9f3AD49e5aB0F28bD694d211a90297bD90D7f",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWQMCj73V5xmCd6C5VsJr7rbFG2TF9LwVcLiiBqXps9MgC",
- "publicKey": "d7e9f2252b09edf0802a65b60bc9956691747894cb3ab9fefd072adf742eb9f1"
- },
- "ocrKeyBundle": {
- "bundleID": "e6d6ffec6cff01ac20d57bc42626c8e955293f232d383bf468351d867a7b8213",
- "configPublicKey": "4d2f75f98b911c20fe7808384312d8b913e6b7a98c34d05c6e461434c92b4502",
- "offchainPublicKey": "01496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3",
- "onchainSigningAddress": "213803bb9f9715379aaf11aadb0212369701dc0a"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:30:51.07624Z"
- },
- {
- "id": "70",
- "keys": [
- "keystone-06"
- ],
- "name": "Chainlink Keystone Node Operator 6",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "783",
- "name": "Chainlink Sepolia Prod Keystone One 6",
- "publicKey": "75ac63fc97a31e31168084e0de8ccd2bea90059b609d962f3e43fc296cdba28d",
- "chainConfigs": [
- {
- "network": {
- "id": "1404",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn",
- "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31"
- },
- "ocrKeyBundle": {
- "bundleID": "b419e9e3f1256aa2907a1a396bdf27ba5002a30eee440ab96cb60369429ce277",
- "configPublicKey": "3ae1a1c713e4ad63f67191fd93620c9eebe44e1d5f3264036ec0fbcd59cf9664",
- "offchainPublicKey": "6fc8c3fb55b39577abbab20028bee93d1d6d8a888dd298354b95d4af3ccb6009",
- "onchainSigningAddress": "4a94c75cb9fe8b1fba86fd4b71ad130943281fdefad10216c46eb2285d60950f"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x8706E716fc1ee972F3E4D42D42711Aa175Aa654A",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn",
- "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31"
- },
- "ocrKeyBundle": {
- "bundleID": "62d36269d916b4834b17dc6d637c1c39b0895396249a0845764c898e83f63525",
- "configPublicKey": "8c6c7d889ac6cc9e663ae48073bbf130fae105d6a3689636db27752e3e3e6816",
- "offchainPublicKey": "aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d",
- "onchainSigningAddress": "4885973b2fcf061d5cdfb8f74c5139bd3056e9da"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x19e10B063a62B1574AE19020A64fDe6419892dA6",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWNJ8de3PUURZ2oucrVTpnRTqNBTUYwHLQjK9LzN3E6Mfn",
- "publicKey": "b96933429b1a81c811e1195389d7733e936b03e8086e75ea1fa92c61564b6c31"
- },
- "ocrKeyBundle": {
- "bundleID": "62d36269d916b4834b17dc6d637c1c39b0895396249a0845764c898e83f63525",
- "configPublicKey": "8c6c7d889ac6cc9e663ae48073bbf130fae105d6a3689636db27752e3e3e6816",
- "offchainPublicKey": "aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d",
- "onchainSigningAddress": "4885973b2fcf061d5cdfb8f74c5139bd3056e9da"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:32:14.024795Z"
- },
- {
- "id": "71",
- "keys": [
- "keystone-05"
- ],
- "name": "Chainlink Keystone Node Operator 5",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "784",
- "name": "Chainlink Sepolia Prod Keystone One 5",
- "publicKey": "4542f4fd2ed150c8c976b39802fe3d994aec3ac94fd11e7817f693b1c9a1dabb",
- "chainConfigs": [
- {
- "network": {
- "id": "14005",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ",
- "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6"
- },
- "ocrKeyBundle": {
- "bundleID": "44b5f46bfbb04d0984469298ec43c350ec6b2cd4556b18265ebac1b6cc329c7c",
- "configPublicKey": "263bee0d09d90e0e618c4cdd630d1437f7377f2d544df57f39ddd47984970555",
- "offchainPublicKey": "11674b98849d8e070ac69d37c284b3091fcd374913f52b2b83ce2d9a4a4e0213",
- "onchainSigningAddress": "425d1354a7b8180252a221040c718cac0ba0251c7efe31a2acefbba578dc2153"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xcea9f5C042130dD35Eff5B5a6E2361A0276570e3",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ",
- "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6"
- },
- "ocrKeyBundle": {
- "bundleID": "99fad0362cc8dc8a57a8e616e68133a6d5a8834e08a1b4819710f0e912df5abc",
- "configPublicKey": "36de4924cf11938b4461aea1ce99cb640e9603d9a7c294ab6c54acd51d575a49",
- "offchainPublicKey": "283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8",
- "onchainSigningAddress": "657587eb55cecd6f90b97297b611c3024e488cc0"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xdAd1F3F8ec690cf335D46c50EdA5547CeF875161",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWR8d5kbZb7YiQWKpT1J1PfMqNaGAmb4jBFx9DWag4hpSZ",
- "publicKey": "e38c9f2760db006f070e9cc1bc1c2269ad033751adaa85d022fb760cbc5b5ef6"
- },
- "ocrKeyBundle": {
- "bundleID": "99fad0362cc8dc8a57a8e616e68133a6d5a8834e08a1b4819710f0e912df5abc",
- "configPublicKey": "36de4924cf11938b4461aea1ce99cb640e9603d9a7c294ab6c54acd51d575a49",
- "offchainPublicKey": "283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8",
- "onchainSigningAddress": "657587eb55cecd6f90b97297b611c3024e488cc0"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:38:35.588611Z"
- },
- {
- "id": "72",
- "keys": [
- "keystone-04"
- ],
- "name": "Chainlink Keystone Node Operator 4",
- "metadata": {
- "nodeCount": 2,
- "jobCount": 4
- },
- "nodes": [
- {
- "id": "785",
- "name": "Chainlink Sepolia Prod Keystone One 4",
- "publicKey": "07e0ffc57b6263604df517b94bd986169451a3c90600a855bb19212dc575de54",
- "chainConfigs": [
- {
- "network": {
- "id": "1406",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg",
- "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed"
- },
- "ocrKeyBundle": {
- "bundleID": "b1ab478c1322bc4f8227be50898a8044efc70cf0156ec53cf132119db7e94dea",
- "configPublicKey": "96ae354418e50dcd5b3dae62e8f0bc911bbce7f761220837aacdaa6f82bd0f29",
- "offchainPublicKey": "b34bb49788541de8b6cfb321799a41927a391a4eb135c74f6cb14eec0531ee6f",
- "onchainSigningAddress": "1221e131ef21014a6a99ed22376eb869746a3b5e30fd202cf79e44efaeb8c5c2"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x0be7Df958604166D9Bf0F727F0AC7A4Fb0f5B8a1",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg",
- "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed"
- },
- "ocrKeyBundle": {
- "bundleID": "8e563a16ec5a802345b162d0f31149e8d5055014a31847d7b20d6de500aa48bd",
- "configPublicKey": "c812eab2415f45cc1d2afdb2be2e3ea419bb7851acfc30c07b4df42c856e8f74",
- "offchainPublicKey": "2a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde",
- "onchainSigningAddress": "a6f35436cb7bffd615cc47a0a04aa0a78696a144"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x6F5cAb24Fb7412bB516b3468b9F3a9c471d25fE5",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWHqR1w26yHatTSZQW3xbRct9SxWzVj9X4SpU916Hy8jYg",
- "publicKey": "77224be9d052343b1d17156a1e463625c0d746468d4f5a44cddd452365b1d4ed"
- },
- "ocrKeyBundle": {
- "bundleID": "8e563a16ec5a802345b162d0f31149e8d5055014a31847d7b20d6de500aa48bd",
- "configPublicKey": "c812eab2415f45cc1d2afdb2be2e3ea419bb7851acfc30c07b4df42c856e8f74",
- "offchainPublicKey": "2a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde",
- "onchainSigningAddress": "a6f35436cb7bffd615cc47a0a04aa0a78696a144"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:39:26.24249Z"
- },
- {
- "id": "73",
- "keys": [
- "keystone-03",
- "keystone-bt-03"
- ],
- "name": "Chainlink Keystone Node Operator 3",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "786",
- "name": "Chainlink Sepolia Prod Keystone One 3",
- "publicKey": "487901e0c0a9d3c66e7cfc50f3a9e3cdbfdf1b0107273d73d94a91d278545516",
- "chainConfigs": [
- {
- "network": {
- "id": "1417",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT",
- "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6"
- },
- "ocrKeyBundle": {
- "bundleID": "5811a96a0c3b5f5b52973eee10e5771cf5953d37d5616ea71f7ae76f09f6e332",
- "configPublicKey": "a7f3435bfbaabebd1572142ff1aec9ed98758d9bb098f1fcc77262fcae7f4171",
- "offchainPublicKey": "886044b333af681ab4bf3be663122524ece9725e110ac2a64cda8526cad6983e",
- "onchainSigningAddress": "046faf34ebfe42510251e6098bc34fa3dd5f2de38ac07e47f2d1b34ac770639f"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x3Be73A57a36E5ab00DcceD755B4bfF8bb99e52b2",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT",
- "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6"
- },
- "ocrKeyBundle": {
- "bundleID": "8843b5db0608f92dac38ca56775766a08db9ee82224a19595d04bd6c58b38fbd",
- "configPublicKey": "63375a3d175364bd299e7cecf352cb3e469dd30116cf1418f2b7571fb46c4a4b",
- "offchainPublicKey": "b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed55709127",
- "onchainSigningAddress": "6607c140e558631407f33bafbabd103863cee876"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xA9eFB53c513E413762b2Be5299D161d8E6e7278e",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCcVLytqinD8xMn27NvomcQhj2mqMVzyGemz6oPwv1SMT",
- "publicKey": "298834a041a056df58c839cb53d99b78558693042e54dff238f504f16d18d4b6"
- },
- "ocrKeyBundle": {
- "bundleID": "8843b5db0608f92dac38ca56775766a08db9ee82224a19595d04bd6c58b38fbd",
- "configPublicKey": "63375a3d175364bd299e7cecf352cb3e469dd30116cf1418f2b7571fb46c4a4b",
- "offchainPublicKey": "b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed55709127",
- "onchainSigningAddress": "6607c140e558631407f33bafbabd103863cee876"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:40:30.499914Z"
- },
- {
- "id": "74",
- "keys": [
- "keystone-02",
- "keystone-bt-02"
- ],
- "name": "Chainlink Keystone Node Operator 2",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "787",
- "name": "Chainlink Sepolia Prod Keystone One 2",
- "publicKey": "7a166fbc816eb4a4dcb620d11c3ccac5c085d56b1972374100116f87619debb8",
- "chainConfigs": [
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x693bf95A3ef46E5dABe17d1A89dB1E83948aeD88",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo",
- "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c"
- },
- "ocrKeyBundle": {
- "bundleID": "1d20490fe469dd6af3d418cc310a6e835181fa13e8dc80156bcbe302b7afcd34",
- "configPublicKey": "ee466234b3b2f65b13c848b17aa6a8d4e0aa0311d3bf8e77a64f20b04ed48d39",
- "offchainPublicKey": "dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3",
- "onchainSigningAddress": "d4dcc573e9d24a8b27a07bba670ba3a2ab36e5bb"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "1408",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo",
- "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c"
- },
- "ocrKeyBundle": {
- "bundleID": "e57c608a899d80e510913d2c7ef55758ee81e9eb73eb531003af1564307fd133",
- "configPublicKey": "412a4bed6b064c17168871d28dbb965cc0a898f7b19eb3fa7cd01d3e3d10b66c",
- "offchainPublicKey": "450aa794c87198a595761a8c18f0f1590046c8092960036638d002256af95254",
- "onchainSigningAddress": "ba20d3da9b07663f1e8039081a514649fd61a48be2d241bc63537ee47d028fcd"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0xCea84bC1881F3cE14BA13Dc3a00DC1Ff3D553fF0",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWGDmBKZ7B3PynGrvfHTJMEecpjfHts9YK5NWk8oJuxcAo",
- "publicKey": "5f247f61a6d5bfdd1d5064db0bd25fe443648133c6131975edb23481424e3d9c"
- },
- "ocrKeyBundle": {
- "bundleID": "1d20490fe469dd6af3d418cc310a6e835181fa13e8dc80156bcbe302b7afcd34",
- "configPublicKey": "ee466234b3b2f65b13c848b17aa6a8d4e0aa0311d3bf8e77a64f20b04ed48d39",
- "offchainPublicKey": "dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3",
- "onchainSigningAddress": "d4dcc573e9d24a8b27a07bba670ba3a2ab36e5bb"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:41:33.205484Z"
- },
- {
- "id": "75",
- "keys": [
- "keystone-01",
- "keystone-bt-01"
- ],
- "name": "Chainlink Keystone Node Operator 1",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "788",
- "name": "Chainlink Sepolia Prod Keystone One 1",
- "publicKey": "28b91143ec9111796a7d63e14c1cf6bb01b4ed59667ab54f5bc72ebe49c881be",
- "chainConfigs": [
- {
- "network": {
- "id": "1409",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v",
- "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3"
- },
- "ocrKeyBundle": {
- "bundleID": "4b6418b8ab88ea1244c3c48eb5f4c86f9f0301aebffcac4fcfac5cdfb7cf6933",
- "configPublicKey": "a38dbe521643479d78ab5477cae78161a5de0030c95098e3fbb09add6aca9508",
- "offchainPublicKey": "7718dcbf40173dbd876720aa64028a6b18bf9a87543fc83a549515c4937962e3",
- "onchainSigningAddress": "247d0189f65f58be83a4e7d87ff338aaf8956e9acb9fcc783f34f9edc29d1b40"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0xe45a754B30FdE9852A826F58c6bd94Fa6554CE96",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v",
- "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3"
- },
- "ocrKeyBundle": {
- "bundleID": "7a9b75510b8d09932b98142419bef52436ff725dd9395469473b487ef87fdfb0",
- "configPublicKey": "2c45fec2320f6bcd36444529a86d9f8b4439499a5d8272dec9bcbbebb5e1bf01",
- "offchainPublicKey": "255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8",
- "onchainSigningAddress": "8258f4c4761cc445333017608044a204fd0c006a"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x415aa1E9a1bcB3929ed92bFa1F9735Dc0D45AD31",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWCbDiL7sP9BVby5KaZqPpaVP1RBokoa9ShzH5WhkYX46v",
- "publicKey": "2934f31f278e5c60618f85861bd6add54a4525d79a642019bdc87d75d26372c3"
- },
- "ocrKeyBundle": {
- "bundleID": "7a9b75510b8d09932b98142419bef52436ff725dd9395469473b487ef87fdfb0",
- "configPublicKey": "2c45fec2320f6bcd36444529a86d9f8b4439499a5d8272dec9bcbbebb5e1bf01",
- "offchainPublicKey": "255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8",
- "onchainSigningAddress": "8258f4c4761cc445333017608044a204fd0c006a"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:42:05.709664Z"
- },
- {
- "id": "76",
- "keys": [
- "keystone-00",
- "keystone-bt-00"
- ],
- "name": "Chainlink Keystone Node Operator 0",
- "metadata": {
- "nodeCount": 3,
- "jobCount": 5
- },
- "nodes": [
- {
- "id": "789",
- "name": "Chainlink Sepolia Prod Keystone One 0",
- "publicKey": "403b72f0b1b3b5f5a91bcfedb7f28599767502a04b5b7e067fcf3782e23eeb9c",
- "chainConfigs": [
- {
- "network": {
- "id": "1411",
- "chainID": "2",
- "chainType": "APTOS",
- "name": "APTOS TEST"
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv",
- "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b"
- },
- "ocrKeyBundle": {
- "bundleID": "b4504e84ea307cc2afffca0206bd4bf8e98acc5a03c9bd47b2456e3845a5d1fa",
- "configPublicKey": "559ea4ee5774a31d97914a4220d6a47094ae8e2cf0806e80e1eacd851f3e6757",
- "offchainPublicKey": "4ec55bbe76a6b1fdc885c59da85a8fe44cf06afe1e4719f0824a731937526c52",
- "onchainSigningAddress": "b8834eaa062f0df4ccfe7832253920071ec14dc4f78b13ecdda10b824e2dd3b6"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "140",
- "chainID": "421614",
- "chainType": "EVM",
- "name": "Arbitrum Testnet (Sepolia)"
- },
- "accountAddress": "0x1a04C6b4b1A45D20356F93DcE7931F765955BAa7",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv",
- "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b"
- },
- "ocrKeyBundle": {
- "bundleID": "665a101d79d310cb0a5ebf695b06e8fc8082b5cbe62d7d362d80d47447a31fea",
- "configPublicKey": "5193f72fc7b4323a86088fb0acb4e4494ae351920b3944bd726a59e8dbcdd45f",
- "offchainPublicKey": "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1",
- "onchainSigningAddress": "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442"
- },
- "plugins": {}
- }
- },
- {
- "network": {
- "id": "129",
- "chainID": "11155111",
- "chainType": "EVM",
- "name": "Ethereum Testnet (Sepolia)"
- },
- "accountAddress": "0x2877F08d9c5Cc9F401F730Fa418fAE563A9a2FF3",
- "adminAddress": "0x0000000000000000000000000000000000000000",
- "ocr1Config": {
- "p2pKeyBundle": {},
- "ocrKeyBundle": {}
- },
- "ocr2Config": {
- "enabled": true,
- "p2pKeyBundle": {
- "peerID": "p2p_12D3KooWMWUKdoAc2ruZf9f55p7NVFj7AFiPm67xjQ8BZBwkqyYv",
- "publicKey": "adb6bf005cdb23f21e11b82d66b9f62628c2939640ed93028bf0dad3923c5a8b"
- },
- "ocrKeyBundle": {
- "bundleID": "665a101d79d310cb0a5ebf695b06e8fc8082b5cbe62d7d362d80d47447a31fea",
- "configPublicKey": "5193f72fc7b4323a86088fb0acb4e4494ae351920b3944bd726a59e8dbcdd45f",
- "offchainPublicKey": "03dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1",
- "onchainSigningAddress": "b35409a8d4f9a18da55c5b2bb08a3f5f68d44442"
- },
- "plugins": {}
- }
- }
- ],
- "connected": true,
- "supportedProducts": [
- "WORKFLOW",
- "OCR3_CAPABILITY"
- ],
- "categories": [
- {
- "id": "11",
- "name": "Keystone"
- }
- ]
- }
- ],
- "createdAt": "2024-08-14T20:42:49.446864Z"
- }
-]
diff --git a/deployment/mocks/offchain_client_mock.go b/deployment/mocks/offchain_client_mock.go
new file mode 100644
index 00000000000..de7a6df3a0d
--- /dev/null
+++ b/deployment/mocks/offchain_client_mock.go
@@ -0,0 +1,1375 @@
+// Code generated by mockery v2.46.3. DO NOT EDIT.
+
+package deployment
+
+import (
+ context "context"
+
+ csa "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/csa"
+ grpc "google.golang.org/grpc"
+
+ job "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job"
+
+ mock "github.com/stretchr/testify/mock"
+
+ node "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node"
+)
+
+// MockOffchainClient is an autogenerated mock type for the OffchainClient type
+type MockOffchainClient struct {
+ mock.Mock
+}
+
+type MockOffchainClient_Expecter struct {
+ mock *mock.Mock
+}
+
+func (_m *MockOffchainClient) EXPECT() *MockOffchainClient_Expecter {
+ return &MockOffchainClient_Expecter{mock: &_m.Mock}
+}
+
+// BatchProposeJob provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) BatchProposeJob(ctx context.Context, in *job.BatchProposeJobRequest, opts ...grpc.CallOption) (*job.BatchProposeJobResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for BatchProposeJob")
+ }
+
+ var r0 *job.BatchProposeJobResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.BatchProposeJobRequest, ...grpc.CallOption) (*job.BatchProposeJobResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.BatchProposeJobRequest, ...grpc.CallOption) *job.BatchProposeJobResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.BatchProposeJobResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.BatchProposeJobRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_BatchProposeJob_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BatchProposeJob'
+type MockOffchainClient_BatchProposeJob_Call struct {
+ *mock.Call
+}
+
+// BatchProposeJob is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.BatchProposeJobRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) BatchProposeJob(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_BatchProposeJob_Call {
+ return &MockOffchainClient_BatchProposeJob_Call{Call: _e.mock.On("BatchProposeJob",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_BatchProposeJob_Call) Run(run func(ctx context.Context, in *job.BatchProposeJobRequest, opts ...grpc.CallOption)) *MockOffchainClient_BatchProposeJob_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.BatchProposeJobRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_BatchProposeJob_Call) Return(_a0 *job.BatchProposeJobResponse, _a1 error) *MockOffchainClient_BatchProposeJob_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_BatchProposeJob_Call) RunAndReturn(run func(context.Context, *job.BatchProposeJobRequest, ...grpc.CallOption) (*job.BatchProposeJobResponse, error)) *MockOffchainClient_BatchProposeJob_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// DeleteJob provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) DeleteJob(ctx context.Context, in *job.DeleteJobRequest, opts ...grpc.CallOption) (*job.DeleteJobResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for DeleteJob")
+ }
+
+ var r0 *job.DeleteJobResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.DeleteJobRequest, ...grpc.CallOption) (*job.DeleteJobResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.DeleteJobRequest, ...grpc.CallOption) *job.DeleteJobResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.DeleteJobResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.DeleteJobRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_DeleteJob_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteJob'
+type MockOffchainClient_DeleteJob_Call struct {
+ *mock.Call
+}
+
+// DeleteJob is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.DeleteJobRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) DeleteJob(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_DeleteJob_Call {
+ return &MockOffchainClient_DeleteJob_Call{Call: _e.mock.On("DeleteJob",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_DeleteJob_Call) Run(run func(ctx context.Context, in *job.DeleteJobRequest, opts ...grpc.CallOption)) *MockOffchainClient_DeleteJob_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.DeleteJobRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_DeleteJob_Call) Return(_a0 *job.DeleteJobResponse, _a1 error) *MockOffchainClient_DeleteJob_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_DeleteJob_Call) RunAndReturn(run func(context.Context, *job.DeleteJobRequest, ...grpc.CallOption) (*job.DeleteJobResponse, error)) *MockOffchainClient_DeleteJob_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// DisableNode provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) DisableNode(ctx context.Context, in *node.DisableNodeRequest, opts ...grpc.CallOption) (*node.DisableNodeResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for DisableNode")
+ }
+
+ var r0 *node.DisableNodeResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *node.DisableNodeRequest, ...grpc.CallOption) (*node.DisableNodeResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *node.DisableNodeRequest, ...grpc.CallOption) *node.DisableNodeResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*node.DisableNodeResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *node.DisableNodeRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_DisableNode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DisableNode'
+type MockOffchainClient_DisableNode_Call struct {
+ *mock.Call
+}
+
+// DisableNode is a helper method to define mock.On call
+// - ctx context.Context
+// - in *node.DisableNodeRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) DisableNode(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_DisableNode_Call {
+ return &MockOffchainClient_DisableNode_Call{Call: _e.mock.On("DisableNode",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_DisableNode_Call) Run(run func(ctx context.Context, in *node.DisableNodeRequest, opts ...grpc.CallOption)) *MockOffchainClient_DisableNode_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*node.DisableNodeRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_DisableNode_Call) Return(_a0 *node.DisableNodeResponse, _a1 error) *MockOffchainClient_DisableNode_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_DisableNode_Call) RunAndReturn(run func(context.Context, *node.DisableNodeRequest, ...grpc.CallOption) (*node.DisableNodeResponse, error)) *MockOffchainClient_DisableNode_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// EnableNode provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) EnableNode(ctx context.Context, in *node.EnableNodeRequest, opts ...grpc.CallOption) (*node.EnableNodeResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for EnableNode")
+ }
+
+ var r0 *node.EnableNodeResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *node.EnableNodeRequest, ...grpc.CallOption) (*node.EnableNodeResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *node.EnableNodeRequest, ...grpc.CallOption) *node.EnableNodeResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*node.EnableNodeResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *node.EnableNodeRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_EnableNode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnableNode'
+type MockOffchainClient_EnableNode_Call struct {
+ *mock.Call
+}
+
+// EnableNode is a helper method to define mock.On call
+// - ctx context.Context
+// - in *node.EnableNodeRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) EnableNode(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_EnableNode_Call {
+ return &MockOffchainClient_EnableNode_Call{Call: _e.mock.On("EnableNode",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_EnableNode_Call) Run(run func(ctx context.Context, in *node.EnableNodeRequest, opts ...grpc.CallOption)) *MockOffchainClient_EnableNode_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*node.EnableNodeRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_EnableNode_Call) Return(_a0 *node.EnableNodeResponse, _a1 error) *MockOffchainClient_EnableNode_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_EnableNode_Call) RunAndReturn(run func(context.Context, *node.EnableNodeRequest, ...grpc.CallOption) (*node.EnableNodeResponse, error)) *MockOffchainClient_EnableNode_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// GetJob provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) GetJob(ctx context.Context, in *job.GetJobRequest, opts ...grpc.CallOption) (*job.GetJobResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetJob")
+ }
+
+ var r0 *job.GetJobResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.GetJobRequest, ...grpc.CallOption) (*job.GetJobResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.GetJobRequest, ...grpc.CallOption) *job.GetJobResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.GetJobResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.GetJobRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_GetJob_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetJob'
+type MockOffchainClient_GetJob_Call struct {
+ *mock.Call
+}
+
+// GetJob is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.GetJobRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) GetJob(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_GetJob_Call {
+ return &MockOffchainClient_GetJob_Call{Call: _e.mock.On("GetJob",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_GetJob_Call) Run(run func(ctx context.Context, in *job.GetJobRequest, opts ...grpc.CallOption)) *MockOffchainClient_GetJob_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.GetJobRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_GetJob_Call) Return(_a0 *job.GetJobResponse, _a1 error) *MockOffchainClient_GetJob_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_GetJob_Call) RunAndReturn(run func(context.Context, *job.GetJobRequest, ...grpc.CallOption) (*job.GetJobResponse, error)) *MockOffchainClient_GetJob_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// GetKeypair provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) GetKeypair(ctx context.Context, in *csa.GetKeypairRequest, opts ...grpc.CallOption) (*csa.GetKeypairResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetKeypair")
+ }
+
+ var r0 *csa.GetKeypairResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *csa.GetKeypairRequest, ...grpc.CallOption) (*csa.GetKeypairResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *csa.GetKeypairRequest, ...grpc.CallOption) *csa.GetKeypairResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*csa.GetKeypairResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *csa.GetKeypairRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_GetKeypair_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetKeypair'
+type MockOffchainClient_GetKeypair_Call struct {
+ *mock.Call
+}
+
+// GetKeypair is a helper method to define mock.On call
+// - ctx context.Context
+// - in *csa.GetKeypairRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) GetKeypair(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_GetKeypair_Call {
+ return &MockOffchainClient_GetKeypair_Call{Call: _e.mock.On("GetKeypair",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_GetKeypair_Call) Run(run func(ctx context.Context, in *csa.GetKeypairRequest, opts ...grpc.CallOption)) *MockOffchainClient_GetKeypair_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*csa.GetKeypairRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_GetKeypair_Call) Return(_a0 *csa.GetKeypairResponse, _a1 error) *MockOffchainClient_GetKeypair_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_GetKeypair_Call) RunAndReturn(run func(context.Context, *csa.GetKeypairRequest, ...grpc.CallOption) (*csa.GetKeypairResponse, error)) *MockOffchainClient_GetKeypair_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// GetNode provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) GetNode(ctx context.Context, in *node.GetNodeRequest, opts ...grpc.CallOption) (*node.GetNodeResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetNode")
+ }
+
+ var r0 *node.GetNodeResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *node.GetNodeRequest, ...grpc.CallOption) (*node.GetNodeResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *node.GetNodeRequest, ...grpc.CallOption) *node.GetNodeResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*node.GetNodeResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *node.GetNodeRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_GetNode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNode'
+type MockOffchainClient_GetNode_Call struct {
+ *mock.Call
+}
+
+// GetNode is a helper method to define mock.On call
+// - ctx context.Context
+// - in *node.GetNodeRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) GetNode(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_GetNode_Call {
+ return &MockOffchainClient_GetNode_Call{Call: _e.mock.On("GetNode",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_GetNode_Call) Run(run func(ctx context.Context, in *node.GetNodeRequest, opts ...grpc.CallOption)) *MockOffchainClient_GetNode_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*node.GetNodeRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_GetNode_Call) Return(_a0 *node.GetNodeResponse, _a1 error) *MockOffchainClient_GetNode_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_GetNode_Call) RunAndReturn(run func(context.Context, *node.GetNodeRequest, ...grpc.CallOption) (*node.GetNodeResponse, error)) *MockOffchainClient_GetNode_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// GetProposal provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) GetProposal(ctx context.Context, in *job.GetProposalRequest, opts ...grpc.CallOption) (*job.GetProposalResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetProposal")
+ }
+
+ var r0 *job.GetProposalResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.GetProposalRequest, ...grpc.CallOption) (*job.GetProposalResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.GetProposalRequest, ...grpc.CallOption) *job.GetProposalResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.GetProposalResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.GetProposalRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_GetProposal_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProposal'
+type MockOffchainClient_GetProposal_Call struct {
+ *mock.Call
+}
+
+// GetProposal is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.GetProposalRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) GetProposal(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_GetProposal_Call {
+ return &MockOffchainClient_GetProposal_Call{Call: _e.mock.On("GetProposal",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_GetProposal_Call) Run(run func(ctx context.Context, in *job.GetProposalRequest, opts ...grpc.CallOption)) *MockOffchainClient_GetProposal_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.GetProposalRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_GetProposal_Call) Return(_a0 *job.GetProposalResponse, _a1 error) *MockOffchainClient_GetProposal_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_GetProposal_Call) RunAndReturn(run func(context.Context, *job.GetProposalRequest, ...grpc.CallOption) (*job.GetProposalResponse, error)) *MockOffchainClient_GetProposal_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// ListJobs provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) ListJobs(ctx context.Context, in *job.ListJobsRequest, opts ...grpc.CallOption) (*job.ListJobsResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ListJobs")
+ }
+
+ var r0 *job.ListJobsResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.ListJobsRequest, ...grpc.CallOption) (*job.ListJobsResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.ListJobsRequest, ...grpc.CallOption) *job.ListJobsResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.ListJobsResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.ListJobsRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_ListJobs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListJobs'
+type MockOffchainClient_ListJobs_Call struct {
+ *mock.Call
+}
+
+// ListJobs is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.ListJobsRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) ListJobs(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_ListJobs_Call {
+ return &MockOffchainClient_ListJobs_Call{Call: _e.mock.On("ListJobs",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_ListJobs_Call) Run(run func(ctx context.Context, in *job.ListJobsRequest, opts ...grpc.CallOption)) *MockOffchainClient_ListJobs_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.ListJobsRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_ListJobs_Call) Return(_a0 *job.ListJobsResponse, _a1 error) *MockOffchainClient_ListJobs_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_ListJobs_Call) RunAndReturn(run func(context.Context, *job.ListJobsRequest, ...grpc.CallOption) (*job.ListJobsResponse, error)) *MockOffchainClient_ListJobs_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// ListKeypairs provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) ListKeypairs(ctx context.Context, in *csa.ListKeypairsRequest, opts ...grpc.CallOption) (*csa.ListKeypairsResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ListKeypairs")
+ }
+
+ var r0 *csa.ListKeypairsResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *csa.ListKeypairsRequest, ...grpc.CallOption) (*csa.ListKeypairsResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *csa.ListKeypairsRequest, ...grpc.CallOption) *csa.ListKeypairsResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*csa.ListKeypairsResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *csa.ListKeypairsRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_ListKeypairs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListKeypairs'
+type MockOffchainClient_ListKeypairs_Call struct {
+ *mock.Call
+}
+
+// ListKeypairs is a helper method to define mock.On call
+// - ctx context.Context
+// - in *csa.ListKeypairsRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) ListKeypairs(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_ListKeypairs_Call {
+ return &MockOffchainClient_ListKeypairs_Call{Call: _e.mock.On("ListKeypairs",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_ListKeypairs_Call) Run(run func(ctx context.Context, in *csa.ListKeypairsRequest, opts ...grpc.CallOption)) *MockOffchainClient_ListKeypairs_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*csa.ListKeypairsRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_ListKeypairs_Call) Return(_a0 *csa.ListKeypairsResponse, _a1 error) *MockOffchainClient_ListKeypairs_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_ListKeypairs_Call) RunAndReturn(run func(context.Context, *csa.ListKeypairsRequest, ...grpc.CallOption) (*csa.ListKeypairsResponse, error)) *MockOffchainClient_ListKeypairs_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// ListNodeChainConfigs provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) ListNodeChainConfigs(ctx context.Context, in *node.ListNodeChainConfigsRequest, opts ...grpc.CallOption) (*node.ListNodeChainConfigsResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ListNodeChainConfigs")
+ }
+
+ var r0 *node.ListNodeChainConfigsResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *node.ListNodeChainConfigsRequest, ...grpc.CallOption) (*node.ListNodeChainConfigsResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *node.ListNodeChainConfigsRequest, ...grpc.CallOption) *node.ListNodeChainConfigsResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*node.ListNodeChainConfigsResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *node.ListNodeChainConfigsRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_ListNodeChainConfigs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListNodeChainConfigs'
+type MockOffchainClient_ListNodeChainConfigs_Call struct {
+ *mock.Call
+}
+
+// ListNodeChainConfigs is a helper method to define mock.On call
+// - ctx context.Context
+// - in *node.ListNodeChainConfigsRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) ListNodeChainConfigs(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_ListNodeChainConfigs_Call {
+ return &MockOffchainClient_ListNodeChainConfigs_Call{Call: _e.mock.On("ListNodeChainConfigs",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_ListNodeChainConfigs_Call) Run(run func(ctx context.Context, in *node.ListNodeChainConfigsRequest, opts ...grpc.CallOption)) *MockOffchainClient_ListNodeChainConfigs_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*node.ListNodeChainConfigsRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_ListNodeChainConfigs_Call) Return(_a0 *node.ListNodeChainConfigsResponse, _a1 error) *MockOffchainClient_ListNodeChainConfigs_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_ListNodeChainConfigs_Call) RunAndReturn(run func(context.Context, *node.ListNodeChainConfigsRequest, ...grpc.CallOption) (*node.ListNodeChainConfigsResponse, error)) *MockOffchainClient_ListNodeChainConfigs_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// ListNodes provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) ListNodes(ctx context.Context, in *node.ListNodesRequest, opts ...grpc.CallOption) (*node.ListNodesResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ListNodes")
+ }
+
+ var r0 *node.ListNodesResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *node.ListNodesRequest, ...grpc.CallOption) (*node.ListNodesResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *node.ListNodesRequest, ...grpc.CallOption) *node.ListNodesResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*node.ListNodesResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *node.ListNodesRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_ListNodes_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListNodes'
+type MockOffchainClient_ListNodes_Call struct {
+ *mock.Call
+}
+
+// ListNodes is a helper method to define mock.On call
+// - ctx context.Context
+// - in *node.ListNodesRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) ListNodes(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_ListNodes_Call {
+ return &MockOffchainClient_ListNodes_Call{Call: _e.mock.On("ListNodes",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_ListNodes_Call) Run(run func(ctx context.Context, in *node.ListNodesRequest, opts ...grpc.CallOption)) *MockOffchainClient_ListNodes_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*node.ListNodesRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_ListNodes_Call) Return(_a0 *node.ListNodesResponse, _a1 error) *MockOffchainClient_ListNodes_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_ListNodes_Call) RunAndReturn(run func(context.Context, *node.ListNodesRequest, ...grpc.CallOption) (*node.ListNodesResponse, error)) *MockOffchainClient_ListNodes_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// ListProposals provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) ListProposals(ctx context.Context, in *job.ListProposalsRequest, opts ...grpc.CallOption) (*job.ListProposalsResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ListProposals")
+ }
+
+ var r0 *job.ListProposalsResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.ListProposalsRequest, ...grpc.CallOption) (*job.ListProposalsResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.ListProposalsRequest, ...grpc.CallOption) *job.ListProposalsResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.ListProposalsResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.ListProposalsRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_ListProposals_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListProposals'
+type MockOffchainClient_ListProposals_Call struct {
+ *mock.Call
+}
+
+// ListProposals is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.ListProposalsRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) ListProposals(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_ListProposals_Call {
+ return &MockOffchainClient_ListProposals_Call{Call: _e.mock.On("ListProposals",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_ListProposals_Call) Run(run func(ctx context.Context, in *job.ListProposalsRequest, opts ...grpc.CallOption)) *MockOffchainClient_ListProposals_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.ListProposalsRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_ListProposals_Call) Return(_a0 *job.ListProposalsResponse, _a1 error) *MockOffchainClient_ListProposals_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_ListProposals_Call) RunAndReturn(run func(context.Context, *job.ListProposalsRequest, ...grpc.CallOption) (*job.ListProposalsResponse, error)) *MockOffchainClient_ListProposals_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// ProposeJob provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) ProposeJob(ctx context.Context, in *job.ProposeJobRequest, opts ...grpc.CallOption) (*job.ProposeJobResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ProposeJob")
+ }
+
+ var r0 *job.ProposeJobResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.ProposeJobRequest, ...grpc.CallOption) (*job.ProposeJobResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.ProposeJobRequest, ...grpc.CallOption) *job.ProposeJobResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.ProposeJobResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.ProposeJobRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_ProposeJob_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProposeJob'
+type MockOffchainClient_ProposeJob_Call struct {
+ *mock.Call
+}
+
+// ProposeJob is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.ProposeJobRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) ProposeJob(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_ProposeJob_Call {
+ return &MockOffchainClient_ProposeJob_Call{Call: _e.mock.On("ProposeJob",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_ProposeJob_Call) Run(run func(ctx context.Context, in *job.ProposeJobRequest, opts ...grpc.CallOption)) *MockOffchainClient_ProposeJob_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.ProposeJobRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_ProposeJob_Call) Return(_a0 *job.ProposeJobResponse, _a1 error) *MockOffchainClient_ProposeJob_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_ProposeJob_Call) RunAndReturn(run func(context.Context, *job.ProposeJobRequest, ...grpc.CallOption) (*job.ProposeJobResponse, error)) *MockOffchainClient_ProposeJob_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// RegisterNode provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) RegisterNode(ctx context.Context, in *node.RegisterNodeRequest, opts ...grpc.CallOption) (*node.RegisterNodeResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for RegisterNode")
+ }
+
+ var r0 *node.RegisterNodeResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *node.RegisterNodeRequest, ...grpc.CallOption) (*node.RegisterNodeResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *node.RegisterNodeRequest, ...grpc.CallOption) *node.RegisterNodeResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*node.RegisterNodeResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *node.RegisterNodeRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_RegisterNode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegisterNode'
+type MockOffchainClient_RegisterNode_Call struct {
+ *mock.Call
+}
+
+// RegisterNode is a helper method to define mock.On call
+// - ctx context.Context
+// - in *node.RegisterNodeRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) RegisterNode(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_RegisterNode_Call {
+ return &MockOffchainClient_RegisterNode_Call{Call: _e.mock.On("RegisterNode",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_RegisterNode_Call) Run(run func(ctx context.Context, in *node.RegisterNodeRequest, opts ...grpc.CallOption)) *MockOffchainClient_RegisterNode_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*node.RegisterNodeRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_RegisterNode_Call) Return(_a0 *node.RegisterNodeResponse, _a1 error) *MockOffchainClient_RegisterNode_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_RegisterNode_Call) RunAndReturn(run func(context.Context, *node.RegisterNodeRequest, ...grpc.CallOption) (*node.RegisterNodeResponse, error)) *MockOffchainClient_RegisterNode_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// RevokeJob provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) RevokeJob(ctx context.Context, in *job.RevokeJobRequest, opts ...grpc.CallOption) (*job.RevokeJobResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for RevokeJob")
+ }
+
+ var r0 *job.RevokeJobResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.RevokeJobRequest, ...grpc.CallOption) (*job.RevokeJobResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.RevokeJobRequest, ...grpc.CallOption) *job.RevokeJobResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.RevokeJobResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.RevokeJobRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_RevokeJob_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RevokeJob'
+type MockOffchainClient_RevokeJob_Call struct {
+ *mock.Call
+}
+
+// RevokeJob is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.RevokeJobRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) RevokeJob(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_RevokeJob_Call {
+ return &MockOffchainClient_RevokeJob_Call{Call: _e.mock.On("RevokeJob",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_RevokeJob_Call) Run(run func(ctx context.Context, in *job.RevokeJobRequest, opts ...grpc.CallOption)) *MockOffchainClient_RevokeJob_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.RevokeJobRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_RevokeJob_Call) Return(_a0 *job.RevokeJobResponse, _a1 error) *MockOffchainClient_RevokeJob_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_RevokeJob_Call) RunAndReturn(run func(context.Context, *job.RevokeJobRequest, ...grpc.CallOption) (*job.RevokeJobResponse, error)) *MockOffchainClient_RevokeJob_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// UpdateJob provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) UpdateJob(ctx context.Context, in *job.UpdateJobRequest, opts ...grpc.CallOption) (*job.UpdateJobResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for UpdateJob")
+ }
+
+ var r0 *job.UpdateJobResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *job.UpdateJobRequest, ...grpc.CallOption) (*job.UpdateJobResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *job.UpdateJobRequest, ...grpc.CallOption) *job.UpdateJobResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*job.UpdateJobResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *job.UpdateJobRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_UpdateJob_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateJob'
+type MockOffchainClient_UpdateJob_Call struct {
+ *mock.Call
+}
+
+// UpdateJob is a helper method to define mock.On call
+// - ctx context.Context
+// - in *job.UpdateJobRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) UpdateJob(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_UpdateJob_Call {
+ return &MockOffchainClient_UpdateJob_Call{Call: _e.mock.On("UpdateJob",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_UpdateJob_Call) Run(run func(ctx context.Context, in *job.UpdateJobRequest, opts ...grpc.CallOption)) *MockOffchainClient_UpdateJob_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*job.UpdateJobRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_UpdateJob_Call) Return(_a0 *job.UpdateJobResponse, _a1 error) *MockOffchainClient_UpdateJob_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_UpdateJob_Call) RunAndReturn(run func(context.Context, *job.UpdateJobRequest, ...grpc.CallOption) (*job.UpdateJobResponse, error)) *MockOffchainClient_UpdateJob_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// UpdateNode provides a mock function with given fields: ctx, in, opts
+func (_m *MockOffchainClient) UpdateNode(ctx context.Context, in *node.UpdateNodeRequest, opts ...grpc.CallOption) (*node.UpdateNodeResponse, error) {
+ _va := make([]interface{}, len(opts))
+ for _i := range opts {
+ _va[_i] = opts[_i]
+ }
+ var _ca []interface{}
+ _ca = append(_ca, ctx, in)
+ _ca = append(_ca, _va...)
+ ret := _m.Called(_ca...)
+
+ if len(ret) == 0 {
+ panic("no return value specified for UpdateNode")
+ }
+
+ var r0 *node.UpdateNodeResponse
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *node.UpdateNodeRequest, ...grpc.CallOption) (*node.UpdateNodeResponse, error)); ok {
+ return rf(ctx, in, opts...)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *node.UpdateNodeRequest, ...grpc.CallOption) *node.UpdateNodeResponse); ok {
+ r0 = rf(ctx, in, opts...)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*node.UpdateNodeResponse)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *node.UpdateNodeRequest, ...grpc.CallOption) error); ok {
+ r1 = rf(ctx, in, opts...)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// MockOffchainClient_UpdateNode_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateNode'
+type MockOffchainClient_UpdateNode_Call struct {
+ *mock.Call
+}
+
+// UpdateNode is a helper method to define mock.On call
+// - ctx context.Context
+// - in *node.UpdateNodeRequest
+// - opts ...grpc.CallOption
+func (_e *MockOffchainClient_Expecter) UpdateNode(ctx interface{}, in interface{}, opts ...interface{}) *MockOffchainClient_UpdateNode_Call {
+ return &MockOffchainClient_UpdateNode_Call{Call: _e.mock.On("UpdateNode",
+ append([]interface{}{ctx, in}, opts...)...)}
+}
+
+func (_c *MockOffchainClient_UpdateNode_Call) Run(run func(ctx context.Context, in *node.UpdateNodeRequest, opts ...grpc.CallOption)) *MockOffchainClient_UpdateNode_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ variadicArgs := make([]grpc.CallOption, len(args)-2)
+ for i, a := range args[2:] {
+ if a != nil {
+ variadicArgs[i] = a.(grpc.CallOption)
+ }
+ }
+ run(args[0].(context.Context), args[1].(*node.UpdateNodeRequest), variadicArgs...)
+ })
+ return _c
+}
+
+func (_c *MockOffchainClient_UpdateNode_Call) Return(_a0 *node.UpdateNodeResponse, _a1 error) *MockOffchainClient_UpdateNode_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *MockOffchainClient_UpdateNode_Call) RunAndReturn(run func(context.Context, *node.UpdateNodeRequest, ...grpc.CallOption) (*node.UpdateNodeResponse, error)) *MockOffchainClient_UpdateNode_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// NewMockOffchainClient creates a new instance of MockOffchainClient. 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 NewMockOffchainClient(t interface {
+ mock.TestingT
+ Cleanup(func())
+}) *MockOffchainClient {
+ mock := &MockOffchainClient{}
+ mock.Mock.Test(t)
+
+ t.Cleanup(func() { mock.AssertExpectations(t) })
+
+ return mock
+}
diff --git a/deployment/multiclient.go b/deployment/multiclient.go
index f1ac2f3c310..9765e0368ea 100644
--- a/deployment/multiclient.go
+++ b/deployment/multiclient.go
@@ -109,16 +109,16 @@ func (mc *MultiClient) NonceAt(ctx context.Context, account common.Address, bloc
}
func (mc *MultiClient) WaitMined(ctx context.Context, tx *types.Transaction) (*types.Receipt, error) {
- mc.lggr.Debugf("Waiting for tx %s to be mined", tx.Hash().Hex())
+ mc.lggr.Debugf("Waiting for tx %s to be mined for chain %s", tx.Hash().Hex(), mc.chainName)
// no retries here because we want to wait for the tx to be mined
resultCh := make(chan *types.Receipt)
doneCh := make(chan struct{})
waitMined := func(client *ethclient.Client, tx *types.Transaction) {
- mc.lggr.Debugf("Waiting for tx %s to be mined with client %v", tx.Hash().Hex(), client)
+ mc.lggr.Debugf("Waiting for tx %s to be mined with chain %s", tx.Hash().Hex(), mc.chainName)
receipt, err := bind.WaitMined(ctx, client, tx)
if err != nil {
- mc.lggr.Warnf("WaitMined error %v with client %v", err, client)
+ mc.lggr.Warnf("WaitMined error %v with chain %s", err, mc.chainName)
return
}
select {
@@ -135,6 +135,7 @@ func (mc *MultiClient) WaitMined(ctx context.Context, tx *types.Transaction) (*t
select {
case receipt = <-resultCh:
close(doneCh)
+ mc.lggr.Debugf("Tx %s mined with chain %s", tx.Hash().Hex(), mc.chainName)
return receipt, nil
case <-ctx.Done():
mc.lggr.Warnf("WaitMined context done %v", ctx.Err())
diff --git a/deployment/solana_chain.go b/deployment/solana_chain.go
new file mode 100644
index 00000000000..338642e3e32
--- /dev/null
+++ b/deployment/solana_chain.go
@@ -0,0 +1,5 @@
+package deployment
+
+// SolChain represents a Solana chain.
+type SolChain struct {
+}
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 946703695eb..13ab1548e00 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -2034,6 +2034,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '9m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2138,6 +2139,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2242,6 +2244,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2346,6 +2349,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2451,6 +2455,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '13m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2559,6 +2564,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2663,6 +2669,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2768,6 +2775,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2872,6 +2880,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '45s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -2975,6 +2984,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -3078,6 +3088,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -3182,6 +3193,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '40s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -3287,6 +3299,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '2m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -3391,6 +3404,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -3495,6 +3509,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '6m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 5000
@@ -3574,6 +3589,110 @@ GasLimitDefault = 400000
+Sonic Mainnet (146)
+
+```toml
+AutoCreateKey = true
+BlockBackfillDepth = 10
+BlockBackfillSkip = false
+FinalityDepth = 10
+FinalityTagEnabled = false
+LogBackfillBatchSize = 1000
+LogPollInterval = '1s'
+LogKeepBlocksDepth = 100000
+LogPrunePageSize = 0
+BackupLogPollerBlockDelay = 100
+MinIncomingConfirmations = 5
+MinContractPayment = '0.00001 link'
+NonceAutoSync = true
+NoNewHeadsThreshold = '3m0s'
+LogBroadcasterEnabled = true
+RPCDefaultBatchSize = 100
+RPCBlockQueryDelay = 10
+FinalizedBlockOffset = 0
+NoNewFinalizedHeadsThreshold = '0s'
+
+[Transactions]
+Enabled = true
+ForwardersEnabled = false
+MaxInFlight = 16
+MaxQueued = 500
+ReaperInterval = '1h0m0s'
+ReaperThreshold = '168h0m0s'
+ResendAfterThreshold = '1m0s'
+
+[Transactions.AutoPurge]
+Enabled = false
+
+[BalanceMonitor]
+Enabled = true
+
+[GasEstimator]
+Mode = 'FeeHistory'
+PriceDefault = '20 gwei'
+PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
+PriceMin = '1 gwei'
+LimitDefault = 8000000
+LimitMax = 500000
+LimitMultiplier = '1'
+LimitTransfer = 21000
+EstimateLimit = false
+BumpMin = '5 gwei'
+BumpPercent = 10
+BumpThreshold = 3
+EIP1559DynamicFees = true
+FeeCapDefault = '100 gwei'
+TipCapDefault = '1 wei'
+TipCapMin = '1 wei'
+
+[GasEstimator.BlockHistory]
+BatchSize = 25
+BlockHistorySize = 100
+CheckInclusionBlocks = 12
+CheckInclusionPercentile = 90
+TransactionPercentile = 60
+
+[GasEstimator.FeeHistory]
+CacheTimeout = '2s'
+
+[HeadTracker]
+HistoryDepth = 50
+MaxBufferSize = 3
+SamplingInterval = '1s'
+MaxAllowedFinalityDepth = 10000
+FinalityTagBypass = true
+PersistenceEnabled = true
+
+[NodePool]
+PollFailureThreshold = 5
+PollInterval = '10s'
+SelectionMode = 'HighestHead'
+SyncThreshold = 10
+LeaseDuration = '0s'
+NodeIsSyncingEnabled = false
+FinalizedBlockPollInterval = '5s'
+EnforceRepeatableRead = true
+DeathDeclarationDelay = '1m0s'
+NewHeadsPollInterval = '0s'
+
+[OCR]
+ContractConfirmations = 4
+ContractTransmitterTransmitTimeout = '10s'
+DatabaseTimeout = '10s'
+DeltaCOverride = '168h0m0s'
+DeltaCJitterOverride = '1h0m0s'
+ObservationGracePeriod = '1s'
+
+[OCR2]
+[OCR2.Automation]
+GasLimit = 5400000
+
+[Workflow]
+GasLimitDefault = 400000
+```
+
+
+
XLayer Sepolia (195)
```toml
@@ -3599,6 +3718,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -3704,6 +3824,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -3809,6 +3930,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '1h10m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -3917,6 +4039,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4021,6 +4144,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4129,6 +4253,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4236,6 +4361,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4340,6 +4466,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4444,6 +4571,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4551,6 +4679,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4659,6 +4788,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4767,6 +4897,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '1h30m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4875,6 +5006,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -4978,6 +5110,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5082,6 +5215,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5186,6 +5320,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5291,6 +5426,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '40s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5395,6 +5531,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '40s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5499,6 +5636,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '1h10m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5607,6 +5745,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '45m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5714,6 +5853,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5819,6 +5959,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '2h0m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -5927,6 +6068,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6031,6 +6173,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6135,6 +6278,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6243,6 +6387,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6348,6 +6493,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6452,6 +6598,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '1h30m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6559,6 +6706,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6663,6 +6811,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '15m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6771,6 +6920,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '2m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6876,6 +7026,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -6984,6 +7135,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7092,6 +7244,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7199,6 +7352,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '1m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7303,6 +7457,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '1m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7318,9 +7473,9 @@ Enabled = true
[GasEstimator]
Mode = 'BlockHistory'
-PriceDefault = '25 gwei'
+PriceDefault = '1 gwei'
PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '25 gwei'
+PriceMin = '1 gwei'
LimitDefault = 500000
LimitMax = 500000
LimitMultiplier = '1'
@@ -7407,6 +7562,7 @@ FinalizedBlockOffset = 2
NoNewFinalizedHeadsThreshold = '1m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7422,9 +7578,9 @@ Enabled = true
[GasEstimator]
Mode = 'BlockHistory'
-PriceDefault = '25 gwei'
+PriceDefault = '1 gwei'
PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
-PriceMin = '25 gwei'
+PriceMin = '1 gwei'
LimitDefault = 500000
LimitMax = 500000
LimitMultiplier = '1'
@@ -7511,6 +7667,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '45m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7616,6 +7773,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '15m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7727,6 +7885,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '15m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7812,6 +7971,110 @@ GasLimitDefault = 400000
+Sonic testnet (57054)
+
+```toml
+AutoCreateKey = true
+BlockBackfillDepth = 10
+BlockBackfillSkip = false
+FinalityDepth = 10
+FinalityTagEnabled = false
+LogBackfillBatchSize = 1000
+LogPollInterval = '1s'
+LogKeepBlocksDepth = 100000
+LogPrunePageSize = 0
+BackupLogPollerBlockDelay = 100
+MinIncomingConfirmations = 5
+MinContractPayment = '0.00001 link'
+NonceAutoSync = true
+NoNewHeadsThreshold = '3m0s'
+LogBroadcasterEnabled = true
+RPCDefaultBatchSize = 100
+RPCBlockQueryDelay = 10
+FinalizedBlockOffset = 0
+NoNewFinalizedHeadsThreshold = '0s'
+
+[Transactions]
+Enabled = true
+ForwardersEnabled = false
+MaxInFlight = 16
+MaxQueued = 500
+ReaperInterval = '1h0m0s'
+ReaperThreshold = '168h0m0s'
+ResendAfterThreshold = '1m0s'
+
+[Transactions.AutoPurge]
+Enabled = false
+
+[BalanceMonitor]
+Enabled = true
+
+[GasEstimator]
+Mode = 'FeeHistory'
+PriceDefault = '20 gwei'
+PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
+PriceMin = '1 gwei'
+LimitDefault = 8000000
+LimitMax = 500000
+LimitMultiplier = '1'
+LimitTransfer = 21000
+EstimateLimit = false
+BumpMin = '5 gwei'
+BumpPercent = 10
+BumpThreshold = 3
+EIP1559DynamicFees = true
+FeeCapDefault = '100 gwei'
+TipCapDefault = '1 wei'
+TipCapMin = '1 wei'
+
+[GasEstimator.BlockHistory]
+BatchSize = 25
+BlockHistorySize = 100
+CheckInclusionBlocks = 12
+CheckInclusionPercentile = 90
+TransactionPercentile = 60
+
+[GasEstimator.FeeHistory]
+CacheTimeout = '2s'
+
+[HeadTracker]
+HistoryDepth = 50
+MaxBufferSize = 3
+SamplingInterval = '1s'
+MaxAllowedFinalityDepth = 10000
+FinalityTagBypass = true
+PersistenceEnabled = true
+
+[NodePool]
+PollFailureThreshold = 5
+PollInterval = '10s'
+SelectionMode = 'HighestHead'
+SyncThreshold = 10
+LeaseDuration = '0s'
+NodeIsSyncingEnabled = false
+FinalizedBlockPollInterval = '5s'
+EnforceRepeatableRead = true
+DeathDeclarationDelay = '1m0s'
+NewHeadsPollInterval = '0s'
+
+[OCR]
+ContractConfirmations = 4
+ContractTransmitterTransmitTimeout = '10s'
+DatabaseTimeout = '10s'
+DeltaCOverride = '168h0m0s'
+DeltaCJitterOverride = '1h0m0s'
+ObservationGracePeriod = '1s'
+
+[OCR2]
+[OCR2.Automation]
+GasLimit = 5400000
+
+[Workflow]
+GasLimitDefault = 400000
+```
+
+
+
Linea Goerli (59140)
```toml
@@ -7836,6 +8099,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -7939,6 +8203,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -8044,6 +8309,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -8150,6 +8416,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -8254,6 +8521,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '1h50m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -8362,6 +8630,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 5000
@@ -8465,6 +8734,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '12m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 5000
@@ -8568,6 +8838,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '5m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -8672,6 +8943,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -8780,6 +9052,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '12m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -8889,6 +9162,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -8997,6 +9271,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -9104,6 +9379,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -9211,6 +9487,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -9320,6 +9597,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -9429,6 +9707,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '1h50m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -9537,6 +9816,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -9641,6 +9921,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '15m0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -9749,6 +10030,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -9853,6 +10135,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '0s'
[Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
@@ -10138,6 +10421,7 @@ Set to zero to disable.
## EVM.Transactions
```toml
[EVM.Transactions]
+Enabled = true # Default
ForwardersEnabled = false # Default
MaxInFlight = 16 # Default
MaxQueued = 250 # Default
@@ -10147,6 +10431,12 @@ ResendAfterThreshold = '1m' # Default
```
+### Enabled
+```toml
+Enabled = true # Default
+```
+Enabled is a feature flag for the Transaction Manager. This flag also enables or disables the gas estimator since it is dependent on the TXM to start it.
+
### ForwardersEnabled
```toml
ForwardersEnabled = false # Default
@@ -11182,6 +11472,7 @@ OCR2CacheTTL = '1m' # Default
TxTimeout = '1m' # Default
TxRetryTimeout = '10s' # Default
TxConfirmTimeout = '30s' # Default
+TxExpirationRebroadcast = false # Default
TxRetentionTimeout = '0s' # Default
SkipPreflight = true # Default
Commitment = 'confirmed' # Default
@@ -11252,6 +11543,13 @@ TxConfirmTimeout = '30s' # Default
```
TxConfirmTimeout is the duration to wait when confirming a tx signature, before discarding as unconfirmed.
+### TxExpirationRebroadcast
+```toml
+TxExpirationRebroadcast = false # Default
+```
+TxExpirationRebroadcast enables or disables transaction rebroadcast if expired. Expiration check is performed every `ConfirmPollPeriod`
+A transaction is considered expired if the blockhash it was sent with is 150 blocks older than the latest blockhash.
+
### TxRetentionTimeout
```toml
TxRetentionTimeout = '0s' # Default
diff --git a/go.mod b/go.mod
index 2149898f15b..8c3d465bfba 100644
--- a/go.mod
+++ b/go.mod
@@ -11,7 +11,7 @@ require (
github.com/NethermindEth/juno v0.3.1
github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb
github.com/XSAM/otelsql v0.27.0
- github.com/andybalholm/brotli v1.1.0
+ github.com/andybalholm/brotli v1.1.1
github.com/avast/retry-go/v4 v4.6.0
github.com/btcsuite/btcd/btcec/v2 v2.3.4
github.com/cometbft/cometbft v0.37.5
@@ -25,7 +25,7 @@ require (
github.com/fxamacker/cbor/v2 v2.7.0
github.com/gagliardetto/solana-go v1.8.4
github.com/getsentry/sentry-go v0.27.0
- github.com/gin-contrib/cors v1.5.0
+ github.com/gin-contrib/cors v1.7.2
github.com/gin-contrib/expvar v0.0.1
github.com/gin-contrib/sessions v0.0.5
github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4
@@ -78,15 +78,15 @@ require (
github.com/shopspring/decimal v1.4.0
github.com/smartcontractkit/chain-selectors v1.0.34
github.com/smartcontractkit/chainlink-automation v0.8.1
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0
- github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000
+ github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e
- github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db
+ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3
github.com/smartcontractkit/chainlink-feeds v0.1.1
- github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2
- github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc
+ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0
+ github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8
- github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12
+ github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de
github.com/smartcontractkit/wsrpc v0.8.3
@@ -110,12 +110,12 @@ require (
go.opentelemetry.io/otel/trace v1.31.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.28.0
+ golang.org/x/crypto v0.31.0
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c
golang.org/x/mod v0.21.0
- golang.org/x/sync v0.8.0
- golang.org/x/term v0.25.0
- golang.org/x/text v0.19.0
+ golang.org/x/sync v0.10.0
+ golang.org/x/term v0.27.0
+ golang.org/x/text v0.21.0
golang.org/x/time v0.7.0
golang.org/x/tools v0.26.0
gonum.org/v1/gonum v0.15.1
@@ -148,6 +148,7 @@ require (
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
+ github.com/apache/arrow-go/v18 v18.0.0 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect
github.com/bahlo/generic-list-go v0.2.0 // indirect
@@ -158,13 +159,14 @@ require (
github.com/blendle/zapdriver v1.3.1 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 // indirect
- github.com/bytedance/sonic v1.10.1 // indirect
+ github.com/bytedance/sonic v1.11.6 // indirect
+ github.com/bytedance/sonic/loader v0.1.1 // indirect
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
- github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
- github.com/chenzhuoyu/iasm v0.9.0 // indirect
+ github.com/cloudwego/base64x v0.1.4 // indirect
+ github.com/cloudwego/iasm v0.2.0 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
@@ -219,7 +221,7 @@ require (
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.22.0 // indirect
github.com/go-webauthn/x v0.1.5 // indirect
- github.com/goccy/go-json v0.10.2 // indirect
+ github.com/goccy/go-json v0.10.3 // indirect
github.com/goccy/go-yaml v1.12.0 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
github.com/gofrs/flock v0.8.1 // indirect
@@ -232,6 +234,7 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
github.com/google/btree v1.1.2 // indirect
+ github.com/google/flatbuffers v24.3.25+incompatible // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/go-tpm v0.9.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
@@ -269,8 +272,8 @@ require (
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jmhodges/levigo v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/klauspost/compress v1.17.9 // indirect
- github.com/klauspost/cpuid/v2 v2.2.5 // indirect
+ github.com/klauspost/compress v1.17.11 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
@@ -279,6 +282,7 @@ require (
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/marcboeker/go-duckdb v1.8.3 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
@@ -302,6 +306,7 @@ require (
github.com/opencontainers/runc v1.1.10 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect
+ github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/procfs v0.15.1 // indirect
@@ -343,6 +348,7 @@ require (
github.com/x448/float16 v0.8.4 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
+ github.com/zeebo/xxh3 v1.0.2 // indirect
github.com/zondax/hid v0.9.2 // indirect
github.com/zondax/ledger-go v0.14.3 // indirect
go.dedis.ch/protobuf v1.0.11 // indirect
@@ -369,7 +375,7 @@ require (
go.uber.org/ratelimit v0.3.1 // indirect
golang.org/x/arch v0.11.0 // indirect
golang.org/x/net v0.30.0 // indirect
- golang.org/x/sys v0.26.0 // indirect
+ golang.org/x/sys v0.28.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
google.golang.org/api v0.202.0 // indirect
google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect
diff --git a/go.sum b/go.sum
index 45a2dfab4fe..c185e1ad1d2 100644
--- a/go.sum
+++ b/go.sum
@@ -144,9 +144,13 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax
github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc=
github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
-github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
-github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
+github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g6V7ZM=
+github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A=
+github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE=
+github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw=
github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4=
github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
@@ -163,6 +167,8 @@ github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN
github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI=
github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -192,14 +198,16 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 h1:NJvU4S8KEk1GnF6+FvlnzMD/8wXTj/mYJSG6Q4yu3Pw=
github.com/bytecodealliance/wasmtime-go/v23 v23.0.0/go.mod h1:5YIL+Ouiww2zpO7u+iZ1U1G5NvmwQYaXdmCZQGjQM0U=
-github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
-github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
-github.com/bytedance/sonic v1.10.1 h1:7a1wuFXL1cMy7a3f7/VFcEtriuXQnUBhtoVfOZiaysc=
-github.com/bytedance/sonic v1.10.1/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
+github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
+github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
+github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
+github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
@@ -215,12 +223,6 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
-github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
-github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
-github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=
-github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo=
-github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=
@@ -229,6 +231,10 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
+github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
+github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
+github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -404,6 +410,8 @@ github.com/gagliardetto/solana-go v1.8.4 h1:vmD/JmTlonyXGy39bAo0inMhmbdAwV7rXZtL
github.com/gagliardetto/solana-go v1.8.4/go.mod h1:i+7aAyNDTHG0jK8GZIBSI4OVvDqkt2Qx+LklYclRNG8=
github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw=
github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok=
+github.com/gagliardetto/utilz v0.1.1 h1:/etW4hl607emKg6R6Lj9jRJ9d6ue2AQOyjhuAwjzs1U=
+github.com/gagliardetto/utilz v0.1.1/go.mod h1:b+rGFkRHz3HWJD0RYMzat47JyvbTtpE0iEcYTRJTLLA=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ=
@@ -411,8 +419,8 @@ github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9y
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk=
-github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI=
+github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
+github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E=
github.com/gin-contrib/expvar v0.0.1 h1:IuU5ArEgihz50vG8Onrwz22kJr7Mcvgv9xSSpfU5g+w=
github.com/gin-contrib/expvar v0.0.1/go.mod h1:8o2CznfQi1JjktORdHr2/abg3wSV6OCnXh0yGypvvVw=
github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE=
@@ -484,8 +492,8 @@ github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAh
github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0=
github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY=
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM=
github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU=
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0=
@@ -550,6 +558,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI=
+github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -650,6 +660,8 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=
github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8=
@@ -814,14 +826,16 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4=
+github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
-github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
+github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
-github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
+github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -868,6 +882,8 @@ github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYt
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk=
+github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ=
+github.com/marcboeker/go-duckdb v1.8.3/go.mod h1:C9bYRE1dPYb1hhfu/SSomm78B0FXmNgRvv6YBW/Hooc=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -897,9 +913,15 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5
github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY=
github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
+github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM=
github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94=
github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
@@ -1002,6 +1024,8 @@ github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xl
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
@@ -1082,6 +1106,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
+github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
@@ -1123,26 +1149,26 @@ github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3f
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0 h1:/1L+v4SxUD2K5RMRbfByyLfePMAgQKeD0onSetPnGmA=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000 h1:6Zzr/R1j6P7bbvcUlt5WUIbItvrrGdGzIsiAzQezcwo=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000/go.mod h1:ncjd6mPZSRlelEqH/2KeLE1pU3UlqzBSn8RYkEoECzY=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550 h1:rRs74zjDJ7do5aYEXSU/sOnLnlbYCNqM8BrvEx/0NH8=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550/go.mod h1:yti7e1+G9hhkYhj+L5sVUULn9Bn3bBL5/AxaNqdJ5YQ=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e/go.mod h1:mUh5/woemsVaHgTorA080hrYmO3syBCmPdnWc/5dOqk=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db h1:N1RH1hSr2ACzOFc9hkCcjE8pRBTdcU3p8nsTJByaLes=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db/go.mod h1:yjb9d4q7+m8aGbjfTbkNoNuA4PeSxcUszsSZHDrvS0E=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 h1:aeiBdBHGY8QNftps+VqrIk6OnfeeOD5z4jrAabW4ZSc=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3/go.mod h1:AS6zY2BkcRwfiGzNabGbHhfrLSrXrcI/GmjnT4jQ5/s=
github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c=
github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 h1:onBe3DqNrbtOAzKS4PrPIiJX65BGo1aYiYZxFVEW+jc=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc h1:dssRwJhmzJkUN/OajaDj2GsxBn+Tupk3bI1BkPEoJg0=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc/go.mod h1:p8aUDfJeley6oer7y+Ucd3edOtRlMTnWg3mN6rhaLWo=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce h1:Mvpbr/Fi2IdU2EcmqCxhlCzs5ncnx+BwV80YweA4DZs=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce/go.mod h1:qq+nW0JDnCCGMf2c38ZHjH8xgkAQnXKighjJr5JdDNE=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 h1:tNS7U9lrxkFvEuyxQv11HHOiV9LPDGC9wYEy+yM/Jv4=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8/go.mod h1:EBrEgcdIbwepqguClkv8Ohy7CbyWSJaE4EC9aBJlQK0=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12 h1:NzZGjaqez21I3DU7objl3xExTH4fxYvzTqar8DC6360=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc=
@@ -1280,6 +1306,8 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
+github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
+github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1289,6 +1317,10 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
+github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U=
github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
@@ -1425,8 +1457,8 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1551,8 +1583,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1636,8 +1668,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1647,8 +1679,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1663,8 +1695,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff --git a/integration-tests/.golangci.yml b/integration-tests/.golangci.yml
index 8969110d988..337555e17cb 100644
--- a/integration-tests/.golangci.yml
+++ b/integration-tests/.golangci.yml
@@ -1,15 +1,33 @@
run:
timeout: 15m
+ allow-parallel-runners: true
linters:
enable:
+ - containedctx
+ - depguard
+ - errname
+ - errorlint
- exhaustive
- exportloopref
- - revive
+ - fatcontext
+ - ginkgolinter
+ - gocritic
- goimports
- gosec
+ - loggercheck
+ - mirror
- misspell
+ - noctx
+ - nolintlint
+ - perfsprint
+ - prealloc
+ - revive
- rowserrcheck
- - errorlint
+ - spancheck
+ - sqlclosecheck
+ - testifylint
+ - unconvert
+ - whitespace
linters-settings:
exhaustive:
default-signifies-exhaustive: true
@@ -23,6 +41,28 @@ linters-settings:
govet:
enable:
- shadow
+ settings:
+ printf:
+ # Additionally check chainlink custom loggers
+ funcs:
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Tracef
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Debugf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Infof
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Warnf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Errorf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Criticalf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Panicf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Fatalf
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.SugaredLogger).AssumptionViolationf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Debugf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Infof
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Warnf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Errorf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Panicf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Fatalf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).AssumptionViolationf
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Tracef
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Criticalf
revive:
confidence: 0.8
rules:
@@ -33,9 +73,10 @@ linters-settings:
- name: error-return
- name: error-strings
- name: error-naming
+ - name: exported
- name: if-return
- name: increment-decrement
- # - name: var-naming // doesn't work with some generated names
+ - name: var-naming
- name: var-declaration
- name: package-comments
- name: range
@@ -46,7 +87,7 @@ linters-settings:
- name: errorf
- name: empty-block
- name: superfluous-else
- #- name: unused-parameter
+ # - name: unused-parameter
- name: unreachable-code
- name: redefines-builtin-id
- name: waitgroup-by-value
@@ -61,13 +102,69 @@ linters-settings:
- name: identical-branches
- name: get-return
# - name: flag-parameter // probably one we should work on doing better at in the future
- # - name: early-return // probably one we should work on doing better at in the future
+ - name: early-return
- name: defer
- name: constant-logical-expr
- name: confusing-naming
- name: confusing-results
- name: bool-literal-in-expr
- name: atomic
+ depguard:
+ rules:
+ main:
+ list-mode: lax
+ deny:
+ - pkg: cosmossdk.io/errors
+ desc: Use the standard library instead
+ - pkg: github.com/gofrs/uuid
+ desc: Use github.com/google/uuid instead
+ - pkg: github.com/jackc/pgx3
+ desc: Use github.com/jackc/pgx4 instead
+ - pkg: github.com/jackc/pgx5
+ desc: Use github.com/jackc/pgx4 instead
+ - pkg: github.com/satori/go.uuid
+ desc: Use github.com/google/uuid instead
+ - pkg: github.com/test-go/testify/assert
+ desc: Use github.com/stretchr/testify/assert instead
+ - pkg: github.com/test-go/testify/mock
+ desc: Use github.com/stretchr/testify/mock instead
+ - pkg: github.com/test-go/testify/require
+ desc: Use github.com/stretchr/testify/require instead
+ - pkg: go.uber.org/multierr
+ desc: Use the standard library instead, for example https://pkg.go.dev/errors#Join
+ - pkg: gopkg.in/guregu/null.v1
+ desc: Use gopkg.in/guregu/null.v4 instead
+ - pkg: gopkg.in/guregu/null.v2
+ desc: Use gopkg.in/guregu/null.v4 instead
+ - pkg: gopkg.in/guregu/null.v3
+ desc: Use gopkg.in/guregu/null.v4 instead
+ - pkg: github.com/go-gorm/gorm
+ desc: Use github.com/jmoiron/sqlx directly instead
+ loggercheck:
+ # Check that *w logging functions have even number of args (i.e., well formed key-value pairs).
+ rules:
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Tracew
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Debugw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Infow
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Warnw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Errorw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Criticalw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Panicw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.Logger).Fatalw
+ - (github.com/smartcontractkit/chainlink/v2/core/logger.SugaredLogger).AssumptionViolationw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Debugw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Infow
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Warnw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Errorw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Panicw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Fatalw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).AssumptionViolationw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Tracew
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Criticalw
+ - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).With
+ nolintlint:
+ require-specific: true
+ require-explanation: true
issues:
exclude-rules:
- text: "^G404: Use of weak random number generator"
diff --git a/integration-tests/ccip-tests/contracts/contract_deployer.go b/integration-tests/ccip-tests/contracts/contract_deployer.go
index 1f2859ae0db..940f76e93b8 100644
--- a/integration-tests/ccip-tests/contracts/contract_deployer.go
+++ b/integration-tests/ccip-tests/contracts/contract_deployer.go
@@ -40,7 +40,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_messenger"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_v3_aggregator_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
@@ -54,6 +53,7 @@ import (
type_and_version "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/type_and_version_interface_wrapper"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/mock_v3_aggregator_contract"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers"
ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers"
diff --git a/integration-tests/ccip-tests/contracts/contract_models.go b/integration-tests/ccip-tests/contracts/contract_models.go
index 257670dbaa1..86aafefce62 100644
--- a/integration-tests/ccip-tests/contracts/contract_models.go
+++ b/integration-tests/ccip-tests/contracts/contract_models.go
@@ -33,7 +33,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_v3_aggregator_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
@@ -45,6 +44,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/mock_v3_aggregator_contract"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers"
)
diff --git a/integration-tests/ccip-tests/contracts/lm_contracts.go b/integration-tests/ccip-tests/contracts/lm_contracts.go
index 521324c11be..f51369ee977 100644
--- a/integration-tests/ccip-tests/contracts/lm_contracts.go
+++ b/integration-tests/ccip-tests/contracts/lm_contracts.go
@@ -25,7 +25,7 @@ import (
type ArmProxy struct {
client blockchain.EVMClient
- Instance *rmn_proxy_contract.RMNProxyContract
+ Instance *rmn_proxy_contract.RMNProxy
EthAddress *common.Address
}
@@ -34,7 +34,7 @@ func (e *CCIPContractsDeployer) DeployArmProxy(arm common.Address) (*ArmProxy, e
auth *bind.TransactOpts,
_ bind.ContractBackend,
) (common.Address, *types.Transaction, interface{}, error) {
- return rmn_proxy_contract.DeployRMNProxyContract(
+ return rmn_proxy_contract.DeployRMNProxy(
auth,
wrappers.MustNewWrappedContractBackend(e.evmClient, nil),
arm,
@@ -45,7 +45,7 @@ func (e *CCIPContractsDeployer) DeployArmProxy(arm common.Address) (*ArmProxy, e
}
return &ArmProxy{
client: e.evmClient,
- Instance: instance.(*rmn_proxy_contract.RMNProxyContract),
+ Instance: instance.(*rmn_proxy_contract.RMNProxy),
EthAddress: address,
}, err
}
diff --git a/integration-tests/ccip-tests/testconfig/README.md b/integration-tests/ccip-tests/testconfig/README.md
index ff57ecaa220..d614ed62ea4 100644
--- a/integration-tests/ccip-tests/testconfig/README.md
+++ b/integration-tests/ccip-tests/testconfig/README.md
@@ -430,32 +430,6 @@ Example usage:
TTL = "11h"
```
-### CCIP.Env.Logging
-
-Specifies the logging configuration for the test. Imported from [LoggingConfig](https://github.com/smartcontractkit/chainlink-testing-framework/blob/main/config/logging.go#L11) in chainlink-testing-framework.
-Example usage:
-
-```toml
-[CCIP.Env.Logging]
-test_log_collect = false # if set to true will save logs even if test did not fail
-
-[CCIP.Env.Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets = ["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout = "10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit = 10
-
-[CCIP.Env.Logging.Loki]
-tenant_id = "..."
-endpoint = "https://loki...."
-
-[CCIP.Env.Logging.Grafana]
-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.
diff --git a/integration-tests/ccip-tests/testconfig/global.go b/integration-tests/ccip-tests/testconfig/global.go
index 4caa8a9ac00..8866d31705a 100644
--- a/integration-tests/ccip-tests/testconfig/global.go
+++ b/integration-tests/ccip-tests/testconfig/global.go
@@ -175,120 +175,6 @@ type Common struct {
func (p *Common) ReadFromEnvVar() error {
logger := logging.GetTestLogger(nil)
- testLogCollect := ctfconfig.MustReadEnvVar_Boolean(ctfconfig.E2E_TEST_LOG_COLLECT_ENV)
- if testLogCollect != nil {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.TestLogCollect", ctfconfig.E2E_TEST_LOG_COLLECT_ENV)
- p.Logging.TestLogCollect = testLogCollect
- }
-
- loggingRunID := ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_LOGGING_RUN_ID_ENV)
- if loggingRunID != "" {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.RunID", ctfconfig.E2E_TEST_LOGGING_RUN_ID_ENV)
- p.Logging.RunId = &loggingRunID
- }
-
- logstreamLogTargets := ctfconfig.MustReadEnvVar_Strings(ctfconfig.E2E_TEST_LOG_STREAM_LOG_TARGETS_ENV, ",")
- if len(logstreamLogTargets) > 0 {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- if p.Logging.LogStream == nil {
- p.Logging.LogStream = &ctfconfig.LogStreamConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.LogStream.LogTargets", ctfconfig.E2E_TEST_LOG_STREAM_LOG_TARGETS_ENV)
- p.Logging.LogStream.LogTargets = logstreamLogTargets
- }
-
- lokiTenantID := ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_LOKI_TENANT_ID_ENV)
- if lokiTenantID != "" {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- if p.Logging.Loki == nil {
- p.Logging.Loki = &ctfconfig.LokiConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.Loki.TenantId", ctfconfig.E2E_TEST_LOKI_TENANT_ID_ENV)
- p.Logging.Loki.TenantId = &lokiTenantID
- }
-
- lokiEndpoint := ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_LOKI_ENDPOINT_ENV)
- if lokiEndpoint != "" {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- if p.Logging.Loki == nil {
- p.Logging.Loki = &ctfconfig.LokiConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.Loki.Endpoint", ctfconfig.E2E_TEST_LOKI_ENDPOINT_ENV)
- p.Logging.Loki.Endpoint = &lokiEndpoint
- }
-
- lokiBasicAuth := ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_LOKI_BASIC_AUTH_ENV)
- if lokiBasicAuth != "" {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- if p.Logging.Loki == nil {
- p.Logging.Loki = &ctfconfig.LokiConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.Loki.BasicAuth", ctfconfig.E2E_TEST_LOKI_BASIC_AUTH_ENV)
- p.Logging.Loki.BasicAuth = &lokiBasicAuth
- }
-
- lokiBearerToken := ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_LOKI_BEARER_TOKEN_ENV)
- if lokiBearerToken != "" {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- if p.Logging.Loki == nil {
- p.Logging.Loki = &ctfconfig.LokiConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.Loki.BearerToken", ctfconfig.E2E_TEST_LOKI_BEARER_TOKEN_ENV)
- p.Logging.Loki.BearerToken = &lokiBearerToken
- }
-
- grafanaBaseUrl := ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_GRAFANA_BASE_URL_ENV)
- if grafanaBaseUrl != "" {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- if p.Logging.Grafana == nil {
- p.Logging.Grafana = &ctfconfig.GrafanaConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.Grafana.BaseUrl", ctfconfig.E2E_TEST_GRAFANA_BASE_URL_ENV)
- p.Logging.Grafana.BaseUrl = &grafanaBaseUrl
- }
-
- grafanaDashboardUrl := ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_GRAFANA_DASHBOARD_URL_ENV)
- if grafanaDashboardUrl != "" {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- if p.Logging.Grafana == nil {
- p.Logging.Grafana = &ctfconfig.GrafanaConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.Grafana.DashboardUrl", ctfconfig.E2E_TEST_GRAFANA_DASHBOARD_URL_ENV)
- p.Logging.Grafana.DashboardUrl = &grafanaDashboardUrl
- }
-
- grafanaBearerToken := ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_GRAFANA_BEARER_TOKEN_ENV)
- if grafanaBearerToken != "" {
- if p.Logging == nil {
- p.Logging = &ctfconfig.LoggingConfig{}
- }
- if p.Logging.Grafana == nil {
- p.Logging.Grafana = &ctfconfig.GrafanaConfig{}
- }
- logger.Debug().Msgf("Using %s env var to override Logging.Grafana.BearerToken", ctfconfig.E2E_TEST_GRAFANA_BEARER_TOKEN_ENV)
- p.Logging.Grafana.BearerToken = &grafanaBearerToken
- }
-
selectedNetworks := ctfconfig.MustReadEnvVar_Strings(ctfconfig.E2E_TEST_SELECTED_NETWORK_ENV, ",")
if len(selectedNetworks) > 0 {
if p.Network == nil {
@@ -421,9 +307,6 @@ func (p *Common) GetSethConfig() *seth.Config {
}
func (p *Common) Validate() error {
- if err := p.Logging.Validate(); err != nil {
- return fmt.Errorf("error validating logging config %w", err)
- }
if p.Network == nil {
return errors.New("no networks specified")
}
diff --git a/integration-tests/ccip-tests/testconfig/tomls/ccip-default.toml b/integration-tests/ccip-tests/testconfig/tomls/ccip-default.toml
index c82e2f930be..89858a94ddb 100644
--- a/integration-tests/ccip-tests/testconfig/tomls/ccip-default.toml
+++ b/integration-tests/ccip-tests/testconfig/tomls/ccip-default.toml
@@ -73,17 +73,6 @@ addresses_to_fund = [
[CCIP.Env.PrivateEthereumNetworks.SIMULATED_2.EthereumChainConfig.HardForkEpochs]
Deneb = 500
-[CCIP.Env.Logging]
-test_log_collect = false # if set to true will save logs even if test did not fail
-
-[CCIP.Env.Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets = ["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout = "10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit = 10
-
# these values will be used to set up chainlink DON
# along with these values, the secrets needs to be specified as part of .env variables
#
diff --git a/integration-tests/ccip-tests/testsetups/test_env.go b/integration-tests/ccip-tests/testsetups/test_env.go
index 263d291453d..3c3406a3e5a 100644
--- a/integration-tests/ccip-tests/testsetups/test_env.go
+++ b/integration-tests/ccip-tests/testsetups/test_env.go
@@ -352,7 +352,6 @@ func DeployLocalCluster(
pointer.GetString(clNode.ChainlinkImage.Image),
pointer.GetString(clNode.ChainlinkImage.Version),
toml,
- env.LogStream,
test_env.WithPgDBOptions(
ctftestenv.WithPostgresImageName(clNode.DBImage),
ctftestenv.WithPostgresImageVersion(clNode.DBTag),
@@ -381,7 +380,6 @@ func DeployLocalCluster(
pointer.GetString(testInputs.EnvInput.NewCLCluster.Common.ChainlinkImage.Image),
pointer.GetString(testInputs.EnvInput.NewCLCluster.Common.ChainlinkImage.Version),
toml,
- env.LogStream,
test_env.WithPgDBOptions(
ctftestenv.WithPostgresImageName(testInputs.EnvInput.NewCLCluster.Common.DBImage),
ctftestenv.WithPostgresImageVersion(testInputs.EnvInput.NewCLCluster.Common.DBTag),
diff --git a/integration-tests/contracts/ccipreader_test.go b/integration-tests/contracts/ccipreader_test.go
index 3b0ac1d79a1..f46a680c8a0 100644
--- a/integration-tests/contracts/ccipreader_test.go
+++ b/integration-tests/contracts/ccipreader_test.go
@@ -597,8 +597,8 @@ func TestCCIPReader_GetExpectedNextSequenceNumber(t *testing.T) {
selectors := env.Env.AllChainSelectors()
destChain, srcChain := selectors[0], selectors[1]
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, destChain, srcChain, false))
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, srcChain, destChain, false))
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, destChain, srcChain, false)
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, srcChain, destChain, false)
reader := testSetupRealContracts(
ctx,
@@ -707,8 +707,8 @@ func Test_GetChainFeePriceUpdates(t *testing.T) {
selectors := env.Env.AllChainSelectors()
chain1, chain2 := selectors[0], selectors[1]
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain1, chain2, false))
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain2, chain1, false))
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain1, chain2, false)
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain2, chain1, false)
// Change the gas price for chain2
feeQuoter := state.Chains[chain1].FeeQuoter
@@ -763,8 +763,8 @@ func Test_LinkPriceUSD(t *testing.T) {
selectors := env.Env.AllChainSelectors()
chain1, chain2 := selectors[0], selectors[1]
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain1, chain2, false))
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain2, chain1, false))
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain1, chain2, false)
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain2, chain1, false)
reader := testSetupRealContracts(
ctx,
@@ -785,7 +785,7 @@ func Test_LinkPriceUSD(t *testing.T) {
linkPriceUSD, err := reader.LinkPriceUSD(ctx)
require.NoError(t, err)
require.NotNil(t, linkPriceUSD.Int)
- require.Equal(t, changeset.DefaultInitialPrices.LinkPrice, linkPriceUSD.Int)
+ require.Equal(t, changeset.DefaultLinkPrice, linkPriceUSD.Int)
}
func Test_GetMedianDataAvailabilityGasConfig(t *testing.T) {
@@ -798,9 +798,9 @@ func Test_GetMedianDataAvailabilityGasConfig(t *testing.T) {
selectors := env.Env.AllChainSelectors()
destChain, chain1, chain2, chain3 := selectors[0], selectors[1], selectors[2], selectors[3]
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain1, destChain, false))
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain2, destChain, false))
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain3, destChain, false))
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain1, destChain, false)
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain2, destChain, false)
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain3, destChain, false)
boundContracts := map[cciptypes.ChainSelector][]types.BoundContract{}
for i, selector := range env.Env.AllChainSelectorsExcluding([]uint64{destChain}) {
@@ -857,8 +857,8 @@ func Test_GetWrappedNativeTokenPriceUSD(t *testing.T) {
selectors := env.Env.AllChainSelectors()
chain1, chain2 := selectors[0], selectors[1]
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain1, chain2, false))
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(env.Env, state, chain2, chain1, false))
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain1, chain2, false)
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &env, state, chain2, chain1, false)
reader := testSetupRealContracts(
ctx,
@@ -884,7 +884,7 @@ func Test_GetWrappedNativeTokenPriceUSD(t *testing.T) {
// Only chainD has reader contracts bound
require.Len(t, prices, 1)
- require.Equal(t, changeset.DefaultInitialPrices.WethPrice, prices[cciptypes.ChainSelector(chain1)].Int)
+ require.Equal(t, changeset.DefaultWethPrice, prices[cciptypes.ChainSelector(chain1)].Int)
}
// Benchmark Results:
diff --git a/integration-tests/crib/README.md b/integration-tests/crib/README.md
index c37cbfec9c9..b3ba2c41823 100644
--- a/integration-tests/crib/README.md
+++ b/integration-tests/crib/README.md
@@ -6,7 +6,7 @@ It runs OCRv1 and reboots the environment confirming integration with environmen
Go to the [CRIB](https://github.com/smartcontractkit/crib) repository and spin up a cluster.
```shell
-./scripts/cribbit.sh crib-oh-my-crib
+DEVSPACE_NAMESPACE=crib-oh-my-crib crib init
devspace deploy --debug --profile local-dev-simulated-core-ocr1
```
diff --git a/integration-tests/docker/test_env/cl_node.go b/integration-tests/docker/test_env/cl_node.go
index b5c2505b252..8ebaf579d0a 100644
--- a/integration-tests/docker/test_env/cl_node.go
+++ b/integration-tests/docker/test_env/cl_node.go
@@ -24,7 +24,6 @@ import (
"github.com/smartcontractkit/chainlink-testing-framework/lib/docker"
"github.com/smartcontractkit/chainlink-testing-framework/lib/docker/test_env"
"github.com/smartcontractkit/chainlink-testing-framework/lib/logging"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/logstream"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
@@ -126,11 +125,11 @@ func WithPgDBOptions(opts ...test_env.PostgresDbOption) ClNodeOption {
}
}
-func NewClNode(networks []string, imageName, imageVersion string, nodeConfig *chainlink.Config, logStream *logstream.LogStream, opts ...ClNodeOption) (*ClNode, error) {
+func NewClNode(networks []string, imageName, imageVersion string, nodeConfig *chainlink.Config, opts ...ClNodeOption) (*ClNode, error) {
nodeDefaultCName := fmt.Sprintf("%s-%s", "cl-node", uuid.NewString()[0:8])
pgDefaultCName := fmt.Sprintf("pg-%s", nodeDefaultCName)
- pgDb, err := test_env.NewPostgresDb(networks, test_env.WithPostgresDbContainerName(pgDefaultCName), test_env.WithPostgresDbLogStream(logStream))
+ pgDb, err := test_env.NewPostgresDb(networks, test_env.WithPostgresDbContainerName(pgDefaultCName))
if err != nil {
return nil, err
}
@@ -140,7 +139,6 @@ func NewClNode(networks []string, imageName, imageVersion string, nodeConfig *ch
ContainerImage: imageName,
ContainerVersion: imageVersion,
Networks: networks,
- LogStream: logStream,
StartupTimeout: 3 * time.Minute,
},
UserEmail: "local@local.com",
@@ -490,28 +488,6 @@ func (n *ClNode) getContainerRequest(secrets string) (
FileMode: 0644,
},
},
- LifecycleHooks: []tc.ContainerLifecycleHooks{
- {
- PostStarts: []tc.ContainerHook{
- func(ctx context.Context, c tc.Container) error {
- if n.LogStream != nil {
- return n.LogStream.ConnectContainer(ctx, c, "")
- }
- return nil
- },
- },
- PreStops: []tc.ContainerHook{
- func(ctx context.Context, c tc.Container) error {
- if n.LogStream != nil {
- return n.LogStream.DisconnectContainer(c)
- }
- return nil
- },
- },
- PostStops: n.PostStopsHooks,
- PreTerminates: n.PreTerminatesHooks,
- },
- },
}, nil
}
diff --git a/integration-tests/docker/test_env/test_env.go b/integration-tests/docker/test_env/test_env.go
index 1ca50760d17..a37b7f813a7 100644
--- a/integration-tests/docker/test_env/test_env.go
+++ b/integration-tests/docker/test_env/test_env.go
@@ -20,8 +20,6 @@ import (
"github.com/smartcontractkit/chainlink-testing-framework/lib/docker"
"github.com/smartcontractkit/chainlink-testing-framework/lib/docker/test_env"
"github.com/smartcontractkit/chainlink-testing-framework/lib/logging"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/logstream"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/runid"
"github.com/smartcontractkit/chainlink/integration-tests/testconfig/ccip"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
@@ -36,7 +34,6 @@ var (
type CLClusterTestEnv struct {
Cfg *TestEnvConfig
DockerNetwork *tc.DockerNetwork
- LogStream *logstream.LogStream
TestConfig ctf_config.GlobalTestConfig
/* components */
@@ -69,7 +66,7 @@ func (te *CLClusterTestEnv) WithTestEnvConfig(cfg *TestEnvConfig) *CLClusterTest
te.Cfg = cfg
if cfg.MockAdapter.ContainerName != "" {
n := []string{te.DockerNetwork.Name}
- te.MockAdapter = test_env.NewKillgrave(n, te.Cfg.MockAdapter.ImpostersPath, test_env.WithContainerName(te.Cfg.MockAdapter.ContainerName), test_env.WithLogStream(te.LogStream))
+ te.MockAdapter = test_env.NewKillgrave(n, te.Cfg.MockAdapter.ImpostersPath, test_env.WithContainerName(te.Cfg.MockAdapter.ContainerName))
}
return te
}
@@ -99,7 +96,6 @@ func (te *CLClusterTestEnv) StartEthereumNetwork(cfg *ctf_config.EthereumNetwork
builder := test_env.NewEthereumNetworkBuilder()
c, err := builder.WithExistingConfig(*cfg).
WithTest(te.t).
- WithLogStream(te.LogStream).
Build()
if err != nil {
return blockchain.EVMNetwork{}, test_env.RpcProvider{}, err
@@ -132,7 +128,6 @@ func (te *CLClusterTestEnv) StartJobDistributor(cfg *ccip.JDConfig) error {
job_distributor.WithVersion(cfg.GetJDVersion()),
job_distributor.WithDBURL(jdDB.InternalURL.String()),
)
- jd.LogStream = te.LogStream
err = jd.StartContainer()
if err != nil {
return fmt.Errorf("failed to start job-distributor: %w", err)
@@ -160,7 +155,7 @@ func (te *CLClusterTestEnv) StartClCluster(nodeConfig *chainlink.Config, count i
opts = append(opts, WithSecrets(secretsConfig))
te.ClCluster = &ClCluster{}
for i := 0; i < count; i++ {
- ocrNode, err := NewClNode([]string{te.DockerNetwork.Name}, *testconfig.GetChainlinkImageConfig().Image, *testconfig.GetChainlinkImageConfig().Version, nodeConfig, te.LogStream, opts...)
+ ocrNode, err := NewClNode([]string{te.DockerNetwork.Name}, *testconfig.GetChainlinkImageConfig().Image, *testconfig.GetChainlinkImageConfig().Version, nodeConfig, opts...)
if err != nil {
return err
}
@@ -193,11 +188,6 @@ type CleanupOpts struct {
func (te *CLClusterTestEnv) Cleanup(opts CleanupOpts) error {
te.l.Info().Msg("Cleaning up test environment")
- runIdErr := runid.RemoveLocalRunId(te.TestConfig.GetLoggingConfig().RunId)
- if runIdErr != nil {
- te.l.Warn().Msgf("Failed to remove .run.id file due to: %s (not a big deal, you can still remove it manually)", runIdErr.Error())
- }
-
if te.t == nil {
return fmt.Errorf("cannot cleanup test environment without a testing.T")
}
diff --git a/integration-tests/docker/test_env/test_env_builder.go b/integration-tests/docker/test_env/test_env_builder.go
index cdce826f2c2..e11a3c96095 100644
--- a/integration-tests/docker/test_env/test_env_builder.go
+++ b/integration-tests/docker/test_env/test_env_builder.go
@@ -2,28 +2,25 @@ package test_env
import (
"fmt"
- "math"
"os"
"path/filepath"
- "slices"
"strings"
+ "sync"
"testing"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"go.uber.org/zap/zapcore"
-
- "github.com/smartcontractkit/chainlink-testing-framework/seth"
+ "golang.org/x/sync/errgroup"
"github.com/smartcontractkit/chainlink-testing-framework/lib/blockchain"
ctf_config "github.com/smartcontractkit/chainlink-testing-framework/lib/config"
+ ctf_docker "github.com/smartcontractkit/chainlink-testing-framework/lib/docker"
"github.com/smartcontractkit/chainlink-testing-framework/lib/docker/test_env"
"github.com/smartcontractkit/chainlink-testing-framework/lib/logging"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/logstream"
"github.com/smartcontractkit/chainlink-testing-framework/lib/networks"
"github.com/smartcontractkit/chainlink-testing-framework/lib/testreporters"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/testsummary"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/osutil"
"github.com/smartcontractkit/chainlink/integration-tests/testconfig/ccip"
@@ -46,7 +43,6 @@ type ChainlinkNodeLogScannerSettings struct {
}
type CLTestEnvBuilder struct {
- hasLogStream bool
hasKillgrave bool
jdConfig *ccip.JDConfig
clNodeConfig *chainlink.Config
@@ -90,7 +86,6 @@ func GetDefaultChainlinkNodeLogScannerSettingsWithExtraAllowedMessages(extraAllo
func NewCLTestEnvBuilder() *CLTestEnvBuilder {
return &CLTestEnvBuilder{
l: log.Logger,
- hasLogStream: true,
isEVM: true,
chainlinkNodeLogScannerSettings: &DefaultChainlinkNodeLogScannerSettings,
}
@@ -134,12 +129,6 @@ func (b *CLTestEnvBuilder) WithTestInstance(t *testing.T) *CLTestEnvBuilder {
return b
}
-// WithoutLogStream disables LogStream logging component
-func (b *CLTestEnvBuilder) WithoutLogStream() *CLTestEnvBuilder {
- b.hasLogStream = false
- return b
-}
-
func (b *CLTestEnvBuilder) WithoutChainlinkNodeLogScanner() *CLTestEnvBuilder {
b.chainlinkNodeLogScannerSettings = &ChainlinkNodeLogScannerSettings{}
return b
@@ -250,102 +239,105 @@ func (b *CLTestEnvBuilder) Build() (*CLClusterTestEnv, error) {
b.te.WithTestInstance(b.t)
}
- if b.hasLogStream {
- loggingConfig := b.testConfig.GetLoggingConfig()
- // we need to enable logging to file if we want to scan logs
- if b.chainlinkNodeLogScannerSettings != nil && !slices.Contains(loggingConfig.LogStream.LogTargets, string(logstream.File)) {
- b.l.Debug().Msg("Enabling logging to file in order to support Chainlink node log scanning")
- loggingConfig.LogStream.LogTargets = append(loggingConfig.LogStream.LogTargets, string(logstream.File))
- }
- b.te.LogStream, err = logstream.NewLogStream(b.te.t, b.testConfig.GetLoggingConfig())
- if err != nil {
- return nil, err
- }
-
- // this clean up has to be added as the FIRST one, because cleanup functions are executed in reverse order (LIFO)
- if b.t != nil && b.cleanUpType != CleanUpTypeNone {
- b.t.Cleanup(func() {
- b.l.Info().Msg("Shutting down LogStream")
- logPath, err := osutil.GetAbsoluteFolderPath("logs")
- if err == nil {
- b.l.Info().Str("Absolute path", logPath).Msg("LogStream logs folder location")
- }
-
- // flush logs when test failed or when we are explicitly told to collect logs
- flushLogStream := b.t.Failed() || *b.testConfig.GetLoggingConfig().TestLogCollect
+ // this clean up has to be added as the FIRST one, because cleanup functions are executed in reverse order (LIFO)
+ if b.t != nil && b.cleanUpType != CleanUpTypeNone {
+ b.t.Cleanup(func() {
+ logsDir := fmt.Sprintf("logs/%s-%s", b.t.Name(), time.Now().Format("2006-01-02T15-04-05"))
+ loggingErr := ctf_docker.WriteAllContainersLogs(b.l, logsDir)
+ if loggingErr != nil {
+ b.l.Error().Err(loggingErr).Msg("Error writing all Docker containers logs")
+ }
- // run even if test has failed, as we might be able to catch additional problems without running the test again
- if b.chainlinkNodeLogScannerSettings != nil {
- logProcessor := logstream.NewLogProcessor[int](b.te.LogStream)
+ if b == nil || b.te == nil || b.te.ClCluster == nil || b.te.ClCluster.Nodes == nil {
+ log.Warn().Msg("Won't dump container and postgres logs, because test environment doesn't have any nodes")
+ return
+ }
- processFn := func(log logstream.LogContent, count *int) error {
- countSoFar := count
- if *countSoFar < 0 {
- return fmt.Errorf("negative count: %d", *countSoFar)
- }
- newCount, err := testreporters.ScanLogLine(b.l, string(log.Content), b.chainlinkNodeLogScannerSettings.FailingLogLevel, uint(*countSoFar), b.chainlinkNodeLogScannerSettings.Threshold, b.chainlinkNodeLogScannerSettings.AllowedMessages)
- if err != nil {
- return err
- }
- if newCount > math.MaxInt {
- return fmt.Errorf("new count overflows int: %d", newCount)
- }
- *count = int(newCount)
- return nil
- }
+ if b.chainlinkNodeLogScannerSettings != nil {
+ var logFiles []*os.File
- // we cannot do parallel processing here, because ProcessContainerLogs() locks a mutex that controls whether
- // new logs can be added to the log stream, so parallel processing would get stuck on waiting for it to be unlocked
- LogScanningLoop:
- for i := 0; i < b.clNodesCount; i++ {
- // if something went wrong during environment setup we might not have all nodes, and we don't want an NPE
- if b == nil || b.te == nil || b.te.ClCluster == nil || b.te.ClCluster.Nodes == nil || len(b.te.ClCluster.Nodes)-1 < i || b.te.ClCluster.Nodes[i] == nil {
+ // when tests run in parallel, we need to make sure that we only process logs that belong to nodes created by the current test
+ // that is required, because some tests might have custom log messages that are allowed, but only for that test (e.g. because they restart the CL node)
+ var belongsToCurrentEnv = func(filePath string) bool {
+ for _, clNode := range b.te.ClCluster.Nodes {
+ if clNode == nil {
continue
}
- // ignore count return, because we are only interested in the error
- _, err := logProcessor.ProcessContainerLogs(b.te.ClCluster.Nodes[i].ContainerName, processFn)
- if err != nil && !strings.Contains(err.Error(), testreporters.MultipleLogsAtLogLevelErr) && !strings.Contains(err.Error(), testreporters.OneLogAtLogLevelErr) {
- b.l.Error().Err(err).Msg("Error processing CL node logs")
- continue
- } else if err != nil && (strings.Contains(err.Error(), testreporters.MultipleLogsAtLogLevelErr) || strings.Contains(err.Error(), testreporters.OneLogAtLogLevelErr)) {
- flushLogStream = true
- b.t.Errorf("Found a concerning log in Chainklink Node logs: %v", err)
- break LogScanningLoop
+ if strings.EqualFold(filePath, clNode.ContainerName+".log") {
+ return true
}
}
- b.l.Info().Msg("Finished scanning Chainlink Node logs for concerning errors")
+ return false
}
- if flushLogStream {
- b.l.Info().Msg("Flushing LogStream logs")
- // we can't do much if this fails, so we just log the error in LogStream
- if err := b.te.LogStream.FlushAndShutdown(); err != nil {
- b.l.Error().Err(err).Msg("Error flushing and shutting down LogStream")
+ fileWalkErr := filepath.Walk(logsDir, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
}
- b.te.LogStream.PrintLogTargetsLocations()
- b.te.LogStream.SaveLogLocationInTestSummary()
- }
- b.l.Info().Msg("Finished shutting down LogStream")
+ if !info.IsDir() && belongsToCurrentEnv(info.Name()) {
+ file, fileErr := os.Open(path)
+ if fileErr != nil {
+ return fmt.Errorf("failed to open file %s: %w", path, fileErr)
+ }
+ logFiles = append(logFiles, file)
+ }
+ return nil
+ })
- if b.t.Failed() || *b.testConfig.GetLoggingConfig().TestLogCollect {
- b.l.Info().Msg("Dump state of all Postgres DBs used by Chainlink Nodes")
+ if len(logFiles) != len(b.te.ClCluster.Nodes) {
+ b.l.Warn().Int("Expected", len(b.te.ClCluster.Nodes)).Int("Got", len(logFiles)).Msg("Number of log files does not match number of nodes. Some logs might be missing.")
+ }
- dbDumpFolder := "db_dumps"
- dbDumpPath := fmt.Sprintf("%s/%s-%s", dbDumpFolder, b.t.Name(), time.Now().Format("2006-01-02T15-04-05"))
- if err := os.MkdirAll(dbDumpPath, os.ModePerm); err != nil {
- b.l.Error().Err(err).Msg("Error creating folder for Postgres DB dump")
- return
+ if fileWalkErr != nil {
+ b.l.Error().Err(fileWalkErr).Msg("Error walking through log files. Skipping log verification.")
+ } else {
+ verifyLogsGroup := &errgroup.Group{}
+ for _, f := range logFiles {
+ file := f
+ verifyLogsGroup.Go(func() error {
+ verifyErr := testreporters.VerifyLogFile(file, b.chainlinkNodeLogScannerSettings.FailingLogLevel, b.chainlinkNodeLogScannerSettings.Threshold, b.chainlinkNodeLogScannerSettings.AllowedMessages...)
+ _ = file.Close()
+ // ignore processing errors
+ if verifyErr != nil && !strings.Contains(verifyErr.Error(), testreporters.MultipleLogsAtLogLevelErr) && !strings.Contains(verifyErr.Error(), testreporters.OneLogAtLogLevelErr) {
+ b.l.Error().Err(verifyErr).Msg("Error processing CL node logs")
+
+ return nil
+
+ // if it's not a processing error, we want to fail the test; we also can stop processing logs all together at this point
+ } else if verifyErr != nil && (strings.Contains(verifyErr.Error(), testreporters.MultipleLogsAtLogLevelErr) || strings.Contains(verifyErr.Error(), testreporters.OneLogAtLogLevelErr)) {
+
+ return verifyErr
+ }
+ return nil
+ })
}
- absDbDumpPath, err := osutil.GetAbsoluteFolderPath(dbDumpFolder)
- if err == nil {
- b.l.Info().Str("Absolute path", absDbDumpPath).Msg("PostgresDB dump folder location")
+ if logVerificationErr := verifyLogsGroup.Wait(); logVerificationErr != nil {
+ b.t.Errorf("Found a concerning log in Chainklink Node logs: %v", logVerificationErr)
}
+ }
+ }
- for i := 0; i < b.clNodesCount; i++ {
+ b.l.Info().Msg("Staring to dump state of all Postgres DBs used by Chainlink Nodes")
+
+ dbDumpFolder := "db_dumps"
+ dbDumpPath := fmt.Sprintf("%s/%s-%s", dbDumpFolder, b.t.Name(), time.Now().Format("2006-01-02T15-04-05"))
+ if err := os.MkdirAll(dbDumpPath, os.ModePerm); err != nil {
+ b.l.Error().Err(err).Msg("Error creating folder for Postgres DB dump")
+ } else {
+ absDbDumpPath, err := osutil.GetAbsoluteFolderPath(dbDumpFolder)
+ if err == nil {
+ b.l.Info().Str("Absolute path", absDbDumpPath).Msg("PostgresDB dump folder location")
+ }
+
+ dbDumpGroup := sync.WaitGroup{}
+ for i := 0; i < b.clNodesCount; i++ {
+ dbDumpGroup.Add(1)
+ go func() {
+ defer dbDumpGroup.Done()
// if something went wrong during environment setup we might not have all nodes, and we don't want an NPE
if b == nil || b.te == nil || b.te.ClCluster == nil || b.te.ClCluster.Nodes == nil || len(b.te.ClCluster.Nodes)-1 < i || b.te.ClCluster.Nodes[i] == nil || b.te.ClCluster.Nodes[i].PostgresDb == nil {
- continue
+ return
}
filePath := filepath.Join(dbDumpPath, fmt.Sprintf("postgres_db_dump_%s.sql", b.te.ClCluster.Nodes[i].ContainerName))
@@ -353,24 +345,23 @@ func (b *CLTestEnvBuilder) Build() (*CLClusterTestEnv, error) {
if err != nil {
b.l.Error().Err(err).Msg("Error creating localDbDumpFile for Postgres DB dump")
_ = localDbDumpFile.Close()
- continue
+ return
}
if err := b.te.ClCluster.Nodes[i].PostgresDb.ExecPgDumpFromContainer(localDbDumpFile); err != nil {
b.l.Error().Err(err).Msg("Error dumping Postgres DB")
}
_ = localDbDumpFile.Close()
- }
- b.l.Info().Msg("Finished dumping state of all Postgres DBs used by Chainlink Nodes")
+ }()
}
- if b.testConfig.GetSethConfig() != nil && ((b.t.Failed() && slices.Contains(b.testConfig.GetSethConfig().TraceOutputs, seth.TraceOutput_DOT) && b.testConfig.GetSethConfig().TracingLevel != seth.TracingLevel_None) || (!b.t.Failed() && slices.Contains(b.testConfig.GetSethConfig().TraceOutputs, seth.TraceOutput_DOT) && b.testConfig.GetSethConfig().TracingLevel == seth.TracingLevel_All)) {
- _ = testsummary.AddEntry(b.t.Name(), "dot_graphs", "true")
- }
- })
- } else {
- b.l.Warn().Msg("LogStream won't be cleaned up, because either test instance is not set or cleanup type is set to none")
- }
+ dbDumpGroup.Wait()
+
+ b.l.Info().Msg("Finished dumping state of all Postgres DBs used by Chainlink Nodes")
+ }
+ })
+ } else {
+ b.l.Warn().Msg("Won't dump container and postgres logs, because either test instance is not set or cleanup type is set to none")
}
if b.hasKillgrave {
@@ -378,7 +369,7 @@ func (b *CLTestEnvBuilder) Build() (*CLClusterTestEnv, error) {
return nil, fmt.Errorf("test environment builder failed: %w", fmt.Errorf("cannot start mock adapter without a network"))
}
- b.te.MockAdapter = test_env.NewKillgrave([]string{b.te.DockerNetwork.Name}, "", test_env.WithLogStream(b.te.LogStream))
+ b.te.MockAdapter = test_env.NewKillgrave([]string{b.te.DockerNetwork.Name}, "")
err = b.te.StartMockAdapter()
if err != nil {
@@ -406,10 +397,6 @@ func (b *CLTestEnvBuilder) Build() (*CLClusterTestEnv, error) {
return b.te, fmt.Errorf("test environment builder failed: %w", fmt.Errorf("explicit cleanup type must be set when building test environment"))
}
- if b.te.LogStream == nil && b.chainlinkNodeLogScannerSettings != nil {
- log.Warn().Msg("Chainlink node log scanner settings provided, but LogStream is not enabled. Ignoring Chainlink node log scanner settings, as no logs will be available.")
- }
-
if b.jdConfig != nil {
err := b.te.StartJobDistributor(b.jdConfig)
if err != nil {
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index d94c15de0cb..1c63ac6738e 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -46,15 +46,15 @@ require (
github.com/slack-go/slack v0.15.0
github.com/smartcontractkit/chain-selectors v1.0.34
github.com/smartcontractkit/chainlink-automation v0.8.1
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0
- github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000
+ github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2
- github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.18
+ github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.19
github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0
github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.9
github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2
- github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12
+ github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919
github.com/spf13/cobra v1.8.1
github.com/stretchr/testify v1.9.0
github.com/subosito/gotenv v1.6.0
@@ -64,10 +64,10 @@ require (
go.uber.org/atomic v1.11.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.28.0
+ golang.org/x/crypto v0.31.0
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c
- golang.org/x/sync v0.8.0
- golang.org/x/text v0.19.0
+ golang.org/x/sync v0.10.0
+ golang.org/x/text v0.21.0
google.golang.org/grpc v1.67.1
gopkg.in/guregu/null.v4 v4.0.0
k8s.io/apimachinery v0.31.2
@@ -105,7 +105,7 @@ require (
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
github.com/XSAM/otelsql v0.27.0 // indirect
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect
- github.com/andybalholm/brotli v1.1.0 // indirect
+ github.com/andybalholm/brotli v1.1.1 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect
@@ -245,7 +245,7 @@ require (
github.com/go-viper/mapstructure/v2 v2.1.0 // indirect
github.com/go-webauthn/webauthn v0.9.4 // indirect
github.com/go-webauthn/x v0.1.5 // indirect
- github.com/goccy/go-json v0.10.2 // indirect
+ github.com/goccy/go-json v0.10.3 // indirect
github.com/goccy/go-yaml v1.12.0 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
github.com/gofrs/flock v0.8.1 // indirect
@@ -337,8 +337,8 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/julienschmidt/httprouter v1.3.0 // indirect
github.com/kelseyhightower/envconfig v1.4.0 // indirect
- github.com/klauspost/compress v1.17.9 // indirect
- github.com/klauspost/cpuid/v2 v2.2.7 // indirect
+ github.com/klauspost/compress v1.17.11 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
@@ -423,12 +423,12 @@ 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/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 // indirect
+ github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e // indirect
- github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db // indirect
+ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 // indirect
github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect
- github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 // indirect
- github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc // indirect
+ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect
+ github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce // indirect
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 // indirect
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect
@@ -509,8 +509,8 @@ require (
golang.org/x/mod v0.21.0 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/oauth2 v0.23.0 // indirect
- golang.org/x/sys v0.26.0 // indirect
- golang.org/x/term v0.25.0 // indirect
+ golang.org/x/sys v0.28.0 // indirect
+ golang.org/x/term v0.27.0 // indirect
golang.org/x/time v0.7.0 // indirect
golang.org/x/tools v0.26.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index 49e87a613fd..1baff05f3f1 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -180,9 +180,11 @@ github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2uc
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
-github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
+github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g6V7ZM=
+github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
@@ -239,6 +241,8 @@ github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQ
github.com/aws/jsii-runtime-go v1.104.0/go.mod h1:7ZmQXxV0AAhhvv/GaHX4n6zbgA1tSRVdnQYAJbIhXHk=
github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM=
github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0=
@@ -274,6 +278,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA=
@@ -543,6 +549,8 @@ github.com/gagliardetto/solana-go v1.8.4 h1:vmD/JmTlonyXGy39bAo0inMhmbdAwV7rXZtL
github.com/gagliardetto/solana-go v1.8.4/go.mod h1:i+7aAyNDTHG0jK8GZIBSI4OVvDqkt2Qx+LklYclRNG8=
github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw=
github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok=
+github.com/gagliardetto/utilz v0.1.1 h1:/etW4hl607emKg6R6Lj9jRJ9d6ue2AQOyjhuAwjzs1U=
+github.com/gagliardetto/utilz v0.1.1/go.mod h1:b+rGFkRHz3HWJD0RYMzat47JyvbTtpE0iEcYTRJTLLA=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ=
@@ -550,8 +558,8 @@ github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9y
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk=
-github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI=
+github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
+github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E=
github.com/gin-contrib/expvar v0.0.1 h1:IuU5ArEgihz50vG8Onrwz22kJr7Mcvgv9xSSpfU5g+w=
github.com/gin-contrib/expvar v0.0.1/go.mod h1:8o2CznfQi1JjktORdHr2/abg3wSV6OCnXh0yGypvvVw=
github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE=
@@ -642,8 +650,8 @@ github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0=
github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY=
github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg=
github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM=
github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU=
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0=
@@ -711,6 +719,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI=
+github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -836,6 +846,8 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=
github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/api v1.29.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw=
github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk=
@@ -1039,11 +1051,11 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
-github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
+github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
-github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
+github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00=
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM=
@@ -1100,6 +1112,8 @@ github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYt
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk=
+github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ=
+github.com/marcboeker/go-duckdb v1.8.3/go.mod h1:C9bYRE1dPYb1hhfu/SSomm78B0FXmNgRvv6YBW/Hooc=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -1279,8 +1293,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
-github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
-github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
@@ -1373,6 +1387,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
+github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
@@ -1424,34 +1440,34 @@ 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.15.0 h1:LE2lj2y9vqqiOf+qIIy0GvEoxgF1N5yLGZffmEZykt0=
github.com/slack-go/slack v0.15.0/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 h1:qQH6fZZe31nBAG6INHph3z5ysDTPptyu0TR9uoJ1+ok=
-github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86/go.mod h1:WtWOoVQQEHxRHL2hNmuRrvDfYfQG/CioFNoa9Rr2mBE=
+github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix h1:DPJD++yKLSx0EfT+U14P8vLVxjXFmoIETiCO9lVwQo8=
+github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY=
github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3fePb3eCreuAnUA3RBj4=
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0 h1:/1L+v4SxUD2K5RMRbfByyLfePMAgQKeD0onSetPnGmA=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000 h1:6Zzr/R1j6P7bbvcUlt5WUIbItvrrGdGzIsiAzQezcwo=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000/go.mod h1:ncjd6mPZSRlelEqH/2KeLE1pU3UlqzBSn8RYkEoECzY=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550 h1:rRs74zjDJ7do5aYEXSU/sOnLnlbYCNqM8BrvEx/0NH8=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550/go.mod h1:yti7e1+G9hhkYhj+L5sVUULn9Bn3bBL5/AxaNqdJ5YQ=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e/go.mod h1:mUh5/woemsVaHgTorA080hrYmO3syBCmPdnWc/5dOqk=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db h1:N1RH1hSr2ACzOFc9hkCcjE8pRBTdcU3p8nsTJByaLes=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db/go.mod h1:yjb9d4q7+m8aGbjfTbkNoNuA4PeSxcUszsSZHDrvS0E=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 h1:aeiBdBHGY8QNftps+VqrIk6OnfeeOD5z4jrAabW4ZSc=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3/go.mod h1:AS6zY2BkcRwfiGzNabGbHhfrLSrXrcI/GmjnT4jQ5/s=
github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c=
github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 h1:onBe3DqNrbtOAzKS4PrPIiJX65BGo1aYiYZxFVEW+jc=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc h1:dssRwJhmzJkUN/OajaDj2GsxBn+Tupk3bI1BkPEoJg0=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc/go.mod h1:p8aUDfJeley6oer7y+Ucd3edOtRlMTnWg3mN6rhaLWo=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce h1:Mvpbr/Fi2IdU2EcmqCxhlCzs5ncnx+BwV80YweA4DZs=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce/go.mod h1:qq+nW0JDnCCGMf2c38ZHjH8xgkAQnXKighjJr5JdDNE=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 h1:tNS7U9lrxkFvEuyxQv11HHOiV9LPDGC9wYEy+yM/Jv4=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8/go.mod h1:EBrEgcdIbwepqguClkv8Ohy7CbyWSJaE4EC9aBJlQK0=
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE=
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2/go.mod h1:DsT43c1oTBmp3iQkMcoZOoKThwZvt8X3Pz6UmznJ4GY=
-github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.18 h1:a3xetGZh2nFO1iX5xd9OuqiCkgbWLvW6fTN6fgVubPo=
-github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.18/go.mod h1:NwmlNKqrb02v4Sci4b5KW644nfH2BW+FrKbWwTN5r6M=
+github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.19 h1:9PMwKNqFKc5FXf4VchyD3CGzZelnSgi13fgVdT2X7T4=
+github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.19/go.mod h1:ag7LEgejsVtPXaUNkcoFPpAoDkl1J8V2HSbqVUxfEtk=
github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 h1:VIxK8u0Jd0Q/VuhmsNm6Bls6Tb31H/sA3A/rbc5hnhg=
github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0/go.mod h1:lyAu+oMXdNUzEDScj2DXB2IueY+SDXPPfyl/kb63tMM=
github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.9 h1:yB1x5UXvpZNka+5h57yo1/GrKfXKCqMzChCISpldZx4=
@@ -1460,8 +1476,8 @@ github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 h1:7bCdbTUW
github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2/go.mod h1:MltlNu3jcXm/DyLN98I5TFNtu/o1NNAcaPAFKMXWk70=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12 h1:NzZGjaqez21I3DU7objl3xExTH4fxYvzTqar8DC6360=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc=
@@ -1614,6 +1630,8 @@ github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
+github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
+github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1625,6 +1643,8 @@ github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE
github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U=
github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
@@ -1772,8 +1792,8 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1903,8 +1923,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -2000,8 +2020,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -2012,8 +2032,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -2028,8 +2048,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod
index f73d84e3fc5..04f9b07f93b 100644
--- a/integration-tests/load/go.mod
+++ b/integration-tests/load/go.mod
@@ -27,8 +27,8 @@ require (
github.com/pkg/errors v0.9.1
github.com/rs/zerolog v1.33.0
github.com/slack-go/slack v0.15.0
- github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83
- github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.18
+ github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550
+ github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.19
github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.9
github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de
@@ -72,7 +72,7 @@ require (
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
github.com/XSAM/otelsql v0.27.0 // indirect
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect
- github.com/andybalholm/brotli v1.1.0 // indirect
+ github.com/andybalholm/brotli v1.1.1 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect
@@ -216,7 +216,7 @@ require (
github.com/go-viper/mapstructure/v2 v2.1.0 // indirect
github.com/go-webauthn/webauthn v0.9.4 // indirect
github.com/go-webauthn/x v0.1.5 // indirect
- github.com/goccy/go-json v0.10.2 // indirect
+ github.com/goccy/go-json v0.10.3 // indirect
github.com/goccy/go-yaml v1.12.0 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
github.com/gofrs/flock v0.8.1 // indirect
@@ -312,8 +312,8 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/julienschmidt/httprouter v1.3.0 // indirect
github.com/kelseyhightower/envconfig v1.4.0 // indirect
- github.com/klauspost/compress v1.17.9 // indirect
- github.com/klauspost/cpuid/v2 v2.2.7 // indirect
+ github.com/klauspost/compress v1.17.11 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
@@ -398,6 +398,7 @@ require (
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
github.com/segmentio/ksuid v1.0.4 // indirect
github.com/sercand/kuberesolver/v5 v5.1.1 // indirect
+ 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/shoenig/go-m1cpu v0.1.6 // indirect
@@ -406,17 +407,17 @@ require (
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/smartcontractkit/chain-selectors v1.0.34 // indirect
github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0 // indirect
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e // indirect
- github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db // indirect
+ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 // indirect
github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect
- github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 // indirect
- github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc // indirect
+ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect
+ github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce // indirect
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 // indirect
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 // indirect
github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect
- github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12 // indirect
+ github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 // indirect
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect
github.com/smartcontractkit/wsrpc v0.8.3 // indirect
github.com/soheilhy/cmux v0.1.5 // indirect
@@ -498,14 +499,14 @@ require (
go.uber.org/zap v1.27.0 // indirect
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect
golang.org/x/arch v0.11.0 // indirect
- golang.org/x/crypto v0.28.0 // indirect
+ golang.org/x/crypto v0.31.0 // indirect
golang.org/x/mod v0.21.0 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/oauth2 v0.23.0 // indirect
- golang.org/x/sync v0.8.0 // indirect
- golang.org/x/sys v0.26.0 // indirect
- golang.org/x/term v0.25.0 // indirect
- golang.org/x/text v0.19.0 // indirect
+ golang.org/x/sync v0.10.0 // indirect
+ golang.org/x/sys v0.28.0 // indirect
+ golang.org/x/term v0.27.0 // indirect
+ golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.7.0 // indirect
golang.org/x/tools v0.26.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum
index 3bc63a508ac..48bdf1cb5b1 100644
--- a/integration-tests/load/go.sum
+++ b/integration-tests/load/go.sum
@@ -184,9 +184,11 @@ github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2uc
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
-github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
+github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g6V7ZM=
+github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
@@ -243,6 +245,8 @@ github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQ
github.com/aws/jsii-runtime-go v1.104.0/go.mod h1:7ZmQXxV0AAhhvv/GaHX4n6zbgA1tSRVdnQYAJbIhXHk=
github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM=
github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo=
+github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0=
@@ -278,6 +282,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4=
+github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA=
@@ -537,6 +543,8 @@ github.com/gagliardetto/solana-go v1.8.4 h1:vmD/JmTlonyXGy39bAo0inMhmbdAwV7rXZtL
github.com/gagliardetto/solana-go v1.8.4/go.mod h1:i+7aAyNDTHG0jK8GZIBSI4OVvDqkt2Qx+LklYclRNG8=
github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw=
github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok=
+github.com/gagliardetto/utilz v0.1.1 h1:/etW4hl607emKg6R6Lj9jRJ9d6ue2AQOyjhuAwjzs1U=
+github.com/gagliardetto/utilz v0.1.1/go.mod h1:b+rGFkRHz3HWJD0RYMzat47JyvbTtpE0iEcYTRJTLLA=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ=
@@ -544,8 +552,8 @@ github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9y
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk=
-github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI=
+github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
+github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E=
github.com/gin-contrib/expvar v0.0.1 h1:IuU5ArEgihz50vG8Onrwz22kJr7Mcvgv9xSSpfU5g+w=
github.com/gin-contrib/expvar v0.0.1/go.mod h1:8o2CznfQi1JjktORdHr2/abg3wSV6OCnXh0yGypvvVw=
github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE=
@@ -636,8 +644,8 @@ github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0=
github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY=
github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg=
github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM=
github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU=
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0=
@@ -705,6 +713,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI=
+github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -834,6 +844,8 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=
github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ=
+github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/api v1.29.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw=
github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk=
@@ -1035,11 +1047,11 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
-github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
+github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
-github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
+github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00=
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM=
@@ -1094,6 +1106,8 @@ github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYt
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U=
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk=
+github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ=
+github.com/marcboeker/go-duckdb v1.8.3/go.mod h1:C9bYRE1dPYb1hhfu/SSomm78B0FXmNgRvv6YBW/Hooc=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -1269,8 +1283,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU=
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
-github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
-github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
@@ -1363,6 +1377,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
+github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
@@ -1415,34 +1431,34 @@ 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.15.0 h1:LE2lj2y9vqqiOf+qIIy0GvEoxgF1N5yLGZffmEZykt0=
github.com/slack-go/slack v0.15.0/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86 h1:qQH6fZZe31nBAG6INHph3z5ysDTPptyu0TR9uoJ1+ok=
-github.com/smartcontractkit/ccip-owner-contracts v0.0.0-20240926212305-a6deabdfce86/go.mod h1:WtWOoVQQEHxRHL2hNmuRrvDfYfQG/CioFNoa9Rr2mBE=
+github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix h1:DPJD++yKLSx0EfT+U14P8vLVxjXFmoIETiCO9lVwQo8=
+github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY=
github.com/smartcontractkit/chain-selectors v1.0.34 h1:MJ17OGu8+jjl426pcKrJkCf3fePb3eCreuAnUA3RBj4=
github.com/smartcontractkit/chain-selectors v1.0.34/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8=
github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU=
github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0 h1:/1L+v4SxUD2K5RMRbfByyLfePMAgQKeD0onSetPnGmA=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20241211150100-7683331f64a0/go.mod h1:F8xQAIW0ymb2BZhqn89sWZLXreJhM5KDVF6Qb4y44N0=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83 h1:NjrU7KOn3Tk+C6QFo9tQBqeotPKytpBwhn/J1s+yiiY=
-github.com/smartcontractkit/chainlink-common v0.3.1-0.20241210192653-a9c706f99e83/go.mod h1:bQktEJf7sJ0U3SmIcXvbGUox7SmXcnSEZ4kUbT8R5Nk=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000 h1:6Zzr/R1j6P7bbvcUlt5WUIbItvrrGdGzIsiAzQezcwo=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20241218114855-f74219171000/go.mod h1:ncjd6mPZSRlelEqH/2KeLE1pU3UlqzBSn8RYkEoECzY=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550 h1:rRs74zjDJ7do5aYEXSU/sOnLnlbYCNqM8BrvEx/0NH8=
+github.com/smartcontractkit/chainlink-common v0.4.1-0.20241223143929-db7919d60550/go.mod h1:yti7e1+G9hhkYhj+L5sVUULn9Bn3bBL5/AxaNqdJ5YQ=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e h1:PRoeby6ZlTuTkv2f+7tVU4+zboTfRzI+beECynF4JQ0=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241202195413-82468150ac1e/go.mod h1:mUh5/woemsVaHgTorA080hrYmO3syBCmPdnWc/5dOqk=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db h1:N1RH1hSr2ACzOFc9hkCcjE8pRBTdcU3p8nsTJByaLes=
-github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241202141438-a90db35252db/go.mod h1:yjb9d4q7+m8aGbjfTbkNoNuA4PeSxcUszsSZHDrvS0E=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3 h1:aeiBdBHGY8QNftps+VqrIk6OnfeeOD5z4jrAabW4ZSc=
+github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241216163550-fa030d178ba3/go.mod h1:AS6zY2BkcRwfiGzNabGbHhfrLSrXrcI/GmjnT4jQ5/s=
github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c=
github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2 h1:onBe3DqNrbtOAzKS4PrPIiJX65BGo1aYiYZxFVEW+jc=
-github.com/smartcontractkit/chainlink-protos/orchestrator v0.3.2/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc h1:dssRwJhmzJkUN/OajaDj2GsxBn+Tupk3bI1BkPEoJg0=
-github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241210172617-6fd1891d0fbc/go.mod h1:p8aUDfJeley6oer7y+Ucd3edOtRlMTnWg3mN6rhaLWo=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ=
+github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce h1:Mvpbr/Fi2IdU2EcmqCxhlCzs5ncnx+BwV80YweA4DZs=
+github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241223151630-eac4f1508dce/go.mod h1:qq+nW0JDnCCGMf2c38ZHjH8xgkAQnXKighjJr5JdDNE=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8 h1:tNS7U9lrxkFvEuyxQv11HHOiV9LPDGC9wYEy+yM/Jv4=
github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241202202529-2033490e77b8/go.mod h1:EBrEgcdIbwepqguClkv8Ohy7CbyWSJaE4EC9aBJlQK0=
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE=
github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2/go.mod h1:DsT43c1oTBmp3iQkMcoZOoKThwZvt8X3Pz6UmznJ4GY=
-github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.18 h1:a3xetGZh2nFO1iX5xd9OuqiCkgbWLvW6fTN6fgVubPo=
-github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.18/go.mod h1:NwmlNKqrb02v4Sci4b5KW644nfH2BW+FrKbWwTN5r6M=
+github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.19 h1:9PMwKNqFKc5FXf4VchyD3CGzZelnSgi13fgVdT2X7T4=
+github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.19/go.mod h1:ag7LEgejsVtPXaUNkcoFPpAoDkl1J8V2HSbqVUxfEtk=
github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 h1:VIxK8u0Jd0Q/VuhmsNm6Bls6Tb31H/sA3A/rbc5hnhg=
github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0/go.mod h1:lyAu+oMXdNUzEDScj2DXB2IueY+SDXPPfyl/kb63tMM=
github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.9 h1:yB1x5UXvpZNka+5h57yo1/GrKfXKCqMzChCISpldZx4=
@@ -1451,8 +1467,8 @@ github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 h1:7bCdbTUW
github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2/go.mod h1:MltlNu3jcXm/DyLN98I5TFNtu/o1NNAcaPAFKMXWk70=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs=
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12 h1:NzZGjaqez21I3DU7objl3xExTH4fxYvzTqar8DC6360=
-github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg=
+github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc=
@@ -1605,6 +1621,8 @@ github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
+github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
+github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1616,6 +1634,8 @@ github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE
github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U=
github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
@@ -1763,8 +1783,8 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1894,8 +1914,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1989,8 +2009,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -2001,8 +2021,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
-golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -2017,8 +2037,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff --git a/integration-tests/smoke/ccip/ccip_batching_test.go b/integration-tests/smoke/ccip/ccip_batching_test.go
index 58f4e922ac5..3752faa4e6e 100644
--- a/integration-tests/smoke/ccip/ccip_batching_test.go
+++ b/integration-tests/smoke/ccip/ccip_batching_test.go
@@ -63,8 +63,8 @@ func newBatchTestSetup(t *testing.T) batchTestSetup {
)
// connect sourceChain1 and sourceChain2 to destChain
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(e.Env, state, sourceChain1, destChain, false))
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(e.Env, state, sourceChain2, destChain, false))
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &e, state, sourceChain1, destChain, false)
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &e, state, sourceChain2, destChain, false)
return batchTestSetup{e, state, sourceChain1, sourceChain2, destChain}
}
diff --git a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go
index 48d9061ec63..3b0ebf22455 100644
--- a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go
+++ b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go
@@ -2,14 +2,13 @@ package smoke
import (
"context"
- "fmt"
"math/big"
"testing"
"time"
- "github.com/pkg/errors"
+ "github.com/smartcontractkit/chainlink-common/pkg/config"
- commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
+ commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset"
testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -17,14 +16,12 @@ import (
"github.com/test-go/testify/require"
"golang.org/x/exp/maps"
- "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
- "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter"
-
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm"
+
"github.com/smartcontractkit/chainlink/deployment"
"github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp"
@@ -39,20 +36,17 @@ var (
func Test_CCIPFeeBoosting(t *testing.T) {
e, _ := testsetups.NewIntegrationEnvironment(
t,
- // TODO check if test should use these overrides
- /* changeset.WithOCRConfigOverride(func(params changeset.CCIPOCRParams) changeset.CCIPOCRParams {
- // Only 1 boost (=OCR round) is enough to cover the fee
- params.ExecuteOffChainConfig.RelativeBoostPerWaitHour = 10
- // Disable token price updates
- params.CommitOffChainConfig.TokenPriceBatchWriteFrequency = *config.MustNewDuration(1_000_000 * time.Hour)
- // Disable gas price updates
- params.CommitOffChainConfig.RemoteGasPriceBatchWriteFrequency = *config.MustNewDuration(1_000_000 * time.Hour)
- // Disable token price updates
- params.CommitOffChainConfig.TokenInfo = nil
- return params
- }),
-
- */
+ changeset.WithOCRConfigOverride(func(params changeset.CCIPOCRParams) changeset.CCIPOCRParams {
+ // Only 1 boost (=OCR round) is enough to cover the fee
+ params.ExecuteOffChainConfig.RelativeBoostPerWaitHour = 10
+ // Disable token price updates
+ params.CommitOffChainConfig.TokenPriceBatchWriteFrequency = *config.MustNewDuration(1_000_000 * time.Hour)
+ // Disable gas price updates
+ params.CommitOffChainConfig.RemoteGasPriceBatchWriteFrequency = *config.MustNewDuration(1_000_000 * time.Hour)
+ // Disable token price updates
+ params.CommitOffChainConfig.TokenInfo = nil
+ return params
+ }),
)
state, err := changeset.LoadOnchainState(e.Env)
@@ -69,7 +63,9 @@ func Test_CCIPFeeBoosting(t *testing.T) {
", dest chain selector:", destChain,
)
- fetchedGasPriceDest, err := e.Env.Chains[destChain].Client.SuggestGasPrice(tests.Context(t))
+ // TODO: discrepancy between client and the gas estimator gas price to be fixed - hardcoded for now
+ // fetchedGasPriceDest, err := e.Env.Chains[destChain].Client.SuggestGasPrice(tests.Context(t))
+ fetchedGasPriceDest := big.NewInt(20e9) // 20 Gwei = default gas price
require.NoError(t, err)
originalGasPriceDestUSD := new(big.Int).Div(
new(big.Int).Mul(fetchedGasPriceDest, wethPrice),
@@ -85,32 +81,31 @@ func Test_CCIPFeeBoosting(t *testing.T) {
)
t.Log("Adjusted gas price on dest chain:", adjustedGasPriceDest)
- initialPrices := changeset.InitialPrices{
- LinkPrice: linkPrice,
- WethPrice: wethPrice,
- GasPrice: changeset.ToPackedFee(adjustedGasPriceDest, big.NewInt(0)),
- }
-
- laneCfg := changeset.LaneConfig{
- SourceSelector: sourceChain,
- DestSelector: destChain,
- InitialPricesBySource: initialPrices,
- FeeQuoterDestChain: changeset.DefaultFeeQuoterDestChainConfig(),
- TestRouter: false,
- }
-
- e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{
- {
- Changeset: commonchangeset.WrapChangeSet(changeset.AddLanes),
- Config: changeset.AddLanesConfig{LaneConfigs: []changeset.LaneConfig{laneCfg}},
+ changeset.AddLane(t, &e, sourceChain, destChain, false,
+ map[uint64]*big.Int{
+ destChain: changeset.ToPackedFee(adjustedGasPriceDest, big.NewInt(0)),
},
- })
- require.NoError(t, err)
+ map[common.Address]*big.Int{
+ state.Chains[sourceChain].LinkToken.Address(): linkPrice,
+ state.Chains[sourceChain].Weth9.Address(): wethPrice,
+ },
+ changeset.DefaultFeeQuoterDestChainConfig())
// Update token prices in destination chain FeeQuoter
- err = updateTokensPrices(e, state, destChain, map[common.Address]*big.Int{
- state.Chains[destChain].LinkToken.Address(): linkPrice,
- state.Chains[destChain].Weth9.Address(): wethPrice,
+ e.Env, err = commoncs.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commoncs.ChangesetApplication{
+ {
+ Changeset: commoncs.WrapChangeSet(changeset.UpdateFeeQuoterPricesCS),
+ Config: changeset.UpdateFeeQuoterPricesConfig{
+ PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{
+ destChain: {
+ TokenPrices: map[common.Address]*big.Int{
+ state.Chains[destChain].LinkToken.Address(): linkPrice,
+ state.Chains[destChain].Weth9.Address(): wethPrice,
+ },
+ },
+ },
+ },
+ },
})
require.NoError(t, err)
@@ -138,7 +133,20 @@ func Test_CCIPFeeBoosting(t *testing.T) {
DestChainSelector: destChain,
}] = []uint64{msgSentEvent.SequenceNumber}
- err = updateGasPrice(e, state, sourceChain, destChain, originalGasPriceDestUSD)
+ e.Env, err = commoncs.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commoncs.ChangesetApplication{
+ {
+ Changeset: commoncs.WrapChangeSet(changeset.UpdateFeeQuoterPricesCS),
+ Config: changeset.UpdateFeeQuoterPricesConfig{
+ PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{
+ sourceChain: {
+ GasPrices: map[uint64]*big.Int{
+ destChain: originalGasPriceDestUSD,
+ },
+ },
+ },
+ },
+ },
+ })
require.NoError(t, err)
// Confirm gas prices are updated
@@ -271,61 +279,3 @@ func convertToMessage(msg onramp.InternalEVM2AnyRampMessage) cciptypes.Message {
TokenAmounts: tokenAmounts,
}
}
-
-func updateGasPrice(env changeset.DeployedEnv, state changeset.CCIPOnChainState, srcChain, destChain uint64, gasPrice *big.Int) error {
- chainState, exists := state.Chains[srcChain]
- if !exists {
- return fmt.Errorf("chain state not found for selector: %d", srcChain)
- }
-
- feeQuoter := chainState.FeeQuoter
- // Update gas price
- auth := env.Env.Chains[srcChain].DeployerKey
- tx, err := feeQuoter.UpdatePrices(auth, fee_quoter.InternalPriceUpdates{
- TokenPriceUpdates: nil,
- GasPriceUpdates: []fee_quoter.InternalGasPriceUpdate{
- {
- DestChainSelector: destChain,
- UsdPerUnitGas: gasPrice,
- },
- },
- })
- if err != nil {
- return errors.Wrapf(err, "updating gas price on chain %d", srcChain)
- }
- if _, err := deployment.ConfirmIfNoError(env.Env.Chains[srcChain], tx, err); err != nil {
- return err
- }
-
- return nil
-}
-
-func updateTokensPrices(env changeset.DeployedEnv, state changeset.CCIPOnChainState, chain uint64, tokenPrices map[common.Address]*big.Int) error {
- chainState, exists := state.Chains[chain]
- if !exists {
- return fmt.Errorf("chain state not found for selector: %d", chain)
- }
-
- feeQuoter := chainState.FeeQuoter
- // Update token prices
- auth := env.Env.Chains[chain].DeployerKey
- tokenPricesUpdates := make([]fee_quoter.InternalTokenPriceUpdate, 0, len(tokenPrices))
- for token, price := range tokenPrices {
- tokenPricesUpdates = append(tokenPricesUpdates, fee_quoter.InternalTokenPriceUpdate{
- SourceToken: token,
- UsdPerToken: price,
- })
- }
- tx, err := feeQuoter.UpdatePrices(auth, fee_quoter.InternalPriceUpdates{
- TokenPriceUpdates: tokenPricesUpdates,
- GasPriceUpdates: nil,
- })
- if err != nil {
- return errors.Wrapf(err, "updating token prices on chain %d", chain)
- }
- if _, err := deployment.ConfirmIfNoError(env.Env.Chains[chain], tx, err); err != nil {
- return err
- }
-
- return nil
-}
diff --git a/integration-tests/smoke/ccip/ccip_fees_test.go b/integration-tests/smoke/ccip/ccip_fees_test.go
index 55788a4aa5f..57a6bc58d82 100644
--- a/integration-tests/smoke/ccip/ccip_fees_test.go
+++ b/integration-tests/smoke/ccip/ccip_fees_test.go
@@ -130,7 +130,7 @@ func Test_CCIPFees(t *testing.T) {
changeset.ReplayLogs(t, e.Offchain, tenv.ReplayBlocks)
// Add all lanes
- require.NoError(t, changeset.AddLanesForAll(e, state))
+ changeset.AddLanesForAll(t, &tenv, state)
t.Run("Send programmable token transfer pay with Link token", func(t *testing.T) {
runFeeTokenTestCase(feeTokenTestCase{
diff --git a/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go b/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go
index d11e4304366..2c1d97f6c12 100644
--- a/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go
+++ b/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go
@@ -34,7 +34,7 @@ func Test_CCIPGasPriceUpdates(t *testing.T) {
)
state, err := changeset.LoadOnchainState(e.Env)
require.NoError(t, err)
- require.NoError(t, changeset.AddLanesForAll(e.Env, state))
+ changeset.AddLanesForAll(t, &e, state)
allChainSelectors := maps.Keys(e.Env.Chains)
assert.GreaterOrEqual(t, len(allChainSelectors), 2, "test requires at least 2 chains")
diff --git a/integration-tests/smoke/ccip/ccip_legacy_test.go b/integration-tests/smoke/ccip/ccip_legacy_test.go
new file mode 100644
index 00000000000..2b5b6d77b58
--- /dev/null
+++ b/integration-tests/smoke/ccip/ccip_legacy_test.go
@@ -0,0 +1,51 @@
+package smoke
+
+import (
+ "context"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
+ "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5"
+ testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router"
+)
+
+// This test does not run in CI, it is only written as an example of how to write a test for the legacy CCIP
+func TestE2ELegacy(t *testing.T) {
+ e, _ := testsetups.NewIntegrationEnvironment(t, changeset.WithLegacyDeployment())
+ state, err := changeset.LoadOnchainState(e.Env)
+ require.NoError(t, err)
+ allChains := e.Env.AllChainSelectors()
+ require.Len(t, allChains, 2)
+ src, dest := allChains[0], allChains[1]
+ srcChain := e.Env.Chains[src]
+ destChain := e.Env.Chains[dest]
+ pairs := []changeset.SourceDestPair{
+ {SourceChainSelector: src, DestChainSelector: dest},
+ }
+ e.Env = v1_5.AddLanes(t, e.Env, state, pairs)
+ // reload state after adding lanes
+ state, err = changeset.LoadOnchainState(e.Env)
+ require.NoError(t, err)
+ sentEvent, err := v1_5.SendRequest(t, e.Env, state,
+ changeset.WithSourceChain(src),
+ changeset.WithDestChain(dest),
+ changeset.WithTestRouter(false),
+ changeset.WithEvm2AnyMessage(router.ClientEVM2AnyMessage{
+ Receiver: common.LeftPadBytes(state.Chains[dest].Receiver.Address().Bytes(), 32),
+ Data: []byte("hello"),
+ TokenAmounts: nil,
+ FeeToken: common.HexToAddress("0x0"),
+ ExtraArgs: nil,
+ }),
+ )
+ require.NoError(t, err)
+ require.NotNil(t, sentEvent)
+ destStartBlock, err := destChain.Client.HeaderByNumber(context.Background(), nil)
+ require.NoError(t, err)
+ v1_5.WaitForCommit(t, srcChain, destChain, state.Chains[dest].CommitStore[src], sentEvent.Message.SequenceNumber)
+ v1_5.WaitForExecute(t, srcChain, destChain, state.Chains[dest].EVM2EVMOffRamp[src], []uint64{sentEvent.Message.SequenceNumber}, destStartBlock.Number.Uint64())
+}
diff --git a/integration-tests/smoke/ccip/ccip_message_limitations_test.go b/integration-tests/smoke/ccip/ccip_message_limitations_test.go
index 9398fd9f932..f9299b735d0 100644
--- a/integration-tests/smoke/ccip/ccip_message_limitations_test.go
+++ b/integration-tests/smoke/ccip/ccip_message_limitations_test.go
@@ -29,7 +29,7 @@ func Test_CCIPMessageLimitations(t *testing.T) {
onChainState, err := changeset.LoadOnchainState(testEnv.Env)
require.NoError(t, err)
- require.NoError(t, changeset.AddLanesForAll(testEnv.Env, onChainState))
+ changeset.AddLanesForAll(t, &testEnv, onChainState)
srcToken, _ := setupTokens(
t,
diff --git a/integration-tests/smoke/ccip/ccip_messaging_test.go b/integration-tests/smoke/ccip/ccip_messaging_test.go
index 13f14fcda16..8ee18a31918 100644
--- a/integration-tests/smoke/ccip/ccip_messaging_test.go
+++ b/integration-tests/smoke/ccip/ccip_messaging_test.go
@@ -63,7 +63,7 @@ func Test_CCIPMessaging(t *testing.T) {
", dest chain selector:", destChain,
)
// connect a single lane, source to dest
- require.NoError(t, changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(e.Env, state, sourceChain, destChain, false))
+ changeset.AddLaneWithDefaultPricesAndFeeQuoterConfig(t, &e, state, sourceChain, destChain, false)
var (
replayed bool
diff --git a/integration-tests/smoke/ccip/ccip_ooo_execution_test.go b/integration-tests/smoke/ccip/ccip_ooo_execution_test.go
index 19c36c6e021..e3da473984d 100644
--- a/integration-tests/smoke/ccip/ccip_ooo_execution_test.go
+++ b/integration-tests/smoke/ccip/ccip_ooo_execution_test.go
@@ -86,7 +86,7 @@ func Test_OutOfOrderExecution(t *testing.T) {
},
},
)
- require.NoError(t, changeset.AddLanesForAll(e, state))
+ changeset.AddLanesForAll(t, &tenv, state)
tokenTransfer := []router.ClientEVMTokenAmount{
{
diff --git a/integration-tests/smoke/ccip/ccip_rmn_test.go b/integration-tests/smoke/ccip/ccip_rmn_test.go
index adf07be290f..a3877013103 100644
--- a/integration-tests/smoke/ccip/ccip_rmn_test.go
+++ b/integration-tests/smoke/ccip/ccip_rmn_test.go
@@ -18,11 +18,12 @@ import (
"github.com/rs/zerolog"
"github.com/stretchr/testify/require"
- "github.com/smartcontractkit/chainlink-ccip/pkg/reader"
"github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/osutil"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
+ "github.com/smartcontractkit/chainlink-ccip/pkg/reader"
+
"github.com/smartcontractkit/chainlink/deployment/ccip/changeset"
"github.com/smartcontractkit/chainlink/deployment/environment/devenv"
@@ -178,11 +179,14 @@ func TestRMN_DifferentRmnNodesForDifferentChains(t *testing.T) {
func TestRMN_TwoMessagesOneSourceChainCursed(t *testing.T) {
runRmnTestCase(t, rmnTestCase{
- name: "two messages, one source chain is cursed",
+ name: "two messages, one source chain is cursed the other chain was cursed but curse is revoked",
passIfNoCommitAfter: 15 * time.Second,
cursedSubjectsPerChain: map[int][]int{
chain1: {chain0},
},
+ revokedCursedSubjectsPerChain: map[int]map[int]time.Duration{
+ chain0: {globalCurse: 5 * time.Second}, // chain0 will be globally cursed and curse will be revoked later
+ },
homeChainConfig: homeChainConfig{
f: map[int]int{chain0: 1, chain1: 1},
},
@@ -254,9 +258,6 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) {
require.NoError(t, err)
t.Logf("onChainState: %#v", onChainState)
- homeChain, ok := envWithRMN.Env.Chains[envWithRMN.HomeChainSel]
- require.True(t, ok)
-
homeChainState, ok := onChainState.Chains[envWithRMN.HomeChainSel]
require.True(t, ok)
@@ -270,23 +271,28 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) {
dynamicConfig := rmn_home.RMNHomeDynamicConfig{SourceChains: tc.pf.rmnHomeSourceChains, OffchainConfig: []byte{}}
t.Logf("Setting RMNHome candidate with staticConfig: %+v, dynamicConfig: %+v, current candidateDigest: %x",
staticConfig, dynamicConfig, allDigests.CandidateConfigDigest[:])
- tx, err := homeChainState.RMNHome.SetCandidate(homeChain.DeployerKey, staticConfig, dynamicConfig, allDigests.CandidateConfigDigest)
+
+ candidateDigest, err := homeChainState.RMNHome.GetCandidateDigest(&bind.CallOpts{Context: ctx})
require.NoError(t, err)
- _, err = deployment.ConfirmIfNoError(homeChain, tx, err)
+ _, err = changeset.NewSetRMNHomeCandidateConfigChangeset(envWithRMN.Env, changeset.SetRMNHomeCandidateConfig{
+ HomeChainSelector: envWithRMN.HomeChainSel,
+ RMNStaticConfig: staticConfig,
+ RMNDynamicConfig: dynamicConfig,
+ DigestToOverride: candidateDigest,
+ })
require.NoError(t, err)
- candidateDigest, err := homeChainState.RMNHome.GetCandidateDigest(&bind.CallOpts{Context: ctx})
+ candidateDigest, err = homeChainState.RMNHome.GetCandidateDigest(&bind.CallOpts{Context: ctx})
require.NoError(t, err)
t.Logf("RMNHome candidateDigest after setting new candidate: %x", candidateDigest[:])
t.Logf("Promoting RMNHome candidate with candidateDigest: %x", candidateDigest[:])
- tx, err = homeChainState.RMNHome.PromoteCandidateAndRevokeActive(
- homeChain.DeployerKey, candidateDigest, allDigests.ActiveConfigDigest)
- require.NoError(t, err)
-
- _, err = deployment.ConfirmIfNoError(homeChain, tx, err)
+ _, err = changeset.NewPromoteCandidateConfigChangeset(envWithRMN.Env, changeset.PromoteRMNHomeCandidateConfig{
+ HomeChainSelector: envWithRMN.HomeChainSel,
+ DigestToPromote: candidateDigest,
+ })
require.NoError(t, err)
// check the active digest is the same as the candidate digest
@@ -296,18 +302,35 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) {
"active digest should be the same as the previously candidate digest after promotion, previous candidate: %x, active: %x",
candidateDigest[:], activeDigest[:])
- tc.setRmnRemoteConfig(ctx, t, onChainState, activeDigest, envWithRMN)
+ rmnRemoteConfig := make(map[uint64]changeset.RMNRemoteConfig)
+ for _, remoteCfg := range tc.remoteChainsConfig {
+ selector := tc.pf.chainSelectors[remoteCfg.chainIdx]
+ if remoteCfg.f < 0 {
+ t.Fatalf("remoteCfg.f is negative: %d", remoteCfg.f)
+ }
+ rmnRemoteConfig[selector] = changeset.RMNRemoteConfig{
+ F: uint64(remoteCfg.f),
+ Signers: tc.pf.rmnRemoteSigners,
+ }
+ }
+
+ _, err = changeset.NewSetRMNRemoteConfigChangeset(envWithRMN.Env, changeset.SetRMNRemoteConfig{
+ HomeChainSelector: envWithRMN.HomeChainSel,
+ RMNRemoteConfigs: rmnRemoteConfig,
+ })
+ require.NoError(t, err)
tc.killMarkedRmnNodes(t, rmnCluster)
changeset.ReplayLogs(t, envWithRMN.Env.Offchain, envWithRMN.ReplayBlocks)
- require.NoError(t, changeset.AddLanesForAll(envWithRMN.Env, onChainState))
+ changeset.AddLanesForAll(t, &envWithRMN, onChainState)
disabledNodes := tc.disableOraclesIfThisIsACursingTestCase(ctx, t, envWithRMN)
startBlocks, seqNumCommit, seqNumExec := tc.sendMessages(t, onChainState, envWithRMN)
t.Logf("Sent all messages, seqNumCommit: %v seqNumExec: %v", seqNumCommit, seqNumExec)
tc.callContractsToCurseChains(ctx, t, onChainState, envWithRMN)
+ tc.callContractsToCurseAndRevokeCurse(ctx, t, onChainState, envWithRMN)
tc.enableOracles(ctx, t, envWithRMN, disabledNodes)
@@ -420,22 +443,25 @@ type rmnTestCase struct {
// If set to a positive value, the test will wait for that duration and will assert that commit report was not delivered.
passIfNoCommitAfter time.Duration
cursedSubjectsPerChain map[int][]int
- waitForExec bool
- homeChainConfig homeChainConfig
- remoteChainsConfig []remoteChainConfig
- rmnNodes []rmnNode
- messagesToSend []messageToSend
+ // revokedCursedSubjectsPerChain is used to revoke this specific curses after a timer expires
+ revokedCursedSubjectsPerChain map[int]map[int]time.Duration // chainIdx -> subjectIdx -> timer to revoke
+ waitForExec bool
+ homeChainConfig homeChainConfig
+ remoteChainsConfig []remoteChainConfig
+ rmnNodes []rmnNode
+ messagesToSend []messageToSend
// populated fields after environment setup
pf testCasePopulatedFields
}
type testCasePopulatedFields struct {
- chainSelectors []uint64
- rmnHomeNodes []rmn_home.RMNHomeNode
- rmnRemoteSigners []rmn_remote.RMNRemoteSigner
- rmnHomeSourceChains []rmn_home.RMNHomeSourceChain
- cursedSubjectsPerChainSel map[uint64][]uint64
+ chainSelectors []uint64
+ rmnHomeNodes []rmn_home.RMNHomeNode
+ rmnRemoteSigners []rmn_remote.RMNRemoteSigner
+ rmnHomeSourceChains []rmn_home.RMNHomeSourceChain
+ cursedSubjectsPerChainSel map[uint64][]uint64
+ revokedCursedSubjectsPerChainSel map[uint64]map[uint64]time.Duration
}
func (tc *rmnTestCase) populateFields(t *testing.T, envWithRMN changeset.DeployedEnv, rmnCluster devenv.RMNCluster) {
@@ -490,6 +516,22 @@ func (tc *rmnTestCase) populateFields(t *testing.T, envWithRMN changeset.Deploye
tc.pf.cursedSubjectsPerChainSel[chainSel] = append(tc.pf.cursedSubjectsPerChainSel[chainSel], subjSel)
}
}
+
+ // populate revoked cursed subjects with actual chain selectors
+ tc.pf.revokedCursedSubjectsPerChainSel = make(map[uint64]map[uint64]time.Duration)
+ for chainIdx, subjects := range tc.revokedCursedSubjectsPerChain {
+ chainSel := tc.pf.chainSelectors[chainIdx]
+ for subject, revokeAfter := range subjects {
+ subjSel := uint64(globalCurse)
+ if subject != globalCurse {
+ subjSel = tc.pf.chainSelectors[subject]
+ }
+ if _, ok := tc.pf.revokedCursedSubjectsPerChainSel[chainSel]; !ok {
+ tc.pf.revokedCursedSubjectsPerChainSel[chainSel] = make(map[uint64]time.Duration)
+ }
+ tc.pf.revokedCursedSubjectsPerChainSel[chainSel][subjSel] = revokeAfter
+ }
+ }
}
func (tc rmnTestCase) validate() error {
@@ -500,46 +542,6 @@ func (tc rmnTestCase) validate() error {
return nil
}
-func (tc rmnTestCase) setRmnRemoteConfig(
- ctx context.Context,
- t *testing.T,
- onChainState changeset.CCIPOnChainState,
- activeDigest [32]byte,
- envWithRMN changeset.DeployedEnv) {
- for _, remoteCfg := range tc.remoteChainsConfig {
- remoteSel := tc.pf.chainSelectors[remoteCfg.chainIdx]
- chState, ok := onChainState.Chains[remoteSel]
- require.True(t, ok)
- if remoteCfg.f < 0 {
- t.Fatalf("negative F: %d", remoteCfg.f)
- }
- rmnRemoteConfig := rmn_remote.RMNRemoteConfig{
- RmnHomeContractConfigDigest: activeDigest,
- Signers: tc.pf.rmnRemoteSigners,
- F: uint64(remoteCfg.f),
- }
-
- chain := envWithRMN.Env.Chains[tc.pf.chainSelectors[remoteCfg.chainIdx]]
-
- t.Logf("Setting RMNRemote config with RMNHome active digest: %x, cfg: %+v", activeDigest[:], rmnRemoteConfig)
- tx2, err2 := chState.RMNRemote.SetConfig(chain.DeployerKey, rmnRemoteConfig)
- require.NoError(t, err2)
- _, err2 = deployment.ConfirmIfNoError(chain, tx2, err2)
- require.NoError(t, err2)
-
- // confirm the config is set correctly
- config, err2 := chState.RMNRemote.GetVersionedConfig(&bind.CallOpts{Context: ctx})
- require.NoError(t, err2)
- require.Equalf(t,
- activeDigest,
- config.Config.RmnHomeContractConfigDigest,
- "RMNRemote config digest should be the same as the active digest of RMNHome after setting, RMNHome active: %x, RMNRemote config: %x",
- activeDigest[:], config.Config.RmnHomeContractConfigDigest[:])
-
- t.Logf("RMNRemote config digest after setting: %x", config.Config.RmnHomeContractConfigDigest[:])
- }
-}
-
func (tc rmnTestCase) killMarkedRmnNodes(t *testing.T, rmnCluster devenv.RMNCluster) {
for _, n := range tc.rmnNodes {
if n.forceExit {
@@ -637,6 +639,44 @@ func (tc rmnTestCase) callContractsToCurseChains(ctx context.Context, t *testing
}
}
+func (tc rmnTestCase) callContractsToCurseAndRevokeCurse(ctx context.Context, t *testing.T, onChainState changeset.CCIPOnChainState, envWithRMN changeset.DeployedEnv) {
+ for _, remoteCfg := range tc.remoteChainsConfig {
+ remoteSel := tc.pf.chainSelectors[remoteCfg.chainIdx]
+ chState, ok := onChainState.Chains[remoteSel]
+ require.True(t, ok)
+ chain, ok := envWithRMN.Env.Chains[remoteSel]
+ require.True(t, ok)
+
+ cursedSubjects, ok := tc.revokedCursedSubjectsPerChain[remoteCfg.chainIdx]
+ if !ok {
+ continue // nothing to curse on this chain
+ }
+
+ for subjectDescription, revokeAfter := range cursedSubjects {
+ subj := reader.GlobalCurseSubject
+ if subjectDescription != globalCurse {
+ subj = chainSelectorToBytes16(tc.pf.chainSelectors[subjectDescription])
+ }
+ t.Logf("cursing subject %d (%d)", subj, subjectDescription)
+ txCurse, errCurse := chState.RMNRemote.Curse(chain.DeployerKey, subj)
+ _, errConfirm := deployment.ConfirmIfNoError(chain, txCurse, errCurse)
+ require.NoError(t, errConfirm)
+
+ go func() {
+ <-time.NewTimer(revokeAfter).C
+ t.Logf("revoking curse on subject %d (%d)", subj, subjectDescription)
+ txUncurse, errUncurse := chState.RMNRemote.Uncurse(chain.DeployerKey, subj)
+ _, errConfirm = deployment.ConfirmIfNoError(chain, txUncurse, errUncurse)
+ require.NoError(t, errConfirm)
+ }()
+ }
+
+ cs, err := chState.RMNRemote.GetCursedSubjects(&bind.CallOpts{Context: ctx})
+ require.NoError(t, err)
+ t.Logf("Cursed subjects: %v", cs)
+ }
+}
+
func (tc rmnTestCase) enableOracles(ctx context.Context, t *testing.T, envWithRMN changeset.DeployedEnv, nodeIDs []string) {
for _, n := range nodeIDs {
_, err := envWithRMN.Env.Offchain.EnableNode(ctx, &node.EnableNodeRequest{Id: n})
diff --git a/integration-tests/smoke/ccip/ccip_token_price_updates_test.go b/integration-tests/smoke/ccip/ccip_token_price_updates_test.go
index e3496b6f407..fb7ddc847d4 100644
--- a/integration-tests/smoke/ccip/ccip_token_price_updates_test.go
+++ b/integration-tests/smoke/ccip/ccip_token_price_updates_test.go
@@ -35,7 +35,7 @@ func Test_CCIPTokenPriceUpdates(t *testing.T) {
}))
state, err := changeset.LoadOnchainState(e.Env)
require.NoError(t, err)
- require.NoError(t, changeset.AddLanesForAll(e.Env, state))
+ changeset.AddLanesForAll(t, &e, state)
allChainSelectors := maps.Keys(e.Env.Chains)
assert.GreaterOrEqual(t, len(allChainSelectors), 2, "test requires at least 2 chains")
diff --git a/integration-tests/smoke/ccip/ccip_token_transfer_test.go b/integration-tests/smoke/ccip/ccip_token_transfer_test.go
index 2088960639e..c5cabfe63e4 100644
--- a/integration-tests/smoke/ccip/ccip_token_transfer_test.go
+++ b/integration-tests/smoke/ccip/ccip_token_transfer_test.go
@@ -69,7 +69,7 @@ func TestTokenTransfer(t *testing.T) {
"SELF_SERVE_TOKEN",
)
require.NoError(t, err)
- require.NoError(t, changeset.AddLanesForAll(e, state))
+ changeset.AddLanesForAll(t, &tenv, state)
changeset.MintAndAllow(
t,
diff --git a/integration-tests/smoke/ccip/ccip_usdc_test.go b/integration-tests/smoke/ccip/ccip_usdc_test.go
index 174ab941387..7bea68a9cbf 100644
--- a/integration-tests/smoke/ccip/ccip_usdc_test.go
+++ b/integration-tests/smoke/ccip/ccip_usdc_test.go
@@ -71,7 +71,7 @@ func TestUSDCTokenTransfer(t *testing.T) {
require.NoError(t, err)
// Add all lanes
- require.NoError(t, changeset.AddLanesForAll(e, state))
+ changeset.AddLanesForAll(t, &tenv, state)
changeset.MintAndAllow(
t,
diff --git a/integration-tests/smoke/ocr2_test.go b/integration-tests/smoke/ocr2_test.go
index a011dfdffc6..8416ec05c7e 100644
--- a/integration-tests/smoke/ocr2_test.go
+++ b/integration-tests/smoke/ocr2_test.go
@@ -1,14 +1,19 @@
package smoke
import (
+ "bufio"
"fmt"
"math/big"
"net/http"
+ "os"
+ "path/filepath"
+ "regexp"
"strings"
+ "sync"
"testing"
"time"
- "github.com/smartcontractkit/chainlink/integration-tests/utils"
+ "github.com/onsi/gomega"
"github.com/ethereum/go-ethereum/common"
"github.com/rs/zerolog"
@@ -16,8 +21,8 @@ import (
"github.com/smartcontractkit/chainlink-testing-framework/seth"
+ ctf_docker "github.com/smartcontractkit/chainlink-testing-framework/lib/docker"
"github.com/smartcontractkit/chainlink-testing-framework/lib/logging"
- "github.com/smartcontractkit/chainlink-testing-framework/lib/logstream"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
"github.com/smartcontractkit/chainlink/v2/core/config/env"
@@ -26,6 +31,7 @@ import (
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
"github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"
tc "github.com/smartcontractkit/chainlink/integration-tests/testconfig"
+ "github.com/smartcontractkit/chainlink/integration-tests/utils"
)
type ocr2test struct {
@@ -224,33 +230,150 @@ func prepareORCv2SmokeTestEnv(t *testing.T, testData ocr2test, l zerolog.Logger,
}
func assertCorrectNodeConfiguration(t *testing.T, l zerolog.Logger, totalNodeCount int, testData ocr2test, testEnv *test_env.CLClusterTestEnv) {
- expectedNodesWithConfiguration := totalNodeCount - 1 // minus bootstrap node
- var expectedPatterns []string
+ l.Info().Msg("Checking if all nodes have correct plugin configuration applied")
- if testData.env[string(env.MedianPlugin.Cmd)] != "" {
- expectedPatterns = append(expectedPatterns, "Registered loopp.*OCR2.*Median.*")
- }
+ // we have to use gomega here, because sometimes there's a delay in the logs being written (especially in the CI)
+ // and this check fails on the first execution, and we don't want to add any hardcoded sleeps
- if testData.chainReaderAndCodec {
- expectedPatterns = append(expectedPatterns, "relayConfig\\.chainReader")
- } else {
- expectedPatterns = append(expectedPatterns, "ChainReader missing from RelayConfig; falling back to internal MedianContract")
- }
+ gom := gomega.NewGomegaWithT(t)
+ gom.Eventually(func(g gomega.Gomega) {
+ allNodesHaveCorrectConfig := false
+
+ var expectedPatterns []string
+ expectedNodeCount := totalNodeCount - 1
+
+ if testData.env[string(env.MedianPlugin.Cmd)] != "" {
+ expectedPatterns = append(expectedPatterns, `Registered loopp.*OCR2.*Median.*`)
+ }
+
+ if testData.chainReaderAndCodec {
+ expectedPatterns = append(expectedPatterns, `relayConfig.chainReader`)
+ } else {
+ expectedPatterns = append(expectedPatterns, "ChainReader missing from RelayConfig; falling back to internal MedianContract")
+ }
+
+ logFilePaths := make(map[string]string)
+ tempLogsDir := os.TempDir()
+
+ var nodesToInclude []string
+ for i := 1; i < totalNodeCount; i++ {
+ nodesToInclude = append(nodesToInclude, testEnv.ClCluster.Nodes[i].ContainerName+".log")
+ }
+
+ // save all log files in temp dir
+ loggingErr := ctf_docker.WriteAllContainersLogs(l, tempLogsDir)
+ if loggingErr != nil {
+ l.Debug().Err(loggingErr).Msg("Error writing all containers logs. Trying again...")
+
+ // try again
+ return
+ }
+
+ var fileNameIncludeFilter = func(name string) bool {
+ for _, n := range nodesToInclude {
+ if strings.EqualFold(name, n) {
+ return true
+ }
+ }
+ return false
+ }
+
+ // find log files for CL nodes
+ fileWalkErr := filepath.Walk(tempLogsDir, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ if os.IsPermission(err) {
+ return nil
+ }
+ return err
+ }
+ if !info.IsDir() && fileNameIncludeFilter(info.Name()) {
+ absPath, err := filepath.Abs(path)
+ if err != nil {
+ return err
+ }
+ logFilePaths[strings.TrimSuffix(info.Name(), ".log")] = absPath
+ }
+ return nil
+ })
+
+ if fileWalkErr != nil {
+ l.Debug().Err(fileWalkErr).Msg("Error walking through log files. Trying again...")
+
+ return
+ }
+
+ if len(logFilePaths) != expectedNodeCount {
+ l.Debug().Msgf("Expected number of log files to match number of nodes (excluding bootstrap node). Expected: %d, Found: %d. Trying again...", expectedNodeCount, len(logFilePaths))
+
+ return
+ }
+
+ // search for expected pattern in log file
+ var searchForLineInFile = func(filePath string, pattern string) bool {
+ file, fileErr := os.Open(filePath)
+ if fileErr != nil {
+ return false
+ }
+
+ defer func(file *os.File) {
+ _ = file.Close()
+ }(file)
+
+ scanner := bufio.NewScanner(file)
+ scanner.Split(bufio.ScanLines)
+ pc := regexp.MustCompile(pattern)
+
+ for scanner.Scan() {
+ jsonLogLine := scanner.Text()
+ if pc.MatchString(jsonLogLine) {
+ return true
+ }
+
+ }
+ return false
+ }
+
+ wg := sync.WaitGroup{}
+ resultsCh := make(chan map[string][]string, len(logFilePaths))
+
+ // process all logs in parallel
+ for nodeName, logFilePath := range logFilePaths {
+ wg.Add(1)
+ filePath := logFilePath
+ go func() {
+ defer wg.Done()
+ var patternsFound []string
+ for _, pattern := range expectedPatterns {
+ found := searchForLineInFile(filePath, pattern)
+ if found {
+ patternsFound = append(patternsFound, pattern)
+ }
+ }
+ resultsCh <- map[string][]string{nodeName: patternsFound}
+ }()
+ }
+
+ wg.Wait()
+ close(resultsCh)
- // make sure that nodes are correctly configured by scanning the logs
- for _, pattern := range expectedPatterns {
- l.Info().Msgf("Checking for pattern: '%s' in CL node logs", pattern)
var correctlyConfiguredNodes []string
- for i := 1; i < len(testEnv.ClCluster.Nodes); i++ {
- logProcessor, processFn, err := logstream.GetRegexMatchingProcessor(testEnv.LogStream, pattern)
- require.NoError(t, err, "Error getting regex matching processor")
-
- count, err := logProcessor.ProcessContainerLogs(testEnv.ClCluster.Nodes[i].ContainerName, processFn)
- require.NoError(t, err, "Error processing container logs")
- if *count >= 1 {
- correctlyConfiguredNodes = append(correctlyConfiguredNodes, testEnv.ClCluster.Nodes[i].ContainerName)
+ var incorrectlyConfiguredNodes []string
+
+ // check results
+ for result := range resultsCh {
+ for nodeName, patternsFound := range result {
+ if len(patternsFound) == len(expectedPatterns) {
+ correctlyConfiguredNodes = append(correctlyConfiguredNodes, nodeName)
+ } else {
+ incorrectlyConfiguredNodes = append(incorrectlyConfiguredNodes, nodeName)
+ }
}
}
- require.Equal(t, expectedNodesWithConfiguration, len(correctlyConfiguredNodes), "expected correct plugin config to be applied to %d cl-nodes, but only following ones had it: %s; regexp used: %s", expectedNodesWithConfiguration, strings.Join(correctlyConfiguredNodes, ", "), string(pattern))
- }
+
+ allNodesHaveCorrectConfig = len(correctlyConfiguredNodes) == expectedNodeCount
+
+ g.Expect(allNodesHaveCorrectConfig).To(gomega.BeTrue(), "%d nodes' logs were missing expected plugin configuration entries. Correctly configured nodes: %s. Nodes with missing configuration: %s. Expected log patterns: %s", expectedNodeCount-len(correctlyConfiguredNodes), strings.Join(correctlyConfiguredNodes, ", "), strings.Join(incorrectlyConfiguredNodes, ", "), strings.Join(expectedPatterns, ", "))
+ }, "1m", "10s").Should(gomega.Succeed())
+
+ l.Info().Msg("All nodes have correct plugin configuration applied")
}
diff --git a/integration-tests/testconfig/automation/example.toml b/integration-tests/testconfig/automation/example.toml
index 3bbe78d693d..c239e5a3966 100644
--- a/integration-tests/testconfig/automation/example.toml
+++ b/integration-tests/testconfig/automation/example.toml
@@ -7,14 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/ccip/config.go b/integration-tests/testconfig/ccip/config.go
index 72c81f05f47..70c850fd591 100644
--- a/integration-tests/testconfig/ccip/config.go
+++ b/integration-tests/testconfig/ccip/config.go
@@ -147,6 +147,9 @@ func (o *JDConfig) GetJDDBVersion() string {
func (o *Config) Validate() error {
var chainIds []int64
for _, net := range o.PrivateEthereumNetworks {
+ if net.EthereumChainConfig.ChainID < 0 {
+ return fmt.Errorf("negative chain ID found for network %d", net.EthereumChainConfig.ChainID)
+ }
chainIds = append(chainIds, int64(net.EthereumChainConfig.ChainID))
}
homeChainSelector, err := strconv.ParseUint(pointer.GetString(o.HomeChainSelector), 10, 64)
@@ -189,14 +192,21 @@ func IsSelectorValid(selector uint64, chainIds []int64) (bool, error) {
if err != nil {
return false, err
}
- if chainId >= math.MaxInt64 {
- return false, fmt.Errorf("chain id overflows int64: %d", chainId)
- }
- expId := int64(chainId)
- for _, id := range chainIds {
- if id == expId {
+
+ for _, cID := range chainIds {
+ if isEqualUint64AndInt64(chainId, cID) {
return true, nil
}
}
return false, nil
}
+
+func isEqualUint64AndInt64(u uint64, i int64) bool {
+ if i < 0 {
+ return false // uint64 cannot be equal to a negative int64
+ }
+ if u > math.MaxInt64 {
+ return false // uint64 cannot be equal to an int64 if it exceeds the maximum int64 value
+ }
+ return u == uint64(i)
+}
diff --git a/integration-tests/testconfig/ccip/overrides/sepolia_avax_binance.toml b/integration-tests/testconfig/ccip/overrides/sepolia_avax_binance.toml
index 06af64d5d91..72c43b12da5 100644
--- a/integration-tests/testconfig/ccip/overrides/sepolia_avax_binance.toml
+++ b/integration-tests/testconfig/ccip/overrides/sepolia_avax_binance.toml
@@ -5,10 +5,6 @@ chainlink_node_funding = 2
[Logging]
test_log_collect = true
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persisted
-log_targets = ["loki"]
-
[Network]
selected_networks = ['SEPOLIA', 'AVALANCHE_FUJI', 'BSC_TESTNET']
diff --git a/integration-tests/testconfig/default.toml b/integration-tests/testconfig/default.toml
index b9987d4571d..8180b40ae21 100644
--- a/integration-tests/testconfig/default.toml
+++ b/integration-tests/testconfig/default.toml
@@ -2,19 +2,6 @@
# set to true to flush logs to selected target regardless of test result; otherwise logs are only flushed if test failed
test_log_collect = false
-[Logging.Grafana]
-base_url = "https://grafana.ops.prod.cldev.sh"
-base_url_github_ci = "http://localhost:8080/primary"
-dashboard_url = "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs"
-
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persisted
-log_targets = ["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout = "10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit = 10
-
[ChainlinkImage]
# postgres version to use
postgres_version = "12.0"
diff --git a/integration-tests/testconfig/forwarder_ocr/example.toml b/integration-tests/testconfig/forwarder_ocr/example.toml
index 517a341f803..6ca4b8bbcc3 100644
--- a/integration-tests/testconfig/forwarder_ocr/example.toml
+++ b/integration-tests/testconfig/forwarder_ocr/example.toml
@@ -7,33 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
-[Logging.Loki]
-tenant_id="tenant_id"
-# full URL of Loki ingest endpoint
-endpoint="https://loki.url/api/v3/push"
-# currently only needed when using public instance
-basic_auth_secret="loki-basic-auth"
-# only needed for cloud grafana
-bearer_token_secret="bearer_token"
-
-# LogStream will try to shorten Grafana URLs by default (if all 3 variables are set)
-[Logging.Grafana]
-# grafana url (trailing "/" will be stripped)
-base_url="http://grafana.url"
-# url of your grafana dashboard (prefix and suffix "/" are stirpped), example: /d/ad61652-2712-1722/my-dashboard
-dashboard_url="/d/your-dashboard"
-# Grafana dashboard uid to annotate. Find it in Dashboard Settings -> JSON Model
-dashboard_uid="dashboard-uid-to-annotate"
-bearer_token_secret="my-awesome-token"
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/forwarder_ocr2/example.toml b/integration-tests/testconfig/forwarder_ocr2/example.toml
index 3ec3e4c690a..e3fb66a0f3a 100644
--- a/integration-tests/testconfig/forwarder_ocr2/example.toml
+++ b/integration-tests/testconfig/forwarder_ocr2/example.toml
@@ -8,33 +8,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
-[Logging.Loki]
-tenant_id="tenant_id"
-# full URL of Loki ingest endpoint
-endpoint="https://loki.url/api/v3/push"
-# currently only needed when using public instance
-basic_auth_secret="loki-basic-auth"
-# only needed for cloud grafana
-bearer_token_secret="bearer_token"
-
-# LogStream will try to shorten Grafana URLs by default (if all 3 variables are set)
-[Logging.Grafana]
-# grafana url (trailing "/" will be stripped)
-base_url="http://grafana.url"
-# url of your grafana dashboard (prefix and suffix "/" are stirpped), example: /d/ad61652-2712-1722/my-dashboard
-dashboard_url="/d/your-dashboard"
-# Grafana dashboard uid to annotate. Find it in Dashboard Settings -> JSON Model
-dashboard_uid="dashboard-uid-to-annotate"
-bearer_token_secret="my-awesome-token"
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/functions/example.toml b/integration-tests/testconfig/functions/example.toml
index 74d931632a8..ec7076fa9f9 100644
--- a/integration-tests/testconfig/functions/example.toml
+++ b/integration-tests/testconfig/functions/example.toml
@@ -7,14 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
# if you want to use simulated network
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/keeper/example.toml b/integration-tests/testconfig/keeper/example.toml
index 4efbf974827..7fe3bf26d0a 100644
--- a/integration-tests/testconfig/keeper/example.toml
+++ b/integration-tests/testconfig/keeper/example.toml
@@ -7,14 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/log_poller/example.toml b/integration-tests/testconfig/log_poller/example.toml
index 78f3b5482d9..b94b6e0e202 100644
--- a/integration-tests/testconfig/log_poller/example.toml
+++ b/integration-tests/testconfig/log_poller/example.toml
@@ -7,14 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/node/example.toml b/integration-tests/testconfig/node/example.toml
index bc5628e46b3..4635e40c037 100644
--- a/integration-tests/testconfig/node/example.toml
+++ b/integration-tests/testconfig/node/example.toml
@@ -7,14 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/ocr/example.toml b/integration-tests/testconfig/ocr/example.toml
index 7c1c755567f..d1edd3a67fd 100644
--- a/integration-tests/testconfig/ocr/example.toml
+++ b/integration-tests/testconfig/ocr/example.toml
@@ -7,33 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
-[Logging.Loki]
-tenant_id="tenant_id"
-# full URL of Loki ingest endpoint
-endpoint="https://loki.url/api/v3/push"
-# currently only needed when using public instance
-basic_auth_secret="loki-basic-auth"
-# only needed for cloud grafana
-bearer_token_secret="bearer_token"
-
-# LogStream will try to shorten Grafana URLs by default (if all 3 variables are set)
-[Logging.Grafana]
-# grafana url (trailing "/" will be stripped)
-base_url="http://grafana.url"
-# url of your grafana dashboard (prefix and suffix "/" are stirpped), example: /d/ad61652-2712-1722/my-dashboard
-dashboard_url="/d/your-dashboard"
-# Grafana dashboard uid to annotate. Find it in Dashboard Settings -> JSON Model
-dashboard_uid="dashboard-uid-to-annotate"
-bearer_token_secret="my-awesome-token"
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/ocr2/example.toml b/integration-tests/testconfig/ocr2/example.toml
index 319f64d2580..679e4527a31 100644
--- a/integration-tests/testconfig/ocr2/example.toml
+++ b/integration-tests/testconfig/ocr2/example.toml
@@ -7,33 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
-[Logging.Loki]
-tenant_id="tenant_id"
-# full URL of Loki ingest endpoint
-endpoint="https://loki.url/api/v3/push"
-# currently only needed when using public instance
-basic_auth_secret="loki-basic-auth"
-# only needed for cloud grafana
-bearer_token_secret="bearer_token"
-
-# LogStream will try to shorten Grafana URLs by default (if all 3 variables are set)
-[Logging.Grafana]
-# grafana url (trailing "/" will be stripped)
-base_url="http://grafana.url"
-# url of your grafana dashboard (prefix and suffix "/" are stirpped), example: /d/ad61652-2712-1722/my-dashboard
-dashboard_url="/d/your-dashboard"
-# Grafana dashboard uid to annotate. Find it in Dashboard Settings -> JSON Model
-dashboard_uid="dashboard-uid-to-annotate"
-bearer_token_secret="my-awesome-token"
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/testconfig.go b/integration-tests/testconfig/testconfig.go
index 545818e3348..19e3f0b7ada 100644
--- a/integration-tests/testconfig/testconfig.go
+++ b/integration-tests/testconfig/testconfig.go
@@ -6,7 +6,6 @@ import (
"fmt"
"math/big"
"os"
- "slices"
"strings"
"github.com/barkimedes/go-deepcopy"
@@ -631,26 +630,6 @@ func (c *TestConfig) Validate() error {
return fmt.Errorf("logging config must be set")
}
- if err := c.Logging.Validate(); err != nil {
- return errors.Wrapf(err, "logging config validation failed")
- }
-
- if c.Logging.Loki != nil {
- if err := c.Logging.Loki.Validate(); err != nil {
- return errors.Wrapf(err, "loki config validation failed")
- }
- }
-
- if c.Logging.LogStream != nil && slices.Contains(c.Logging.LogStream.LogTargets, "loki") {
- if c.Logging.Loki == nil {
- return fmt.Errorf("in order to use Loki as logging target you must set Loki config in logging config")
- }
-
- if err := c.Logging.Loki.Validate(); err != nil {
- return errors.Wrapf(err, "loki config validation failed")
- }
- }
-
if c.Pyroscope != nil {
if err := c.Pyroscope.Validate(); err != nil {
return errors.Wrapf(err, "pyroscope config validation failed")
diff --git a/integration-tests/testconfig/vrfv2/example.toml b/integration-tests/testconfig/vrfv2/example.toml
index 13af6dee620..3665c2f43cf 100644
--- a/integration-tests/testconfig/vrfv2/example.toml
+++ b/integration-tests/testconfig/vrfv2/example.toml
@@ -7,14 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testconfig/vrfv2plus/example.toml b/integration-tests/testconfig/vrfv2plus/example.toml
index 160e9ba03a9..a45d53f67b8 100644
--- a/integration-tests/testconfig/vrfv2plus/example.toml
+++ b/integration-tests/testconfig/vrfv2plus/example.toml
@@ -7,14 +7,6 @@ version="2.7.0"
# if set to true will save logs even if test did not fail
test_log_collect=false
-[Logging.LogStream]
-# supported targets: file, loki, in-memory. if empty no logs will be persistet
-log_targets=["file"]
-# context timeout for starting log producer and also time-frame for requesting logs
-log_producer_timeout="10s"
-# number of retries before log producer gives up and stops listening to logs
-log_producer_retry_limit=10
-
# if you want to use polygon_mumbial
[Network]
selected_networks=["polygon_mumbai"]
diff --git a/integration-tests/testsetups/ccip/test_helpers.go b/integration-tests/testsetups/ccip/test_helpers.go
index b859fab10c5..6725ac1df9b 100644
--- a/integration-tests/testsetups/ccip/test_helpers.go
+++ b/integration-tests/testsetups/ccip/test_helpers.go
@@ -11,6 +11,7 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind"
chainsel "github.com/smartcontractkit/chain-selectors"
+ "go.uber.org/zap/zapcore"
commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
"github.com/smartcontractkit/chainlink-testing-framework/lib/blockchain"
@@ -18,6 +19,7 @@ import (
ctftestenv "github.com/smartcontractkit/chainlink-testing-framework/lib/docker/test_env"
"github.com/smartcontractkit/chainlink-testing-framework/lib/logging"
"github.com/smartcontractkit/chainlink-testing-framework/lib/networks"
+ "github.com/smartcontractkit/chainlink-testing-framework/lib/testreporters"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/conversions"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr"
"github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext"
@@ -155,6 +157,11 @@ func NewIntegrationEnvironment(t *testing.T, opts ...changeset.TestOps) (changes
return memEnv, devenv.RMNCluster{}
case changeset.Docker:
dockerEnv := &DeployedLocalDevEnvironment{}
+ if testCfg.LegacyDeployment {
+ deployedEnv := changeset.NewLegacyEnvironment(t, testCfg, dockerEnv)
+ require.NotNil(t, dockerEnv.testEnv, "empty docker environment")
+ return deployedEnv, devenv.RMNCluster{}
+ }
if testCfg.RMNEnabled {
deployedEnv := changeset.NewEnvironmentWithJobsAndContracts(t, testCfg, dockerEnv)
l := logging.GetTestLogger(t)
@@ -169,7 +176,6 @@ func NewIntegrationEnvironment(t *testing.T, opts ...changeset.TestOps) (changes
dockerEnv.devEnvTestCfg.CCIP.RMNConfig.GetProxyVersion(),
dockerEnv.devEnvTestCfg.CCIP.RMNConfig.GetAFN2ProxyImage(),
dockerEnv.devEnvTestCfg.CCIP.RMNConfig.GetAFN2ProxyVersion(),
- dockerEnv.testEnv.LogStream,
)
require.NoError(t, err)
return deployedEnv, *rmnCluster
@@ -323,11 +329,30 @@ func CreateDockerEnv(t *testing.T) (
}
}
+ // ignore critical CL node logs until they are fixed, as otherwise tests will fail
+ var logScannerSettings = test_env.GetDefaultChainlinkNodeLogScannerSettingsWithExtraAllowedMessages(testreporters.NewAllowedLogMessage(
+ "No live RPC nodes available",
+ "CL nodes are started before simulated chains, so this is expected",
+ zapcore.DPanicLevel,
+ testreporters.WarnAboutAllowedMsgs_No),
+ testreporters.NewAllowedLogMessage(
+ "Error stopping job service",
+ "Possible lifecycle bug in chainlink: failed to close RMN home reader: has already been stopped: already stopped",
+ zapcore.DPanicLevel,
+ testreporters.WarnAboutAllowedMsgs_No),
+ testreporters.NewAllowedLogMessage(
+ "Shutdown grace period of 5s exceeded, closing DB and exiting...",
+ "Possible lifecycle bug in chainlink.",
+ zapcore.DPanicLevel,
+ testreporters.WarnAboutAllowedMsgs_No),
+ )
+
builder := test_env.NewCLTestEnvBuilder().
WithTestConfig(&cfg).
WithTestInstance(t).
WithMockAdapter().
WithJobDistributor(cfg.CCIP.JobDistributorConfig).
+ WithChainlinkNodeLogScanner(logScannerSettings).
WithStandardCleanup()
// if private ethereum networks are provided, we will use them to create the test environment
@@ -420,10 +445,11 @@ func StartChainlinkNodes(
cfg.NodeConfig.CommonChainConfigTOML,
cfg.NodeConfig.ChainConfigTOMLByChainID,
)
-
- toml.Capabilities.ExternalRegistry.NetworkID = ptr.Ptr(registryConfig.NetworkType)
- toml.Capabilities.ExternalRegistry.ChainID = ptr.Ptr(strconv.FormatUint(registryConfig.EVMChainID, 10))
- toml.Capabilities.ExternalRegistry.Address = ptr.Ptr(registryConfig.Contract.String())
+ if registryConfig.Contract != (common.Address{}) {
+ toml.Capabilities.ExternalRegistry.NetworkID = ptr.Ptr(registryConfig.NetworkType)
+ toml.Capabilities.ExternalRegistry.ChainID = ptr.Ptr(strconv.FormatUint(registryConfig.EVMChainID, 10))
+ toml.Capabilities.ExternalRegistry.Address = ptr.Ptr(registryConfig.Contract.String())
+ }
if err != nil {
return err
@@ -433,7 +459,6 @@ func StartChainlinkNodes(
pointer.GetString(cfg.GetChainlinkImageConfig().Image),
pointer.GetString(cfg.GetChainlinkImageConfig().Version),
toml,
- env.LogStream,
test_env.WithPgDBOptions(
ctftestenv.WithPostgresImageVersion(pointer.GetString(cfg.GetChainlinkImageConfig().PostgresVersion)),
),
diff --git a/integration-tests/utils/pgtest/pgtest.go b/integration-tests/utils/pgtest/pgtest.go
index 8b11f9ef424..3baccc791b6 100644
--- a/integration-tests/utils/pgtest/pgtest.go
+++ b/integration-tests/utils/pgtest/pgtest.go
@@ -3,33 +3,18 @@ package pgtest
import (
"testing"
- "github.com/google/uuid"
"github.com/jmoiron/sqlx"
- "github.com/scylladb/go-reflectx"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
- "github.com/smartcontractkit/chainlink-common/pkg/utils"
- "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
+ "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
+
+ "github.com/smartcontractkit/chainlink/v2/core/config/env"
)
func NewSqlxDB(t testing.TB) *sqlx.DB {
- db, err := sqlx.Open(string(dialects.TransactionWrappedPostgres), uuid.New().String())
- require.NoError(t, err)
- t.Cleanup(func() { assert.NoError(t, db.Close()) })
- db.MapperFunc(reflectx.CamelToSnakeASCII)
-
- return db
-}
-
-func MustExec(t *testing.T, ds sqlutil.DataSource, stmt string, args ...interface{}) {
- ctx := tests.Context(t)
- require.NoError(t, utils.JustError(ds.ExecContext(ctx, stmt, args...)))
-}
-
-func MustCount(t *testing.T, db *sqlx.DB, stmt string, args ...interface{}) (cnt int) {
- require.NoError(t, db.Get(&cnt, stmt, args...))
- return
+ dbURL := string(env.DatabaseURL.Get())
+ if dbURL == "" {
+ t.Errorf("you must provide a CL_DATABASE_URL environment variable")
+ return nil
+ }
+ return pg.NewTestDB(t, dbURL)
}
diff --git a/integration-tests/utils/pgtest/txdb.go b/integration-tests/utils/pgtest/txdb.go
deleted file mode 100644
index f28b6f95f2b..00000000000
--- a/integration-tests/utils/pgtest/txdb.go
+++ /dev/null
@@ -1,510 +0,0 @@
-package pgtest
-
-import (
- "context"
- "database/sql"
- "database/sql/driver"
- "flag"
- "fmt"
- "io"
- "net/url"
- "strings"
- "sync"
- "testing"
-
- "github.com/jmoiron/sqlx"
- "go.uber.org/multierr"
-
- "github.com/smartcontractkit/chainlink/v2/core/config/env"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
-)
-
-// txdb is a simplified version of https://github.com/DATA-DOG/go-txdb
-//
-// The original lib has various problems and is hard to understand because it
-// tries to be more general. The version in this file is more tightly focused
-// to our needs and should be easier to reason about and less likely to have
-// subtle bugs/races.
-//
-// It doesn't currently support savepoints but could be made to if necessary.
-//
-// Transaction BEGIN/ROLLBACK effectively becomes a no-op, this should have no
-// negative impact on normal test operation.
-//
-// If you MUST test BEGIN/ROLLBACK behaviour, you will have to configure your
-// store to use the raw DialectPostgres dialect and setup a one-use database.
-// See heavyweight.FullTestDB() as a convenience function to help you do this,
-// but please use sparingly because as it's name implies, it is expensive.
-func init() {
- testing.Init()
- if !flag.Parsed() {
- flag.Parse()
- }
- if testing.Short() {
- // -short tests don't need a DB
- return
- }
- dbURL := string(env.DatabaseURL.Get())
- if dbURL == "" {
- panic("you must provide a CL_DATABASE_URL environment variable")
- }
-
- parsed, err := url.Parse(dbURL)
- if err != nil {
- panic(err)
- }
- if parsed.Path == "" {
- msg := fmt.Sprintf("invalid %[1]s: `%[2]s`. You must set %[1]s env var to point to your test database. Note that the test database MUST end in `_test` to differentiate from a possible production DB. HINT: Try %[1]s=postgresql://postgres@localhost:5432/chainlink_test?sslmode=disable", env.DatabaseURL, parsed.String())
- panic(msg)
- }
- if !strings.HasSuffix(parsed.Path, "_test") {
- msg := fmt.Sprintf("cannot run tests against database named `%s`. Note that the test database MUST end in `_test` to differentiate from a possible production DB. HINT: Try %s=postgresql://postgres@localhost:5432/chainlink_test?sslmode=disable", parsed.Path[1:], env.DatabaseURL)
- panic(msg)
- }
- name := string(dialects.TransactionWrappedPostgres)
- sql.Register(name, &txDriver{
- dbURL: dbURL,
- conns: make(map[string]*conn),
- })
- sqlx.BindDriver(name, sqlx.DOLLAR)
-}
-
-var _ driver.Conn = &conn{}
-
-var _ driver.Validator = &conn{}
-var _ driver.SessionResetter = &conn{}
-
-// txDriver is an sql driver which runs on a single transaction.
-// When `Close` is called, transaction is rolled back.
-type txDriver struct {
- sync.Mutex
- db *sql.DB
- conns map[string]*conn
-
- dbURL string
-}
-
-func (d *txDriver) Open(dsn string) (driver.Conn, error) {
- d.Lock()
- defer d.Unlock()
- // Open real db connection if its the first call
- if d.db == nil {
- db, err := sql.Open(string(dialects.Postgres), d.dbURL)
- if err != nil {
- return nil, err
- }
- d.db = db
- }
- c, exists := d.conns[dsn]
- if !exists || !c.tryOpen() {
- tx, err := d.db.Begin()
- if err != nil {
- return nil, err
- }
- c = &conn{tx: tx, opened: 1, dsn: dsn}
- c.removeSelf = func() error {
- return d.deleteConn(c)
- }
- d.conns[dsn] = c
- }
- return c, nil
-}
-
-// deleteConn is called by a connection when it is closed via the `close` method.
-// It also auto-closes the DB when the last checked out connection is closed.
-func (d *txDriver) deleteConn(c *conn) error {
- // must lock here to avoid racing with Open
- d.Lock()
- defer d.Unlock()
-
- if d.conns[c.dsn] != c {
- return nil // already been replaced
- }
- delete(d.conns, c.dsn)
- if len(d.conns) == 0 && d.db != nil {
- if err := d.db.Close(); err != nil {
- return err
- }
- d.db = nil
- }
- return nil
-}
-
-type conn struct {
- sync.Mutex
- dsn string
- tx *sql.Tx // tx may be shared by many conns, definitive one lives in the map keyed by DSN on the txDriver. Do not modify from conn
- closed bool
- opened int
- removeSelf func() error
-}
-
-func (c *conn) Begin() (driver.Tx, error) {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- panic("conn is closed")
- }
- // Begin is a noop because the transaction was already opened
- return tx{c.tx}, nil
-}
-
-// Implement the "ConnBeginTx" interface
-func (c *conn) BeginTx(_ context.Context, opts driver.TxOptions) (driver.Tx, error) {
- // Context is ignored, because single transaction is shared by all callers, thus caller should not be able to
- // control it with local context
- return c.Begin()
-}
-
-// Prepare returns a prepared statement, bound to this connection.
-func (c *conn) Prepare(query string) (driver.Stmt, error) {
- return c.PrepareContext(context.Background(), query)
-}
-
-// Implement the "ConnPrepareContext" interface
-func (c *conn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- panic("conn is closed")
- }
-
- // TODO: Fix context handling
- // FIXME: It is not safe to give the passed in context to the tx directly
- // because the tx is shared by many conns and cancelling the context will
- // destroy the tx which can affect other conns
- st, err := c.tx.PrepareContext(context.Background(), query)
- if err != nil {
- return nil, err
- }
- return &stmt{st, c}, nil
-}
-
-// IsValid is called prior to placing the connection into the
-// connection pool by database/sql. The connection will be discarded if false is returned.
-func (c *conn) IsValid() bool {
- c.Lock()
- defer c.Unlock()
- return !c.closed
-}
-
-func (c *conn) ResetSession(ctx context.Context) error {
- // Ensure bad connections are reported: From database/sql/driver:
- // If a connection is never returned to the connection pool but immediately reused, then
- // ResetSession is called prior to reuse but IsValid is not called.
- c.Lock()
- defer c.Unlock()
- if c.closed {
- return driver.ErrBadConn
- }
-
- return nil
-}
-
-// pgx returns nil
-func (c *conn) CheckNamedValue(nv *driver.NamedValue) error {
- return nil
-}
-
-// Implement the "QueryerContext" interface
-func (c *conn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- panic("conn is closed")
- }
-
- // TODO: Fix context handling
- rs, err := c.tx.QueryContext(context.Background(), query, mapNamedArgs(args)...)
- if err != nil {
- return nil, err
- }
- defer rs.Close()
-
- return buildRows(rs)
-}
-
-// Implement the "ExecerContext" interface
-func (c *conn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- panic("conn is closed")
- }
- // TODO: Fix context handling
- return c.tx.ExecContext(context.Background(), query, mapNamedArgs(args)...)
-}
-
-// tryOpen attempts to increment the open count, but returns false if closed.
-func (c *conn) tryOpen() bool {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- return false
- }
- c.opened++
- return true
-}
-
-// Close invalidates and potentially stops any current
-// prepared statements and transactions, marking this
-// connection as no longer in use.
-//
-// Because the sql package maintains a free pool of
-// connections and only calls Close when there's a surplus of
-// idle connections, it shouldn't be necessary for drivers to
-// do their own connection caching.
-//
-// Drivers must ensure all network calls made by Close
-// do not block indefinitely (e.g. apply a timeout).
-func (c *conn) Close() (err error) {
- if !c.close() {
- return
- }
- // Wait to remove self to avoid nesting locks.
- if err := c.removeSelf(); err != nil {
- panic(err)
- }
- return
-}
-
-//nolint:revive
-func (c *conn) close() bool {
- c.Lock()
- defer c.Unlock()
- if c.closed {
- // Double close, should be a safe to make this a noop
- // PGX allows double close
- // See: https://github.com/jackc/pgx/blob/a457da8bffa4f90ad672fa093ee87f20cf06687b/conn.go#L249
- return false
- }
-
- c.opened--
- if c.opened > 0 {
- return false
- }
- if c.tx != nil {
- if err := c.tx.Rollback(); err != nil {
- panic(err)
- }
- c.tx = nil
- }
- c.closed = true
- return true
-}
-
-type tx struct {
- tx *sql.Tx
-}
-
-func (tx tx) Commit() error {
- // Commit is a noop because the transaction will be rolled back at the end
- return nil
-}
-
-func (tx tx) Rollback() error {
- // Rollback is a noop because the transaction will be rolled back at the end
- return nil
-}
-
-type stmt struct {
- st *sql.Stmt
- conn *conn
-}
-
-func (s stmt) Exec(args []driver.Value) (driver.Result, error) {
- s.conn.Lock()
- defer s.conn.Unlock()
- if s.conn.closed {
- panic("conn is closed")
- }
- return s.st.Exec(mapArgs(args)...)
-}
-
-// Implement the "StmtExecContext" interface
-func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) {
- s.conn.Lock()
- defer s.conn.Unlock()
- if s.conn.closed {
- panic("conn is closed")
- }
- // TODO: Fix context handling
- return s.st.ExecContext(context.Background(), mapNamedArgs(args)...)
-}
-
-func mapArgs(args []driver.Value) (res []interface{}) {
- res = make([]interface{}, len(args))
- for i := range args {
- res[i] = args[i]
- }
- return
-}
-
-func (s stmt) NumInput() int {
- return -1
-}
-
-func (s stmt) Query(args []driver.Value) (driver.Rows, error) {
- s.conn.Lock()
- defer s.conn.Unlock()
- if s.conn.closed {
- panic("conn is closed")
- }
- rows, err := s.st.Query(mapArgs(args)...)
- defer func() {
- err = multierr.Combine(err, rows.Close())
- }()
- if err != nil {
- return nil, err
- }
- return buildRows(rows)
-}
-
-// Implement the "StmtQueryContext" interface
-func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) {
- s.conn.Lock()
- defer s.conn.Unlock()
- if s.conn.closed {
- panic("conn is closed")
- }
- // TODO: Fix context handling
- rows, err := s.st.QueryContext(context.Background(), mapNamedArgs(args)...)
- if err != nil {
- return nil, err
- }
- return buildRows(rows)
-}
-
-func (s stmt) Close() error {
- s.conn.Lock()
- defer s.conn.Unlock()
- return s.st.Close()
-}
-
-func buildRows(r *sql.Rows) (driver.Rows, error) {
- set := &rowSets{}
- rs := &rows{}
- if err := rs.read(r); err != nil {
- return set, err
- }
- set.sets = append(set.sets, rs)
- for r.NextResultSet() {
- rss := &rows{}
- if err := rss.read(r); err != nil {
- return set, err
- }
- set.sets = append(set.sets, rss)
- }
- return set, nil
-}
-
-// Implement the "RowsNextResultSet" interface
-func (rs *rowSets) HasNextResultSet() bool {
- return rs.pos+1 < len(rs.sets)
-}
-
-// Implement the "RowsNextResultSet" interface
-func (rs *rowSets) NextResultSet() error {
- if !rs.HasNextResultSet() {
- return io.EOF
- }
-
- rs.pos++
- return nil
-}
-
-type rows struct {
- rows [][]driver.Value
- pos int
- cols []string
- colTypes []*sql.ColumnType
-}
-
-func (r *rows) Columns() []string {
- return r.cols
-}
-
-func (r *rows) ColumnTypeDatabaseTypeName(index int) string {
- return r.colTypes[index].DatabaseTypeName()
-}
-
-func (r *rows) Next(dest []driver.Value) error {
- r.pos++
- if r.pos > len(r.rows) {
- return io.EOF
- }
-
- for i, val := range r.rows[r.pos-1] {
- dest[i] = *(val.(*interface{}))
- }
-
- return nil
-}
-
-func (r *rows) Close() error {
- return nil
-}
-
-func (r *rows) read(rs *sql.Rows) error {
- var err error
- r.cols, err = rs.Columns()
- if err != nil {
- return err
- }
-
- r.colTypes, err = rs.ColumnTypes()
- if err != nil {
- return err
- }
-
- for rs.Next() {
- values := make([]interface{}, len(r.cols))
- for i := range values {
- values[i] = new(interface{})
- }
- if err := rs.Scan(values...); err != nil {
- return err
- }
- row := make([]driver.Value, len(r.cols))
- for i, v := range values {
- row[i] = driver.Value(v)
- }
- r.rows = append(r.rows, row)
- }
- return rs.Err()
-}
-
-type rowSets struct {
- sets []*rows
- pos int
-}
-
-func (rs *rowSets) Columns() []string {
- return rs.sets[rs.pos].cols
-}
-
-func (rs *rowSets) ColumnTypeDatabaseTypeName(index int) string {
- return rs.sets[rs.pos].ColumnTypeDatabaseTypeName(index)
-}
-
-func (rs *rowSets) Close() error {
- return nil
-}
-
-// advances to next row
-func (rs *rowSets) Next(dest []driver.Value) error {
- return rs.sets[rs.pos].Next(dest)
-}
-
-func mapNamedArgs(args []driver.NamedValue) (res []interface{}) {
- res = make([]interface{}, len(args))
- for i := range args {
- name := args[i].Name
- if name != "" {
- res[i] = sql.Named(name, args[i].Value)
- } else {
- res[i] = args[i].Value
- }
- }
- return
-}
diff --git a/internal/testdb/testdb.go b/internal/testdb/testdb.go
index 88251ae2c6f..1a52b1173e3 100644
--- a/internal/testdb/testdb.go
+++ b/internal/testdb/testdb.go
@@ -7,7 +7,7 @@ import (
"net/url"
"strings"
- "github.com/smartcontractkit/chainlink/v2/core/store/dialects"
+ pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg"
)
const (
@@ -33,7 +33,7 @@ func CreateOrReplace(parsed url.URL, suffix string, withTemplate bool) (string,
// Cannot drop test database if we are connected to it, so we must connect
// to a different one. 'postgres' should be present on all postgres installations
parsed.Path = "/postgres"
- db, err := sql.Open(string(dialects.Postgres), parsed.String())
+ db, err := sql.Open(string(pgcommon.Postgres), parsed.String())
if err != nil {
return "", fmt.Errorf("in order to drop the test database, we need to connect to a separate database"+
" called 'postgres'. But we are unable to open 'postgres' database: %+v\n", err)
@@ -66,7 +66,7 @@ func Drop(dbURL url.URL) error {
// Cannot drop test database if we are connected to it, so we must connect
// to a different one. 'postgres' should be present on all postgres installations
dbURL.Path = "/postgres"
- db, err := sql.Open(string(dialects.Postgres), dbURL.String())
+ db, err := sql.Open(string(pgcommon.Postgres), dbURL.String())
if err != nil {
return fmt.Errorf("in order to drop the test database, we need to connect to a separate database"+
" called 'postgres'. But we are unable to open 'postgres' database: %+v\n", err)
diff --git a/package.json b/package.json
index 67ad90e3e6d..8a0b5a3ed5d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "chainlink",
- "version": "2.18.0",
+ "version": "2.19.0",
"description": "node of the decentralized oracle network, bridging on and off-chain computation",
"main": "index.js",
"scripts": {
diff --git a/plugins/chainlink.Dockerfile b/plugins/chainlink.Dockerfile
index a17f5df3898..883aa83c9cf 100644
--- a/plugins/chainlink.Dockerfile
+++ b/plugins/chainlink.Dockerfile
@@ -12,12 +12,18 @@ RUN go mod download
# Env vars needed for chainlink build
ARG COMMIT_SHA
+# Flags for Go Delve debugger
+ARG GO_GCFLAGS
+
COPY . .
RUN apt-get update && apt-get install -y jq
+# Install Delve for debugging
+RUN go install github.com/go-delve/delve/cmd/dlv@latest
+
# Build the golang binaries
-RUN make install-chainlink
+RUN make GO_GCFLAGS="${GO_GCFLAGS}" install-chainlink
# Install medianpoc binary
RUN make install-medianpoc
@@ -52,6 +58,7 @@ WORKDIR /chainlink-starknet/relayer
COPY --from=buildgo /chainlink-starknet/relayer .
RUN go install ./pkg/chainlink/cmd/chainlink-starknet
+
# Final image: ubuntu with chainlink binary
FROM ubuntu:20.04
@@ -65,6 +72,9 @@ RUN curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
&& apt-get update && apt-get install -y postgresql-client-16 \
&& apt-get clean all
+# Copy Delve debugger from build stage
+COPY --from=buildgo /go/bin/dlv /usr/local/bin/dlv
+
COPY --from=buildgo /go/bin/chainlink /usr/local/bin/
COPY --from=buildgo /go/bin/chainlink-medianpoc /usr/local/bin/
COPY --from=buildgo /go/bin/chainlink-ocr3-capability /usr/local/bin/
diff --git a/plugins/registrar.go b/plugins/registrar.go
index 2a82f2a6204..8523d3980cc 100644
--- a/plugins/registrar.go
+++ b/plugins/registrar.go
@@ -6,7 +6,7 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/loop"
)
-// RegistrarConfig generates contains static configuration inher
+// RegistrarConfig generates contains static configuration
type RegistrarConfig interface {
RegisterLOOP(config CmdConfig) (func() *exec.Cmd, loop.GRPCOpts, error)
UnregisterLOOP(ID string)
diff --git a/testdata/scripts/chains/cosmos/help.txtar b/testdata/scripts/chains/cosmos/help.txtar
index edef6f7345c..4fe0a930ac0 100644
--- a/testdata/scripts/chains/cosmos/help.txtar
+++ b/testdata/scripts/chains/cosmos/help.txtar
@@ -3,13 +3,13 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink chains cosmos - Commands for handling Cosmos chains
+ chainlink chains cosmos - Commands for handling cosmos chains
USAGE:
chainlink chains cosmos command [command options] [arguments...]
COMMANDS:
- list List all existing Cosmos chains
+ list List all existing cosmos chains
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/chains/cosmos/list/help.txtar b/testdata/scripts/chains/cosmos/list/help.txtar
index 7e9be2efb00..d1f2d166374 100644
--- a/testdata/scripts/chains/cosmos/list/help.txtar
+++ b/testdata/scripts/chains/cosmos/list/help.txtar
@@ -3,7 +3,7 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink chains cosmos list - List all existing Cosmos chains
+ chainlink chains cosmos list - List all existing cosmos chains
USAGE:
chainlink chains cosmos list [arguments...]
diff --git a/testdata/scripts/chains/evm/help.txtar b/testdata/scripts/chains/evm/help.txtar
index e15dde5ecd2..b3e9e366810 100644
--- a/testdata/scripts/chains/evm/help.txtar
+++ b/testdata/scripts/chains/evm/help.txtar
@@ -3,13 +3,13 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink chains evm - Commands for handling EVM chains
+ chainlink chains evm - Commands for handling evm chains
USAGE:
chainlink chains evm command [command options] [arguments...]
COMMANDS:
- list List all existing EVM chains
+ list List all existing evm chains
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/chains/evm/list/help.txtar b/testdata/scripts/chains/evm/list/help.txtar
index 154ee110ad5..bb5eec199b7 100644
--- a/testdata/scripts/chains/evm/list/help.txtar
+++ b/testdata/scripts/chains/evm/list/help.txtar
@@ -3,7 +3,7 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink chains evm list - List all existing EVM chains
+ chainlink chains evm list - List all existing evm chains
USAGE:
chainlink chains evm list [arguments...]
diff --git a/testdata/scripts/chains/help.txtar b/testdata/scripts/chains/help.txtar
index 83a342925e1..ccfb54d2928 100644
--- a/testdata/scripts/chains/help.txtar
+++ b/testdata/scripts/chains/help.txtar
@@ -9,10 +9,11 @@ USAGE:
chainlink chains command [command options] [arguments...]
COMMANDS:
- evm Commands for handling EVM chains
- cosmos Commands for handling Cosmos chains
- solana Commands for handling Solana chains
- starknet Commands for handling StarkNet chains
+ aptos Commands for handling aptos chains
+ cosmos Commands for handling cosmos chains
+ evm Commands for handling evm chains
+ solana Commands for handling solana chains
+ starknet Commands for handling starknet chains
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/chains/solana/help.txtar b/testdata/scripts/chains/solana/help.txtar
index be3ab9b343b..ddc27fed18f 100644
--- a/testdata/scripts/chains/solana/help.txtar
+++ b/testdata/scripts/chains/solana/help.txtar
@@ -3,13 +3,13 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink chains solana - Commands for handling Solana chains
+ chainlink chains solana - Commands for handling solana chains
USAGE:
chainlink chains solana command [command options] [arguments...]
COMMANDS:
- list List all existing Solana chains
+ list List all existing solana chains
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/chains/solana/list/help.txtar b/testdata/scripts/chains/solana/list/help.txtar
index 794085d43d9..ed8a857529d 100644
--- a/testdata/scripts/chains/solana/list/help.txtar
+++ b/testdata/scripts/chains/solana/list/help.txtar
@@ -3,7 +3,7 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink chains solana list - List all existing Solana chains
+ chainlink chains solana list - List all existing solana chains
USAGE:
chainlink chains solana list [arguments...]
diff --git a/testdata/scripts/chains/starknet/help.txtar b/testdata/scripts/chains/starknet/help.txtar
index 992623d842c..5cb8fe93746 100644
--- a/testdata/scripts/chains/starknet/help.txtar
+++ b/testdata/scripts/chains/starknet/help.txtar
@@ -3,13 +3,13 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink chains starknet - Commands for handling StarkNet chains
+ chainlink chains starknet - Commands for handling starknet chains
USAGE:
chainlink chains starknet command [command options] [arguments...]
COMMANDS:
- list List all existing StarkNet chains
+ list List all existing starknet chains
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/chains/starknet/list/help.txtar b/testdata/scripts/chains/starknet/list/help.txtar
index 723318bf098..67315ce6c1e 100644
--- a/testdata/scripts/chains/starknet/list/help.txtar
+++ b/testdata/scripts/chains/starknet/list/help.txtar
@@ -3,7 +3,7 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink chains starknet list - List all existing StarkNet chains
+ chainlink chains starknet list - List all existing starknet chains
USAGE:
chainlink chains starknet list [arguments...]
diff --git a/testdata/scripts/help-all/help-all.txtar b/testdata/scripts/help-all/help-all.txtar
index 372b149bd19..078853ef6a5 100644
--- a/testdata/scripts/help-all/help-all.txtar
+++ b/testdata/scripts/help-all/help-all.txtar
@@ -24,14 +24,16 @@ bridges destroy # Destroys the Bridge for an External Adapter
bridges list # List all Bridges to External Adapters
bridges show # Show a Bridge's details
chains # Commands for handling chain configuration
-chains cosmos # Commands for handling Cosmos chains
-chains cosmos list # List all existing Cosmos chains
-chains evm # Commands for handling EVM chains
-chains evm list # List all existing EVM chains
-chains solana # Commands for handling Solana chains
-chains solana list # List all existing Solana chains
-chains starknet # Commands for handling StarkNet chains
-chains starknet list # List all existing StarkNet chains
+chains aptos # Commands for handling aptos chains
+chains aptos list # List all existing aptos chains
+chains cosmos # Commands for handling cosmos chains
+chains cosmos list # List all existing cosmos chains
+chains evm # Commands for handling evm chains
+chains evm list # List all existing evm chains
+chains solana # Commands for handling solana chains
+chains solana list # List all existing solana chains
+chains starknet # Commands for handling starknet chains
+chains starknet list # List all existing starknet chains
config # Commands for the node's configuration
config loglevel # Set log level
config logsql # Enable/disable SQL statement logging
@@ -132,14 +134,16 @@ node start # Run the Chainlink node
node status # Displays the health of various services running inside the node.
node validate # Validate the TOML configuration and secrets that are passed as flags to the `node` command. Prints the full effective configuration, with defaults included
nodes # Commands for handling node configuration
-nodes cosmos # Commands for handling Cosmos node configuration
-nodes cosmos list # List all existing Cosmos nodes
-nodes evm # Commands for handling EVM node configuration
-nodes evm list # List all existing EVM nodes
-nodes solana # Commands for handling Solana node configuration
-nodes solana list # List all existing Solana nodes
-nodes starknet # Commands for handling StarkNet node configuration
-nodes starknet list # List all existing StarkNet nodes
+nodes aptos # Commands for handling aptos node configuration
+nodes aptos list # List all existing aptos nodes
+nodes cosmos # Commands for handling cosmos node configuration
+nodes cosmos list # List all existing cosmos nodes
+nodes evm # Commands for handling evm node configuration
+nodes evm list # List all existing evm nodes
+nodes solana # Commands for handling solana node configuration
+nodes solana list # List all existing solana nodes
+nodes starknet # Commands for handling starknet node configuration
+nodes starknet list # List all existing starknet nodes
txs # Commands for handling transactions
txs cosmos # Commands for handling Cosmos transactions
txs cosmos create # Send of from node Cosmos account to destination .
diff --git a/testdata/scripts/node/validate/defaults-override.txtar b/testdata/scripts/node/validate/defaults-override.txtar
index 336f170bd1b..eaa8b9b2e43 100644
--- a/testdata/scripts/node/validate/defaults-override.txtar
+++ b/testdata/scripts/node/validate/defaults-override.txtar
@@ -393,6 +393,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '9m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
diff --git a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar
index 677058e1c08..8e632f7b23f 100644
--- a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar
+++ b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar
@@ -376,6 +376,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '9m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
diff --git a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar
index 0e5a78f4a39..cbe09179049 100644
--- a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar
+++ b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar
@@ -376,6 +376,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '9m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
diff --git a/testdata/scripts/node/validate/disk-based-logging.txtar b/testdata/scripts/node/validate/disk-based-logging.txtar
index 7fc05533a47..ed6d3d608d8 100644
--- a/testdata/scripts/node/validate/disk-based-logging.txtar
+++ b/testdata/scripts/node/validate/disk-based-logging.txtar
@@ -376,6 +376,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '9m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
diff --git a/testdata/scripts/node/validate/invalid.txtar b/testdata/scripts/node/validate/invalid.txtar
index b048af38a3b..f0882d0d24c 100644
--- a/testdata/scripts/node/validate/invalid.txtar
+++ b/testdata/scripts/node/validate/invalid.txtar
@@ -366,6 +366,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '9m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
diff --git a/testdata/scripts/node/validate/valid.txtar b/testdata/scripts/node/validate/valid.txtar
index bc84a9b2a37..f7278540745 100644
--- a/testdata/scripts/node/validate/valid.txtar
+++ b/testdata/scripts/node/validate/valid.txtar
@@ -373,6 +373,7 @@ FinalizedBlockOffset = 0
NoNewFinalizedHeadsThreshold = '9m0s'
[EVM.Transactions]
+Enabled = true
ForwardersEnabled = false
MaxInFlight = 16
MaxQueued = 250
diff --git a/testdata/scripts/nodes/cosmos/help.txtar b/testdata/scripts/nodes/cosmos/help.txtar
index b605e676f8c..78939331b6b 100644
--- a/testdata/scripts/nodes/cosmos/help.txtar
+++ b/testdata/scripts/nodes/cosmos/help.txtar
@@ -3,13 +3,13 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink nodes cosmos - Commands for handling Cosmos node configuration
+ chainlink nodes cosmos - Commands for handling cosmos node configuration
USAGE:
chainlink nodes cosmos command [command options] [arguments...]
COMMANDS:
- list List all existing Cosmos nodes
+ list List all existing cosmos nodes
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/nodes/cosmos/list/help.txtar b/testdata/scripts/nodes/cosmos/list/help.txtar
index c984b4f3e18..372693c704c 100644
--- a/testdata/scripts/nodes/cosmos/list/help.txtar
+++ b/testdata/scripts/nodes/cosmos/list/help.txtar
@@ -3,7 +3,7 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink nodes cosmos list - List all existing Cosmos nodes
+ chainlink nodes cosmos list - List all existing cosmos nodes
USAGE:
chainlink nodes cosmos list [arguments...]
diff --git a/testdata/scripts/nodes/evm/help.txtar b/testdata/scripts/nodes/evm/help.txtar
index dfc13eba9aa..5e9d9d482ab 100644
--- a/testdata/scripts/nodes/evm/help.txtar
+++ b/testdata/scripts/nodes/evm/help.txtar
@@ -3,13 +3,13 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink nodes evm - Commands for handling EVM node configuration
+ chainlink nodes evm - Commands for handling evm node configuration
USAGE:
chainlink nodes evm command [command options] [arguments...]
COMMANDS:
- list List all existing EVM nodes
+ list List all existing evm nodes
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/nodes/evm/list/help.txtar b/testdata/scripts/nodes/evm/list/help.txtar
index 62d3814823d..3ecfe32de40 100644
--- a/testdata/scripts/nodes/evm/list/help.txtar
+++ b/testdata/scripts/nodes/evm/list/help.txtar
@@ -3,7 +3,7 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink nodes evm list - List all existing EVM nodes
+ chainlink nodes evm list - List all existing evm nodes
USAGE:
chainlink nodes evm list [arguments...]
diff --git a/testdata/scripts/nodes/help.txtar b/testdata/scripts/nodes/help.txtar
index 8a8f31f4166..f9132045d29 100644
--- a/testdata/scripts/nodes/help.txtar
+++ b/testdata/scripts/nodes/help.txtar
@@ -9,10 +9,11 @@ USAGE:
chainlink nodes command [command options] [arguments...]
COMMANDS:
- evm Commands for handling EVM node configuration
- cosmos Commands for handling Cosmos node configuration
- solana Commands for handling Solana node configuration
- starknet Commands for handling StarkNet node configuration
+ aptos Commands for handling aptos node configuration
+ cosmos Commands for handling cosmos node configuration
+ evm Commands for handling evm node configuration
+ solana Commands for handling solana node configuration
+ starknet Commands for handling starknet node configuration
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/nodes/solana/help.txtar b/testdata/scripts/nodes/solana/help.txtar
index 8a0d3751ed7..3b10772e3e4 100644
--- a/testdata/scripts/nodes/solana/help.txtar
+++ b/testdata/scripts/nodes/solana/help.txtar
@@ -3,13 +3,13 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink nodes solana - Commands for handling Solana node configuration
+ chainlink nodes solana - Commands for handling solana node configuration
USAGE:
chainlink nodes solana command [command options] [arguments...]
COMMANDS:
- list List all existing Solana nodes
+ list List all existing solana nodes
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/nodes/solana/list/help.txtar b/testdata/scripts/nodes/solana/list/help.txtar
index 9cb124a84d8..29787c54d94 100644
--- a/testdata/scripts/nodes/solana/list/help.txtar
+++ b/testdata/scripts/nodes/solana/list/help.txtar
@@ -3,7 +3,7 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink nodes solana list - List all existing Solana nodes
+ chainlink nodes solana list - List all existing solana nodes
USAGE:
chainlink nodes solana list [arguments...]
diff --git a/testdata/scripts/nodes/starknet/help.txtar b/testdata/scripts/nodes/starknet/help.txtar
index bd0b11c6ec5..0ec3bc19730 100644
--- a/testdata/scripts/nodes/starknet/help.txtar
+++ b/testdata/scripts/nodes/starknet/help.txtar
@@ -3,13 +3,13 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink nodes starknet - Commands for handling StarkNet node configuration
+ chainlink nodes starknet - Commands for handling starknet node configuration
USAGE:
chainlink nodes starknet command [command options] [arguments...]
COMMANDS:
- list List all existing StarkNet nodes
+ list List all existing starknet nodes
OPTIONS:
--help, -h show help
diff --git a/testdata/scripts/nodes/starknet/list/help.txtar b/testdata/scripts/nodes/starknet/list/help.txtar
index e38b2ff8867..b4bbdf5ae76 100644
--- a/testdata/scripts/nodes/starknet/list/help.txtar
+++ b/testdata/scripts/nodes/starknet/list/help.txtar
@@ -3,7 +3,7 @@ cmp stdout out.txt
-- out.txt --
NAME:
- chainlink nodes starknet list - List all existing StarkNet nodes
+ chainlink nodes starknet list - List all existing starknet nodes
USAGE:
chainlink nodes starknet list [arguments...]
diff --git a/tools/bin/go_core_scripts_tests b/tools/bin/go_core_scripts_tests
new file mode 100755
index 00000000000..e4380264215
--- /dev/null
+++ b/tools/bin/go_core_scripts_tests
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+set -o pipefail
+set +e
+
+SCRIPT_PATH=`dirname "$0"`; SCRIPT_PATH=`eval "cd \"$SCRIPT_PATH\" && pwd"`
+OUTPUT_FILE=${OUTPUT_FILE:-"./output.txt"}
+EXTRA_FLAGS=""
+
+cd ./core/scripts || exit
+go mod download
+echo "Test execution results: ---------------------"
+echo ""
+
+if [[ $GITHUB_EVENT_NAME == "schedule" ]]; then
+ EXTRA_FLAGS="-covermode=atomic -coverpkg=./... -coverprofile=coverage.txt"
+fi
+go test ./... $EXTRA_FLAGS | tee $OUTPUT_FILE | grep -Ev '\[no test files\]|\[no tests to run\]'
+EXITCODE=${PIPESTATUS[0]}
+
+# Assert no known sensitive strings present in test logger output
+printf "\n----------------------------------------------\n\n"
+echo "Beginning check of output logs for sensitive strings"
+$SCRIPT_PATH/scrub_logs $OUTPUT_FILE
+cd ..
+if [[ $? != 0 ]]; then
+ exit 1
+fi
+
+echo "Exit code: $EXITCODE"
+if [[ $EXITCODE != 0 ]]; then
+ echo "Encountered test failures."
+else
+ echo "All tests passed!"
+fi
+echo "go_core_scripts_tests exiting with code $EXITCODE"
+exit $EXITCODE
diff --git a/tools/bin/go_core_tests b/tools/bin/go_core_tests
index 76c15fccd07..3679988a896 100755
--- a/tools/bin/go_core_tests
+++ b/tools/bin/go_core_tests
@@ -29,4 +29,4 @@ else
echo "All tests passed!"
fi
echo "go_core_tests exiting with code $EXITCODE"
-exit $EXITCODE
+exit $EXITCODE
\ No newline at end of file